Service和Activity通讯的3种常用方式示例(三)

2014-11-24 00:38:41 · 作者: · 浏览: 3
if(cb != null) { mCallbacks.register(cb); } } @Override public void unregisterCallback(ICallBack cb) throws RemoteException { if(cb != null) { mCallbacks.unregister(cb); } } @Override public void startDownload() throws RemoteException { Log.d("","startDownLoad() inBinder-->"); new Thread(new Runnable() { public void run() { while(progress < MAX_PROGRESS){ progress += 5; Log.d("","startDownLoad() run-->"); //进度发生变化通知调用方 if(mHandler != null){ //TODO mHandler.sendEmptyMessage(progress); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }; /** * 进度条的最大值 */ public static final int MAX_PROGRESS = 100; /** * 进度条的进度值 */ private int progress = 0; /** * 更新进度的回调接口 */ private String TAG = "UseHandlerService"; /** * 增加get()方法,供Activity调用 * @return 下载进度 */ public int getProgress() { return progress; } @Override public void onCreate() { super.onCreate(); //mHandler.sendEmptyMessageDelayed(0, 1000); Log.d(TAG, "onCreate() executed"); } private void callBack(Message msg) { int N = mCallbacks.beginBroadcast(); try { for (int i = 0; i < N; i++) { Log.d("","mCallbacks -->progress"+msg.what); mCallbacks.getBroadcastItem(i).showResult(msg.what); } } catch (RemoteException e) { Log.e(TAG, "", e); } mCallbacks.finishBroadcast(); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { callBack(msg); super.handleMessage(msg); } }; @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand() executed"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy() executed"); } /** * 返回一个Binder对象 */ @Override public IBinder onBind(Intent intent) { return mBinder; } } 还有两个AIDL文件 package com.banking.hello; interface ICallBack { void showResult(int result); } package com.banking.hello; import com.banking.hello.ICallBack; interface MyAIDLService { void registerCallback(ICallBack cb); void unregisterCallback(ICallBack cb); void startDownload(); } 这种方式,无论Service是否是remote,都可以实现高效率通讯。

(3)第三种通过Receiver非常简单,就不上代码了。
sendBroadCast,然后在Activity中注册一个相对应的内部receiver接受就可以了.

查看工程