您的位置:首页 > 大数据 > 人工智能

Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

2014-11-05 02:25 549 查看
通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

步骤:

服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。

新建一个服务端(Service)

package com.example.service_messenges;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.widget.Toast;

public class MessengesService extends Service {

public static final int SAY_MSG = 0x1;
// 创建一个信使对象,并绑定信使处理器,由信使处理器来处理
private Messenger m = new Messenger(new InComingHandler());

// 用来操作msg的handler
@SuppressLint("HandlerLeak")
class InComingHandler extends Handler {

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SAY_MSG:
String name = msg.obj.toString();
Toast.makeText(MessengesService.this, "我是" + name + ",我为自己带盐",
Toast.LENGTH_SHORT).show();
// 当我需要返回一个值的时候就再写一个信件给信使

Message m = Message.obtain();
m.what = SAY_MSG;
m.obj = "我是" + name + ",我为自己带盐";
try {
msg.replyTo.send(m);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;

default:
break;
}

}

}

// 绑定m
@Override
public IBinder onBind(Intent arg0) {
return m.getBinder();
}

}


然后在清单文件中进行注册

<service android:name="com.example.service_messenges.MessengesService"></service>


接着在客户端中

package com.example.service_messenges;

import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

private Messenger m;
private boolean mBound = false;
private EditText et;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.editText1);
}
private Handler handler=new Handler(){
public void handleMessage(Message msg){
switch (msg.what) {
case MessengesService.SAY_MSG:
String info="这是传递来的→"+msg.obj.toString();
Toast.makeText(MainActivity.this, info,Toast.LENGTH_SHORT).show();
break;
default:
break;
}
};
};
private Messenger mReplyTo = new Messenger(handler);

public void msgClick(View v) {
// 这样的效率高
Message msg = Message.obtain();
msg.what = MessengesService.SAY_MSG;
String name = et.getText().toString();
msg.obj = name;
msg.replyTo=mReplyTo;
try {
m.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}

}

private ServiceConnection conn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName arg0) {
// 这里是失败了
mBound = false;
m = null;
}

@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// 这里是成功了

m = new Messenger(arg1);
}
};

@Override
protected void onStart() {
super.onStart();

Intent intent = new Intent(this, MessengesService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
mBound = true;
}

@Override
protected void onStop() {
super.onStop();

if (mBound) {
mBound = false;
unbindService(conn);
}
}

}


总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面

   通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: