1. 程式人生 > >利用Handler實現Activity和Service之間通訊

利用Handler實現Activity和Service之間通訊

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
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);			
		}
	};
然後通過該serviceMassenger來,來發送Message,再後Service中的handler就會接受到這個Message了

傳送程式碼如下:

// 使用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通訊步驟,歡迎交流探討哈。