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