`
fulerbakesi
  • 浏览: 562138 次
文章分类
社区版块
存档分类
最新评论

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

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

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

package com.zhang.test.service;

     interface ICallback {
     void showResult(int result);
     }

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

package com.zhang.test.service;
 
     import com.zhang.test.service.ICallback;
 
     interface IService {
             void registerCallback(ICallback cb);
             void unregisterCallback(ICallback cb);
     }
接下来是service:
MainService.java

package com.zhang.test.service;
 
      import android.app.Service;
      import android.content.Intent;
      import android.os.Handler;
      import android.os.IBinder;
      import android.os.Message;
      import android.os.RemoteCallbackList;
      import android.os.RemoteException;
     import android.util.Log;
 
     public class MainService extends Service {
 
         private static final String TAG = "MainService";
 
         private RemoteCallbackList<icallback> mCallbacks = new RemoteCallbackList<icallback>();
 
         private IService.Stub mBinder = new IService.Stub() {
 
             @Override
             public void unregisterCallback(ICallback cb){
                 if(cb != null) {
                     mCallbacks.unregister(cb);
                }
             }
 
             @Override
             public void registerCallback(ICallback cb){
                 if(cb != null) {
                     mCallbacks.register(cb);
                 }
             }
         };
 
         @Override
         public IBinder onBind(Intent intent) {
            Log.d(TAG, "onBind");
            return mBinder;
       }
 
         @Override
         public void onCreate() {
             Log.d(TAG, "onCreate");
             //这里不知道为什么,直接使用callback方法回调showResult
             //mCallbacks.beginBroadcast()是0,需要用handler延迟1000毫秒
             //也许是在activity中binService太耗时的原因?
              mHandler.sendEmptyMessageDelayed(0, 1000);
             super.onCreate();
         }
 
         @Override
         public void onDestroy() {
             mHandler.removeMessages(0);
             mCallbacks.kill();
             super.onDestroy();
         }
 
         private void callBack() {
             int N = mCallbacks.beginBroadcast();
             try {
                 for (int i = 0; i < N; i++) {
                     mCallbacks.getBroadcastItem(i).showResult(i);
                 }
             } catch (RemoteException e) {
                 Log.e(TAG, "", e);
             }
             mCallbacks.finishBroadcast();
         }
 
         private Handler mHandler = new Handler() {
 
             @Override
             public void handleMessage(Message msg) {
                 callBack();
                 super.handleMessage(msg);
            }
         };
     }
     </icallback></icallback>
然后是activity:


package com.zhang.test;
 
     import android.app.Activity;
     import android.content.ComponentName;
     import android.content.Context;
     import android.content.Intent;
     import android.content.ServiceConnection;
     import android.os.Bundle;
     import android.os.IBinder;
     import android.os.RemoteException;
     import android.util.Log;
 
     import com.zhang.test.service.ICallback;
     import com.zhang.test.service.IService;
     import com.zhang.test.service.MainService;

     public class MainActivity extends Activity {
 
         private static final String TAG = "MainActivity";
 
         private IService mService;
 
         /** Called when the activity is first created. */
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main);
             Intent i = new Intent(this, MainService.class);
             bindService(i, mConnection, Context.BIND_AUTO_CREATE);
         }
 
         @Override
         protected void onDestroy() {
             if(mService!=null){
                try {
                    mService.unregisterCallback(mCallback);
                 } catch (RemoteException e) {
                     Log.e(TAG, "", e);
                 }
             }
             //destroy的时候不要忘记unbindService
              unbindService(mConnection);
             super.onDestroy();
         }
 
         /**
          * service的回调方法
          */
         private ICallback.Stub mCallback = new ICallback.Stub() {
 
             @Override
             public void showResult(int result) {
                 Log.d(TAG, " result : " + result);
             }
         };

         /**
          * 注册connection
          */
         private ServiceConnection mConnection = new ServiceConnection() {
 
             @Override
             public void onServiceDisconnected(ComponentName name) {
                 Log.d(TAG, "onServiceDisconnected");
                 mService = null;
             }
 
             @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                 Log.d(TAG, "onServiceConnected");
                 mService = IService.Stub.asInterface(service);
                 try {
                     mService.registerCallback(mCallback);
                 } catch (RemoteException e) {
                     Log.e(TAG, "", e);
                 }
             }
         };
     }
最后不要忘记在manifest中加上service标记:


<service android:name=".service.MainService">
</service>


分享到:
评论

相关推荐

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

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

    疯狂Android讲义源码

     12.3.1 在Android应用中使用  OpenGL ES 454  12.3.2 绘制平面上的多边形 457  12.3.3 旋转 463  12.4 绘制3D图形 465  12.4.1 构建3D图形 465  12.4.2 应用纹理贴图 469  12.5 本章小结 475  第13章 ...

    服务通信方案总结

    一共有两个项目,一个项目充当服务端,使用aidl进程通信控制另一个项目,播放音乐,其中还包括Activity和Service之间的通信方案,Parcel绑定和接口回调……

    疯狂Android讲义.part2

    12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...

    疯狂Android讲义.part1

    12.3.1 在Android应用中使用 OpenGL ES 454 12.3.2 绘制平面上的多边形 457 12.3.3 旋转 463 12.4 绘制3D图形 465 12.4.1 构建3D图形 465 12.4.2 应用纹理贴图 469 12.5 本章小结 475 第13章 Android的网络应用 476 ...

    Android 添加系统服务的方法详解

    除了添加基本系统服务, 其中还包含添加JNI部分代码和App通过AIDL调用的演示Demo, 调用包含App调用服务端, 也包含服务端回调App, 也就是完成一个简单的双向通信. 注: 测试代码基于Android 7.1.1, 其他Android版本都...

    Android实例代码

    第10章、Service与BroadcastReceiver 10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDL...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    第10章、Service与BroadcastReceiver 10.1、Service:Service的创建、配置、启动、停止、绑定和通信; Service的生命周期; 10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDL...

    精通ANDROID 3(中文版)1/2

    13.2.6 响应handleMessage回调  13.3 使用工作线程  13.3.1 从菜单调用工作线程  13.3.2 在工作线程与主线程之间通信  13.3.3 线程行为概述  13.4 处理程序示例驱动程序类  13.4.1 驱动程序活动文件  ...

    精通Android 3 (中文版)2/2

    13.2.6 响应handleMessage回调  13.3 使用工作线程  13.3.1 从菜单调用工作线程  13.3.2 在工作线程与主线程之间通信  13.3.3 线程行为概述  13.4 处理程序示例驱动程序类  13.4.1 驱动程序活动文件  ...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--回调函数的定义 |--图片之BitMap、Drawable、inputStream及byte[] 互转 |--图片之保存图片至SD卡 |--图片之删除40%最近没有被使用的 |--图片之的本地缓存至SD卡 |--图片之网络异步下载图片 |--图片之获取SD卡所有...

Global site tag (gtag.js) - Google Analytics