利用Handler實現Activity和Service之間通訊
阿新 • • 發佈:2019-02-16
Activity和Service之間通訊,最簡單的方式就是通過broadcast廣播來實現,但針對一些頻繁的資料傳輸,用廣播來實現,效能上會降低很多,例如:更新下載進度等
接下來介紹下handler來代替broadcast來實現Activity和Service之間通訊,這樣效能會高些。
中心思想是將Handler包裝在Messenger物件裡,利用Messenger來發送訊息,然後在相應介面用handler來接受此訊息
1,Service向Activity傳遞資料
(1) 在Service的onBind裡實例messenger物件,並把handler包裝進去,並將此messenger返回,程式碼如下:
@Override
public IBinder onBind(Intent intent) {
// 建立Messenger物件包含handler引用
Messenger messenger = new Messenger(handler);
// 返回Messenger的binder
return messenger.getBinder();
}
(2) 在Activity中通過bindService來開啟service
// 繫結service Intent sIntent = new Intent(this, DownService.class); bindService(sIntent, conn, Service.BIND_AUTO_CREATE);
在ServiceConnection中來接受Service傳過來的messenger,通過onServiceConnected的第二個引數service來例項化Messenger,即為service中傳遞過來的messenger
然後通過該serviceMassenger來,來發送Message,再後Service中的handler就會接受到這個Message了private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { // 獲取service中的messenger serviceMessenger = new Messenger(service); } };
傳送程式碼如下:
// 使用service中的messenger來發送訊息
try {
Message msg = new Message();
msg.what = DownService.MSG_BIND;
serviceMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
2,Activity向Service傳遞資料
(1) 可以在Activity的onServiceConnected方法中例項Activity的Messenger,然後再將Activity中的handler包裝在Messenger中,建立Message將replyTo屬性指向給Activity的Messenger,最後再通過Service的Messenger來將此Messenger傳遞給Service ,程式碼如下
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 獲取service中的messenger
serviceMessenger = new Messenger(service);
// 建立Activity中的messenger
Messenger messenger = new Messenger(mHandler);
// 建立訊息
Message msg = new Message();
msg.what = DownService.MSG_BIND;
msg.replyTo = messenger;
// 使用service中的messenger傳送Activity中的messenger
try {
serviceMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
(2) 在Service中,通過handler,將Activity傳過來的messenger接受即可。通過傳過來的activityMessenger來進行發訊息即可完成通訊
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
FileEntity fileEntity = null;
switch (msg.what) {
case MSG_BIND:
// 接受來自Activity的messenger
activityMessenger = msg.replyTo;
break;
default:
break;
}
};
};
以上是Activity和Service之間通過Handler通訊步驟,歡迎交流探討哈。