`

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

 
阅读更多

在AIDL中让Service调用Activity的方法
代码:
首先建立一个ICallback.aidl文件,作为Activity中的回调方法

 

1 package com.zhang.test.service;
2
3 interface ICallback {
4 void showResult(int result);
5 }

 

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

 

1 package com.zhang.test.service;
2
3 import com.zhang.test.service.ICallback;
4
5 interface IService {
6 void registerCallback(ICallback cb);
7 void unregisterCallback(ICallback cb);
8 }

 

接下来是service:
MainService.java

 

1 package com.zhang.test.service;
2
3 import android.app.Service;
4 import android.content.Intent;
5 import android.os.Handler;
6 import android.os.IBinder;
7 import android.os.Message;
8 import android.os.RemoteCallbackList;
9 import android.os.RemoteException;
10 import android.util.Log;
11
12 public class MainService extends Service {
13
14 private static final String TAG = "MainService";
15
16 private RemoteCallbackList<icallback> mCallbacks = new RemoteCallbackList<icallback>();
17
18 private IService.Stub mBinder = new IService.Stub() {
19
20 @Override
21 public void unregisterCallback(ICallback cb){
22 if(cb != null) {
23 mCallbacks.unregister(cb);
24 }
25 }
26
27 @Override
28 public void registerCallback(ICallback cb){
29 if(cb != null) {
30 mCallbacks.register(cb);
31 }
32 }
33 };
34
35 @Override
36 public IBinder onBind(Intent intent) {
37 Log.d(TAG, "onBind");
38 return mBinder;
39 }
40
41 @Override
42 public void onCreate() {
43 Log.d(TAG, "onCreate");
44 //这里不知道为什么,直接使用callback方法回调showResult
45 //mCallbacks.beginBroadcast()是0,需要用handler延迟1000毫秒
46 //也许是在activity中binService太耗时的原因?
47   mHandler.sendEmptyMessageDelayed(0, 1000);
48 super.onCreate();
49 }
50
51 @Override
52 public void onDestroy() {
53 mHandler.removeMessages(0);
54 mCallbacks.kill();
55 super.onDestroy();
56 }
57
58 private void callBack() {
59 int N = mCallbacks.beginBroadcast();
60 try {
61 for (int i = 0; i < N; i++) {
62 mCallbacks.getBroadcastItem(i).showResult(i);
63 }
64 } catch (RemoteException e) {
65 Log.e(TAG, "", e);
66 }
67 mCallbacks.finishBroadcast();
68 }
69
70 private Handler mHandler = new Handler() {
71
72 @Override
73 public void handleMessage(Message msg) {
74 callBack();
75 super.handleMessage(msg);
76 }
77 };
78 }
79 </icallback></icallback>

 

然后是activity:

 

1 package com.zhang.test;
2
3 import android.app.Activity;
4 import android.content.ComponentName;
5 import android.content.Context;
6 import android.content.Intent;
7 import android.content.ServiceConnection;
8 import android.os.Bundle;
9 import android.os.IBinder;
10 import android.os.RemoteException;
11 import android.util.Log;
12
13 import com.zhang.test.service.ICallback;
14 import com.zhang.test.service.IService;
15 import com.zhang.test.service.MainService;
16
17 public class MainActivity extends Activity {
18
19 private static final String TAG = "MainActivity";
20
21 private IService mService;
22
23 /** Called when the activity is first created. */
24 @Override
25 public void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.main);
28 Intent i = new Intent(this, MainService.class);
29 bindService(i, mConnection, Context.BIND_AUTO_CREATE);
30 }
31
32 @Override
33 protected void onDestroy() {
34 if(mService!=null){
35 try {
36 mService.unregisterCallback(mCallback);
37 } catch (RemoteException e) {
38 Log.e(TAG, "", e);
39 }
40 }
41 //destroy的时候不要忘记unbindService
42   unbindService(mConnection);
43 super.onDestroy();
44 }
45
46 /**
47 * service的回调方法
48 */
49 private ICallback.Stub mCallback = new ICallback.Stub() {
50
51 @Override
52 public void showResult(int result) {
53 Log.d(TAG, " result : " + result);
54 }
55 };
56
57 /**
58 * 注册connection
59 */
60 private ServiceConnection mConnection = new ServiceConnection() {
61
62 @Override
63 public void onServiceDisconnected(ComponentName name) {
64 Log.d(TAG, "onServiceDisconnected");
65 mService = null;
66 }
67
68 @Override
69 public void onServiceConnected(ComponentName name, IBinder service) {
70 Log.d(TAG, "onServiceConnected");
71 mService = IService.Stub.asInterface(service);
72 try {
73 mService.registerCallback(mCallback);
74 } catch (RemoteException e) {
75 Log.e(TAG, "", e);
76 }
77 }
78 };
79 }

 

最后不要忘记在manifest中加上service标记:

 

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

总结:
通过aidl总算实现了Service与Activity的通信,写起来麻烦点,使用诸如ContentProvider,Broadcast等也可以实现.
这样做很像是在使用MVC设计模式(Activity负责View,Service以及其他类负责 Model,aidl(ServiceConnection)负责Controller)

分享到:
评论

相关推荐

    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