Android Messenger进程间双向通信详解
2016-12-03 15:58
453 查看
Android Messenger进程间双向通信详解
在实现Messenger通信之前,我们先要完成一个前提条件:将一个组件通过调用bindService()绑定到服务上。这是将组件绑定到服务上我们要做的事情:
http://blog.csdn.net/q296264785/article/details/53418534
要把客户端绑定到服务上,你必须:
—————————————-我是分割线,下面开始数据通信—————————-
通过以上步骤,我们完成了对Service的绷定,接下来就可以实现数据通信了,为了容易理解,我们先来实现单向通信:Activity向Service发送数据,这里有官方API提出的要实现通信我们需要做的事情:
先来编写Service的实现类,阅读上面五点,需要服务实现的是:1、2、3、5点。
到这里,我们需要在Service中做的事情就全部做完了。接下来是Activity需要做的事情:
到这里我们就完成了Activity对Service的单向通信,双向通信和单向通信原理基本一样。
先从发送端开始(Service),在Service中我们要添加一段发送数据的代码:
我们需要在Activity中再写入一段数据接收的代码,代码和刚才在Service中的接收代码基本一致
d3c9
,接收端Activity:
全部源码:
布局文件只需要一个Button
MainActivity:
MService:
http://blog.csdn.net/q296264785/article/details/53418534
在实现Messenger通信之前,我们先要完成一个前提条件:将一个组件通过调用bindService()绑定到服务上。这是将组件绑定到服务上我们要做的事情:
http://blog.csdn.net/q296264785/article/details/53418534
要把客户端绑定到服务上,你必须:
1、实现ServiceConnection。 你的实现代码必须重写两个回调方法: onServiceConnected() 系统调用该方法来传递服务的onBind()方法所返回的IBinder。 onServiceDisconnected() 当与服务的联接发生意外中断时,比如服务崩溃或者被杀死时,Android系统将会调用该方法。客户端解除绑定时,不会调用该方法。
private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub } };
2、调用bindService(),传入已实现的ServiceConnection。
@Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Intent intent = new Intent(this, MService.class); bindService(intent, conn, IBinder.LAST_CALL_TRANSACTION); }
3、当系统调用你的onServiceConnected()回调方法时,你可以利用接口中定义的方法开始对服务的调用。 4、要断开与服务的联接,请调用unbindService()。
—————————————-我是分割线,下面开始数据通信—————————-
通过以上步骤,我们完成了对Service的绷定,接下来就可以实现数据通信了,为了容易理解,我们先来实现单向通信:Activity向Service发送数据,这里有官方API提出的要实现通信我们需要做的事情:
1、服务实现一个Handler ,用于客户端每次调用时接收回调。 2、此Handler用于创建一个Messenger对象(它是一个对Handler的引用)。 3、此Messenger对象创建一个IBinder,服务在onBind()中把它返回给客户端。 4、客户端用IBinder将Messenger(引用服务的Handler)实例化,客户端用它向服务发送消息对象Message。 5、服务接收Handler中的每个消息Message——确切的说,是在handleMessage()方法中接收。
先来编写Service的实现类,阅读上面五点,需要服务实现的是:1、2、3、5点。
//1、服务实现一个Handler ,用于客户端每次调用时接收回调。 class MHandler extends Handler {}
//2、此Handler用于创建一个Messenger对象(它是一个对Handler的引用)。 Messenger messenger = new Messenger(new MHandler());
//3、此Messenger对象创建一个IBinder,服务在onBind()中把它返回给客户端。 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return messenger.getBinder(); }
//5、服务接收Handler中的每个消息Message——确切的说,是在handleMessage()方法中接收。 class MHandler extends Handler { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); if (msg.what == 1) { System.out.println("--从Activity接受到的数据->>" + msg.getData().getString("NUM")); //Toast打印数据 Toast.makeText(getApplicationContext(), "接收到数据", 1).show(); } } }
到这里,我们需要在Service中做的事情就全部做完了。接下来是Activity需要做的事情:
//4、客户端用IBinder将Messenger(引用服务的Handler)实例化 private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { messenger = new Messenger(service); } }; //客户端用它(messenger )向服务发送消息对象Message。 Message message = Message.obtain(null, 1); //获得消息载体 Bundle data = new Bundle(); data.putString("NUM", "Activity信使"); message.setData(data);//写入数据 try { messenger.send(message);//发送数据 } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); }
到这里我们就完成了Activity对Service的单向通信,双向通信和单向通信原理基本一样。
先从发送端开始(Service),在Service中我们要添加一段发送数据的代码:
// 1、通过msg.replyTo获得Activity中message.replyTo = replyMessenger赋值的Messenger。 Messenger messenger1 = msg.replyTo; Message message = Message.obtain(null, 2); // 2、获得一个Message,写入需要传递的数据。 Bundle data = new Bundle(); data.putString("NUM", "Service信使"); message.setData(data); try { messenger1.send(message);// 3、发送数据 } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); }
我们需要在Activity中再写入一段数据接收的代码,代码和刚才在Service中的接收代码基本一致
d3c9
,接收端Activity:
private Messenger replyMessenger = new Messenger(new Handler() {// 1、创建一个Handler实现并且通过这个实现创建一个Messenger的实现 public void handleMessage(Message msg) { switch (msg.what) { case 2: // 获取信息内容并Toast Toast.makeText(MainActivity.this, msg.getData().getString("NUM"), 0).show();// 3、获取Service传递过来的值 break; default: break; } }; });
message.replyTo = replyMessenger;// 2、将1获得的实现传递给replyTo
全部源码:
布局文件只需要一个Button
<Button android:id="@+id/MSG_button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button2" android:layout_centerHorizontal="true" android:layout_marginTop="40dp" android:text="向Service发送数据" />
MainActivity:
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private Messenger messenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.MSG_button1).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Message message = Message.obtain(null, 1);
Bundle data = new Bundle();
data.putString("NUM", "Activity信使");
message.setData(data);
// -------------
message.replyTo = replyMessenger;// 2、将1获得的实现传递给replyTo
try {
messenger.send(message);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private Messenger replyMessenger = new Messenger(new Handler() {// 1、创建一个Handler实现并且通过这个实现创建一个Messenger的实现 public void handleMessage(Message msg) { switch (msg.what) { case 2: // 获取信息内容并Toast Toast.makeText(MainActivity.this, msg.getData().getString("NUM"), 0).show();// 3、获取Service传递过来的值 break; default: break; } }; });
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Intent intent = new Intent(this, MService.class);
bindService(intent, conn, IBinder.LAST_CALL_TRANSACTION);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
messenger = new Messenger(service);
}
};
}
MService:
import android.app.Service;
import android.content.Intent;
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.widget.Toast;
public class MService extends Service {
class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if (msg.what == 1) {
System.out.println("--从Activity接受到的数据->>"
+ msg.getData().getString("NUM"));
Toast.makeText(getApplicationContext(), "接收到数据", 1).show();
// ----------------------------------------------
// 1、通过msg.replyTo获得Activity中message.replyTo = replyMessenger赋值的Messenger。 Messenger messenger1 = msg.replyTo; Message message = Message.obtain(null, 2); // 2、获得一个Message,写入需要传递的数据。 Bundle data = new Bundle(); data.putString("NUM", "Service信使"); message.setData(data); try { messenger1.send(message);// 3、发送数据 } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); }
}
}
}
Messenger messenger = new Messenger(new MHandler());
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return messenger.getBinder();
}
}
http://blog.csdn.net/q296264785/article/details/53418534
相关文章推荐
- Android 跨进程双向通信(Messenger与AIDL)详解
- Android中通过Messenger与Service实现进程间双向通信
- Android进程通信之Messenger和AIDL使用详解
- Android进程通信之Messenger&AIDL使用详解
- Android Service进程间双向通信之Messenger(系列4)
- Android中通过Messenger与Service实现进程间双向通信
- Android Service进程间双向通信之Messenger(系列4)
- Android使用Messenger实现进程间双向通信
- Android进程通信之Messenger&AIDL使用详解
- Android Service进程间双向通信之Messenger(系列4)
- Android跨进程通信-AIDL详解示例(client+server)
- Android Messenger简单的跨进程通信
- Android 跨进程通信--Messenger
- Android中跨进程通信方式之使用Messenger
- Android基础——Messenger在跨进程通信中的使用
- Android Messenger 跨进程通信
- Android开发学习之Service详解三,Android跨进程通信
- Linux与android进程间的通信及android Binder机制详解
- Android IPC机制利用Messenger实现跨进程通信
- android进程通信之Messenger