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

📅 2026/7/10 23:16:21
【2013-11-10】Android应用开发笔记:使用Messenger与Service通讯
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2013-11-10 标题Android应用开发笔记使用Messenger与Service通讯分类编程 / android 标签android·service·messengerAndroid应用开发笔记使用Messenger与Service通讯Messenger 使用步骤MainActivityMessengerService备注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 保存后即可反向通讯。GitHubhttps://github.com/cstriker1407/android/tree/master/MessengerServiceMainActivitypublicclassMainActivityextendsActivity{privateclassActivityHandlerextendsHandler{OverridepublicvoidhandleMessage(Messagemsg){Log.d(activity,msg.toString());}}privateMessengermServiceMessengernull;privateMessengermActivityMessengernewMessenger(newActivityHandler());privateServiceConnectionmConnectionnewServiceConnection(){publicvoidonServiceConnected(ComponentNameclassName,IBinderservice){mServiceMessengernewMessenger(service);MessagemsgToServicenewMessage();msgToService.replyTomActivityMessenger;msgToService.objthis is from activity;try{mServiceMessenger.send(msgToService);}catch(RemoteExceptione){e.printStackTrace();}}publicvoidonServiceDisconnected(ComponentNameclassName){mServiceMessengernull;}};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);}}MessengerServicepublicclassMessengerServiceextendsService{privateclassServiceHandlerextendsHandler{OverridepublicvoidhandleMessage(Messagemsg){Log.d(Service,msg.toString());mActivityMessengermsg.replyTo;MessagemsgToActnewMessage();msgToAct.objthis is from service;try{mActivityMessenger.send(msgToAct);}catch(RemoteExceptione){e.printStackTrace();}}}privateMessengermServiceMessengernewMessenger(newServiceHandler());privateMessengermActivityMessengernull;OverridepublicIBinderonBind(Intentintent){Toast.makeText(getApplicationContext(),binding,Toast.LENGTH_SHORT).show();returnmServiceMessenger.getBinder();}}备注Messenger 支持跨进程通讯可以替代 AIDL未经测试。Messenger 的明显优势Service 可通过replyTo字段直接回调 Activity无需 AIDL 接口。