【2013-11-10】Android应用开发笔记:使用Messenger与Service通讯

📅 2026/7/10 23:19:40 👁️ 阅读次数 📝 编程学习
【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):

  • 通过onServiceConnectedIBinder参数构造
  • 通过本地Handler构造

Messenger 使用步骤

  1. Activity 和 Service 各自声明两个 Messenger:一个通过本地 Handler 构造,另一个初始为 null。
  2. Activity 与 Service 绑定后,Activity 通过onServiceConnected的参数构造指向 Service 的 Messenger。
  3. 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 接口。