`
java-mans
  • 浏览: 12016178 次
文章分类
社区版块
存档分类
最新评论

使用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>

分享到:
评论

相关推荐

    Activity中使用AIDL让Service与Activity通信

    本文将深入探讨如何在Activity中使用AIDL来让Service与Activity进行通信。 首先,我们需要了解AIDL的基本概念。AIDL是一种特殊的接口定义语言,它允许Android系统生成必要的Java绑定类和代理对象,以便在不同的进程...

    AIDL Demo源码实现Activity与Service进程间通信

    6. **在Activity中使用Service**: Activity需要获取Service的IBinder接口,然后通过这个接口调用Service中的方法。首先,通过`bindService`方法连接到Service,然后在回调的`onServiceConnected`方法中,你可以...

    aidl双向通信,Service加回调刷新自身Activity

    标题“aidl双向通信,Service加回调刷新自身Activity”涉及了两个关键概念:AIDL的双向通信以及通过Service回调更新Activity。 首先,让我们深入理解AIDL。AIDL是用来定义接口的,这些接口可以让一个Android进程...

    Activity和Service生命周期及使用AIDL通信实例备份

    本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...

    Activity与远程Service通信,使用AIDL

    在Android开发中,Activity与Service之间的通信是应用中常见的需求,尤其当Service运行在远程进程中时,这种通信机制显得尤为重要。AIDL(Android Interface Definition Language)是Android提供的一种接口定义语言...

    进程内Activity和service使用Binder通信代码备份

    3. Activity绑定Service并使用Binder:在Activity中,我们可以通过bindService()方法绑定到Service,并在onServiceConnected()回调中获取到Binder对象。之后就可以调用Service中定义的方法了。 ```java public ...

    Android Studio AIDL实现跨进程通信

    本篇文章将深入探讨如何在Android Studio中使用AIDL来实现跨进程通信。 首先,我们需要理解AIDL的基本概念。AIDL是一种接口定义语言,它允许开发者声明服务端提供的接口,客户端通过这些接口调用服务端的方法,实现...

    android中aidl的使用

    在Android系统中,AIDL(Android Interface Definition Language)是用于定义跨进程通信(IPC, Interprocess Communication)接口的一种语言。通过AIDL,开发者可以创建服务(Service),使得其他应用程序组件能够与...

    android中activity和service的交互

    - 连接成功后的操作:在`ServiceConnection`的`onServiceConnected()`回调中,我们可以获取到Service的Binder对象,从而调用Service的方法。 - 解绑Service:当不再需要与Service交互时,记得调用`unbindService()...

    Android安卓AIDL进程间通信Service简单例子

    AIDL(Android Interface Definition Language)是Android提供的一种工具,用于支持跨进程调用,让服务(Service)可以在不同的进程中运行并与其他应用进行交互。本教程将通过一个简单的例子来讲解如何使用AIDL实现...

    安卓Service和AIDL使用示例代码

    本示例代码将探讨如何在Android应用中使用Service和AIDL。 1. **Service基础** - **Service生命周期**:Service有其特定的生命周期,包括onCreate(), onStartCommand(), onBind(), onRebind(), onUnbind(), 和 ...

    Android Aidl

    AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,交换数据,即使它们运行在不同的进程中。在“Aidldemo”中,我们可以看到一个服务端(AIDLServer)和客户端(AIDLClient)的示例,这是...

    安卓开发观察者模式应用-一个service通知多个activity更新ui的实现

    总之,观察者模式在Android开发中扮演着重要的角色,尤其在Service与Activity的交互中,能够优雅地处理数据变化的传播,提高代码的可读性和可维护性。在"ObservableDemo"项目中,我们可以通过阅读和分析源码,更深入...

    android aidl dome下载

    5. 绑定服务:在客户端,使用bindService()方法连接服务,然后在回调中获取服务接口实例。 6. 调用服务:通过接口实例调用服务端的方法,进行跨进程通信。 示例: ```aidl package com.example.aidldemo; // 声明...

    android aidl源码实例

    在这个实例中,`onServiceConnected`回调中,我们通过`Stub.asInterface(service)`获取到服务端的接口实现,然后就可以调用`sendMessage`和`receiveMessage`了。如果在调用过程中发生异常,通常是因为进程间的通信...

    android开发使用aidl进行跨进程通信demo

    通过这个AIDL_DEMO,我们可以学习到如何在Android应用中使用AIDL实现进程间通信。这不仅适用于简单数据传递,还可以处理更复杂的对象交互,是Android开发中不可或缺的一部分。在实际项目中,根据需求灵活运用AIDL,...

    (原创)使用aidl进程间通讯并开启独立进程的服务仿下载监听回调等场景

    总结来说,AIDL是Android中实现进程间通信的有效工具,特别是当需要在独立进程中运行服务并进行回调时。通过定义接口、实现接口、设置服务进程以及绑定服务,我们可以创建出高效且稳定的跨进程通信解决方案。在实际...

    浅析aidl过程和绑定service的过程(不会使用的撤).zip

    在Android系统中,AIDL(Android Interface Definition Language)和Service是两个重要的组件,它们分别用于进程间通信(IPC,Inter-Process Communication)和后台服务执行。本篇文章将深入探讨AIDL的工作原理以及...

Global site tag (gtag.js) - Google Analytics