使用android中的AIDL让Service与Activity通信(service回调activity)

这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法
代码:

首先建立一个ICallback.aidl文件,作为Activity中的回调方法

Java代码 收藏代码
  1. packagecom.zhang.test.service;
  2. interfaceICallback{
  3. voidshowResult(intresult);
  4. }

然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder
注意:aidl中import不能写com.xxx.*,要写全类的路径

Java代码 收藏代码
  1. packagecom.zhang.test.service;
  2. importcom.zhang.test.service.ICallback;
  3. interfaceIService{
  4. voidregisterCallback(ICallbackcb);
  5. voidunregisterCallback(ICallbackcb);
  6. }
接下来是service:
MainService.java

Java代码 收藏代码
  1. packagecom.zhang.test.service;
  2. importandroid.app.Service;
  3. importandroid.content.Intent;
  4. importandroid.os.Handler;
  5. importandroid.os.IBinder;
  6. importandroid.os.Message;
  7. importandroid.os.RemoteCallbackList;
  8. importandroid.os.RemoteException;
  9. importandroid.util.Log;
  10. publicclassMainServiceextendsService{
  11. privatestaticfinalStringTAG="MainService";
  12. privateRemoteCallbackList<icallback>mCallbacks=newRemoteCallbackList<icallback>();
  13. privateIService.StubmBinder=newIService.Stub(){
  14. @Override
  15. publicvoidunregisterCallback(ICallbackcb){
  16. if(cb!=null){
  17. mCallbacks.unregister(cb);
  18. }
  19. }
  20. @Override
  21. publicvoidregisterCallback(ICallbackcb){
  22. if(cb!=null){
  23. mCallbacks.register(cb);
  24. }
  25. }
  26. };
  27. @Override
  28. publicIBinderonBind(Intentintent){
  29. Log.d(TAG,"onBind");
  30. returnmBinder;
  31. }
  32. @Override
  33. publicvoidonCreate(){
  34. Log.d(TAG,"onCreate");
  35. //这里不知道为什么,直接使用callback方法回调showResult
  36. //mCallbacks.beginBroadcast()是0,需要用handler延迟1000毫秒
  37. //也许是在activity中binService太耗时的原因?
  38. mHandler.sendEmptyMessageDelayed(0,1000);
  39. super.onCreate();
  40. }
  41. @Override
  42. publicvoidonDestroy(){
  43. mHandler.removeMessages(0);
  44. mCallbacks.kill();
  45. super.onDestroy();
  46. }
  47. privatevoidcallBack(){
  48. intN=mCallbacks.beginBroadcast();
  49. try{
  50. for(inti=0;i<N;i++){
  51. mCallbacks.getBroadcastItem(i).showResult(i);
  52. }
  53. }catch(RemoteExceptione){
  54. Log.e(TAG,"",e);
  55. }
  56. mCallbacks.finishBroadcast();
  57. }
  58. privateHandlermHandler=newHandler(){
  59. @Override
  60. publicvoidhandleMessage(Messagemsg){
  61. callBack();
  62. super.handleMessage(msg);
  63. }
  64. };
  65. }
  66. </icallback></icallback>
然后是activity:


Java代码 收藏代码
  1. packagecom.zhang.test;
  2. importandroid.app.Activity;
  3. importandroid.content.ComponentName;
  4. importandroid.content.Context;
  5. importandroid.content.Intent;
  6. importandroid.content.ServiceConnection;
  7. importandroid.os.Bundle;
  8. importandroid.os.IBinder;
  9. importandroid.os.RemoteException;
  10. importandroid.util.Log;
  11. importcom.zhang.test.service.ICallback;
  12. importcom.zhang.test.service.IService;
  13. importcom.zhang.test.service.MainService;
  14. publicclassMainActivityextendsActivity{
  15. privatestaticfinalStringTAG="MainActivity";
  16. privateIServicemService;
  17. /**Calledwhentheactivityisfirstcreated.*/
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. Intenti=newIntent(this,MainService.class);
  23. bindService(i,mConnection,Context.BIND_AUTO_CREATE);
  24. }
  25. @Override
  26. protectedvoidonDestroy(){
  27. if(mService!=null){
  28. try{
  29. mService.unregisterCallback(mCallback);
  30. }catch(RemoteExceptione){
  31. Log.e(TAG,"",e);
  32. }
  33. }
  34. //destroy的时候不要忘记unbindService
  35. unbindService(mConnection);
  36. super.onDestroy();
  37. }
  38. /**
  39. *service的回调方法
  40. */
  41. privateICallback.StubmCallback=newICallback.Stub(){
  42. @Override
  43. publicvoidshowResult(intresult){
  44. Log.d(TAG,"result:"+result);
  45. }
  46. };
  47. /**
  48. *注册connection
  49. */
  50. privateServiceConnectionmConnection=newServiceConnection(){
  51. @Override
  52. publicvoidonServiceDisconnected(ComponentNamename){
  53. Log.d(TAG,"onServiceDisconnected");
  54. mService=null;
  55. }
  56. @Override
  57. publicvoidonServiceConnected(ComponentNamename,IBinderservice){
  58. Log.d(TAG,"onServiceConnected");
  59. mService=IService.Stub.asInterface(service);
  60. try{
  61. mService.registerCallback(mCallback);
  62. }catch(RemoteExceptione){
  63. Log.e(TAG,"",e);
  64. }
  65. }
  66. };
  67. }
最后不要忘记在manifest中加上service标记:


Html代码 收藏代码
  1. <serviceandroid:name=".service.MainService">
  2. </service>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值