【2013-11-10】Android应用开发笔记:使用Messenger与Service通讯
[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2013-11-10| 标题:Android应用开发笔记:使用Messenger与Service通讯|分类:编程 / android |标签:android·service·messenger
Android应用开发笔记:使用Messenger与Service通讯
- Messenger 使用步骤
- MainActivity
- MessengerService
- 备注
Messenger 是一种用于 Activity 与 Service 双向通讯的方式,可通过两种构造函数创建(参考 Android SDK):
- 通过
onServiceConnected的IBinder参数构造 - 通过本地
Handler构造
Messenger 使用步骤
- Activity 和 Service 各自声明两个 Messenger:一个通过本地 Handler 构造,另一个初始为 null。
- Activity 与 Service 绑定后,Activity 通过
onServiceConnected的参数构造指向 Service 的 Messenger。 - Activity 向 Service 发送消息时,将本地 Messenger 作为
replyTo字段附带,Service 保存后即可反向通讯。
GitHub:https://github.com/cstriker1407/android/tree/master/MessengerService
MainActivity
publicclassMainActivityextendsActivity{privateclassActivityHandlerextendsHandler{@OverridepublicvoidhandleMessage(Messagemsg){Log.d("activity",msg.toString());}}privateMessengermServiceMessenger=null;privateMessengermActivityMessenger=newMessenger(newActivityHandler());privateServiceConnectionmConnection=newServiceConnection(){publicvoidonServiceConnected(ComponentNameclassName,IBinderservice){mServiceMessenger=newMessenger(service);MessagemsgToService=newMessage();msgToService.replyTo=mActivityMessenger;msgToService.obj="this is from activity";try{mServiceMessenger.send(msgToService);}catch(RemoteExceptione){e.printStackTrace();}}publicvoidonServiceDisconnected(ComponentNameclassName){mServiceMessenger=null;}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@OverrideprotectedvoidonStart(){super.onStart();bindService(newIntent(this,MessengerService.class),mConnection,Context.BIND_AUTO_CREATE);}@OverrideprotectedvoidonStop(){super.onStop();unbindService(mConnection);}}MessengerService
publicclassMessengerServiceextendsService{privateclassServiceHandlerextendsHandler{@OverridepublicvoidhandleMessage(Messagemsg){Log.d("Service",msg.toString());mActivityMessenger=msg.replyTo;MessagemsgToAct=newMessage();msgToAct.obj="this is from service";try{mActivityMessenger.send(msgToAct);}catch(RemoteExceptione){e.printStackTrace();}}}privateMessengermServiceMessenger=newMessenger(newServiceHandler());privateMessengermActivityMessenger=null;@OverridepublicIBinderonBind(Intentintent){Toast.makeText(getApplicationContext(),"binding",Toast.LENGTH_SHORT).show();returnmServiceMessenger.getBinder();}}备注
- Messenger 支持跨进程通讯,可以替代 AIDL(未经测试)。
- Messenger 的明显优势:Service 可通过
replyTo字段直接回调 Activity,无需 AIDL 接口。
