使用android中的AIDL让Service与Activity通信(service回调activity)
来源:互联网 发布:网络奇兵2剧情 编辑:程序博客网 时间:2024/05/20 21:58
这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法
代码:
然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder
注意:aidl中import不能写com.xxx.*,要写全类的路径
MainService.java
代码:
首先建立一个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>
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- [实例教程]使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity互相通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- 使用android中的AIDL让Service与Activity通信
- Activity中使用AIDL让Service与Activity通信
- Android组件---Service,AIDL,Service与Activity之间的通信
- Service与Activity通信与AIDL
- android activity与service通信
- Android Activity与Service通信
- Android service与Activity通信
- android activity 与service通信
- Android service 与 activity通信
- Android 中ContentProvider 和 ContentResolver使用入门
- Delphi 屏蔽系统的Ctrl+Alt+Del
- unix环境高级编程-文件读取,同步机制
- 《UNIX网络编程 卷一》第2章:各网络协议的用途
- 后ERP时代的业务数据治理
- 使用android中的AIDL让Service与Activity通信(service回调activity)
- Android 多媒体开发相关技巧
- 系统设计与工具
- C与C++常见函数
- MFC程序中让窗口不能移动、最大化、最小化,禁止系统菜单
- Java服务器 dm Server
- 还有个全等于啊
- 如何查询visual studio 2005中堆栈使用
- JavaScript正则表达式