Activity和Service跨程式通訊的兩種方式

weixin_34116110發表於2016-05-14

一、基於系統級的廣播BroadCastReceiver
此種方法實現簡單,但消耗系統資源比較多,大致實現流程如下:

// 【1】Activity啟動Service
Intent intent = new Intent(mContext, DownloadService.class);
intent.setAction(DownloadService.ACTION_START);
mContext.startService(intent);

// 【2】Service在onStartCommand()方法中處理初始邏輯
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
        // 獲得Activity傳來的引數
        if (ACTION_START.equals(intent.getAction())) {
                  //啟動
        } else if (ACTION_STOP.equals(intent.getAction())) {
                  //停止
        }
        return super.onStartCommand(intent, flags, startId);
}

// 【3】Service傳送更新廣播給Activity
Intent intent = new Intent(DownloadService.ACTION_UPDATE);
mContext.sendBroadcast(intent);

// 【4】Activity實現廣播
BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(android.content.Context context, Intent intent) {
    if (DownloadService.ACTION_UPDATE.equals(intent.getAction())) {
        // 更新進度 
    } 
};

// 【5】Activity註冊廣播接收資訊
IntentFilter filter = new IntentFilter();
filter.addAction(DownloadService.ACTION_START);
filter.addAction(DownloadService.ACTION_UPDATE);
filter.addAction(DownloadService.ACTION_FINISH);
registerReceiver(mReceiver, filter);

二、使用Messenger實現Handler傳遞
此種方法實現較前者複雜,但此種方式比較高效。
首先,我們來比較一下幾種跨程式通訊方式的適用場景:

AIDL:IPC、多應用程式、多執行緒
Binder:IPC、多應用程式
Messenger:IPC

此處筆者為了簡單起見,只介紹Messenger實現Handler傳遞,過程如下:
【1】在Service中建立SMessenger包含SHandler引用
【2】在onBind方法中返回SMessenger

@Override
public IBinder onBind(Intent intent) {
        // 建立一個Messenger物件,包括Handler的引用
        Messenger messenger = new Messenger(mHandler);
        // 返回Messenger的Binder
        return messenger.getBinder();
}

【3】Activity繫結Service,獲得Service的SMessenger
【4】Activity中建立AMessenger包括AHandler引用
【5】使用Service的SMessenger傳送訊息給Service的SHandler,資訊包括Activity的AMessenger,同理,Service通過相同的方式可傳送訊息給Activity

ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            // 獲得Service中的Messenger
            mServiceMessenger = new Messenger(binder);
            // 建立Activity中的Messenger
            Messenger messenger = new Messenger(mHandler);
            // 建立訊息
            Message msg = new Message();
            msg.what = DownloadService.MSG_BIND;
            msg.replyTo = messenger;
            // 使用Service的Messenger傳送Activity中的Messenger
            try {
                mServiceMessenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
};

相關文章