您的位置:首页 > 移动开发 > Android开发

进程间通信Messenger的简单使用

2017-07-26 17:21 316 查看
一般进程间通信都是通过aidl实现,但是一些简单的就不需要aidl了,太麻烦了,需要写好多文件和接口。安卓提供了api,就是Messenger,简单说下使用方法吧。

一般分为客户端和服务端两块,一般客户端就是负责发起一个任务的,而服务端就是负责这个任务的具体业务逻辑的执行。比如我需要两个数的求和,那么客户端就负责将这个需求发送到服务端,由服务端去做两个数求和这样一个业务逻辑处理。

先贴下服务端的代码,服务端一般就是一个Service,在其中实现onBind方法并将Messenger的IBinder对象提供出去。

public class MessengerService extends Service
{

private Messenger messenger = new Messenger(new Handler()
{
@Override
public void handleMessage(Message msg)
{
Message message = Message.obtain(msg);
switch (msg.what)
{
//收到客户端的请求求和的消息
case 1:
try
{
message.arg2 = message.arg1 + message.arg2;
message.replyTo.send(message);
}
catch (RemoteException e)
{
e.printStackTrace();
}

break;

}

super.handleMessage(msg);
}
});

@Nullable
@Override
public IBinder onBind(Intent intent)
{
//返回messenger的binder对象
return messenger.getBinder();
}


代码段中圈红的代码就是表示将结果发送给服务端,onBind方法必须返回Messenger的IBinder对象。

这里注意Manifest中注册的有个exported属性必须置为true,表示你注册的Service可以被外部引用和绑定。

<service
android:name=".messenger.MessengerService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.zhy.aidl.calc"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
下面看下客户端部分的代码,就两个部分,一个是绑定我们上面的MessengerService,还有一个就是做求和的操作。

public class MessengerActivity extends Activity {

private Messenger messengerService;

private Messenger messenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
//通知更新ui
break;
}

super.handleMessage(msg);
}
});

private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messengerService = new Messenger(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
messengerService = null;
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
bindService();
try {
getSum(2, 4);
} catch (RemoteException e) {
e.printStackTrace();
}

}

private void bindService() {
Intent intent = new Intent();
//必须显式调用,注意类名要全,前面跟上包名
intent.setComponent(new ComponentName("包名", "类名"));
bindService(intent, conn, BIND_AUTO_CREATE);
}

/**
* 客户端发起的求和操作
*/
private void getSum(int a, int b) throws RemoteException {
Message msg = new Message();
msg.what = 1;
msg.arg1 = a;
msg.arg2 = b;
msg.replyTo = messenger;
messengerService.send(msg);

}


注意圈红部分的代码就可以了,我们把message replyTo给我们new出的messenger后就可以在handlerMessage的回调方法中获取求和后的结果了,就是MessengerService中的message.arg2的值了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息