最近在查找资料时,发现了一个一直没有注意的知识点,通过Messenger来进行通讯,这里简单的备份下。
Messenger有两个构造函数,参考androidsdk【 http://developer.android.com/reference/android/os/Messenger.html 】
因此,可以通过onServiceConnected的返回值构造,也可以通过handler构造。
CONTENTS
个人总结的Messenger的使用步骤如下:
1)Activity和Service中各自声明两个Messenger,其中一个Messenger通过本地的handler构造,另一个为NULL。
2)Activity和Service绑定后,Activity可以通过onServiceConnected的参数构造第二个Messenger。
3)绑定后,Activity向Service发送消息,消息中将本地的Messenger送给Service来保存。
说起来比较绕,代码如下:
github:
【 https://github.com/cstriker1407/android/tree/master/MessengerService 】
MainActivity:
public class MainActivity extends Activity { private class ActivityHandler extends Handler { @Override public void handleMessage(Message msg) { Log.d("activity", msg.toString()); } } private Messenger mServiceMessenger = null; private Messenger mActivityMessenger = new Messenger(new ActivityHandler()); private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mServiceMessenger = new Messenger(service); Message msgToService = new Message(); msgToService.replyTo = mActivityMessenger; msgToService.obj = "this is from activiyt"; try { mServiceMessenger.send(msgToService); } catch (RemoteException e) { e.printStackTrace(); } } public void onServiceDisconnected(ComponentName className) { mServiceMessenger = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); // 绑定到service bindService(new Intent(this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); unbindService(mConnection); } }
MessengerService:
public class MessengerService extends Service { private class ServiceHandler extends Handler { @Override public void handleMessage(Message msg) { Log.d("Service", msg.toString()); mActivityMessenger = msg.replyTo; Message msgToAct = new Message(); msgToAct.obj = "this is from service"; try { mActivityMessenger.send(msgToAct); } catch (RemoteException e) { e.printStackTrace(); } } } private Messenger mServiceMessenger = new Messenger(new ServiceHandler()); private Messenger mActivityMessenger = null; @Override public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mServiceMessenger.getBinder(); } }
备注:
1)Messenger可以支持跨进程通讯,也就是说可以替代AIDL,这一点作者没有测试过。
2)Messenger有个明显的好处,Service可以通过Messenger发送消息直接和Activity通讯。
发表评论