Android bound service 詳解三:使用Messenger

來源:互聯網
上載者:User

如果你需要你的service與遠程進程通訊,那麼你可以使用一個Messenger來為你的service提供介面.此技術使用不必使用AIDL就能執行處理序間通訊(IPC).

  下面是如何使用Messenger的概要:

  • service實現一個接收從用戶端的每個調用引起的回調的Handler.

  • Handler被用來建立一個Messenger對象(它是Handler的一個引用).

  • Messenger建立一個從service的onBind()返回給用戶端的IBinder.

  • 用戶端使用IBinder來執行個體化這個Messenger(它引用到service的Handler),用戶端用它來向service發送Message.

  • service在它的Handler中接收每個訊息—具體的,是在handleMessage()方法中.

  這此方式下,service中沒有能讓用戶端調用的方法,用戶端傳送的是service在它的Handler中接收的"訊息"(Message對象).

下面是一個service使用Messenger介面的例子:

public class MessengerService extends Service {<br /> /** 讓service 顯示一個訊息的命令 */<br /> static final int MSG_SAY_HELLO = 1;</p><p> /**<br /> * 處理從用戶端來的訊息.<br /> */<br /> class IncomingHandler extends Handler {<br /> @Override<br /> public void handleMessage(Message msg) {<br /> switch (msg.what) {<br /> case MSG_SAY_HELLO:<br /> Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();<br /> break;<br /> default:<br /> super.handleMessage(msg);<br /> }<br /> }<br /> }</p><p> /**<br /> * 我們發布給用戶端使它能向IncomingHandler 發送訊息的的對象<br /> */<br /> final Messenger mMessenger = new Messenger(new IncomingHandler());</p><p> /**<br /> * 當綁定到service,我們返回指向我們的messenger的介面<br /> */<br /> @Override<br /> public IBinder onBind(Intent intent) {<br /> Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();<br /> return mMessenger.getBinder();<br /> }<br />}<br />


注意Handler中的handleMessage()方法是service接收訊息並進行處理的地方.

  用戶端所有要做的事就是建立一個基於service返回的IBinder的Messenger對象並且使用它的send()發送一個訊息.如,下面是一個actvity綁定到service並且傳送MSG_SAY_HELLO命令給service的例子:

public class ActivityMessenger extends Activity {<br /> /** 與service通訊的Messenger */<br /> Messenger mService = null;</p><p> /** 表明我們是否已綁定到service的標記 */<br /> boolean mBound;</p><p> /**<br /> *與service的主介面互動的類<br /> */<br /> private ServiceConnection mConnection = new ServiceConnection() {<br /> public void onServiceConnected(ComponentName className, IBinder service) {<br /> // 當與service的串連已經建立時被調用.給了我們可以用來<br /> //與service互動的對象.我們正在使用一個Messenger與service通訊,<br /> // 所以在這裡我們從原始IBinder 對象擷取一個用戶端的Messenger的代表<br /> mService = new Messenger(service);<br /> mBound = true;<br /> }</p><p> public void onServiceDisconnected(ComponentName className) {<br /> // 當與service的串連意外斷開時被調用-- 也就是,service的進程崩潰了<br /> mService = null;<br /> mBound = false;<br /> }<br /> };</p><p> public void sayHello(View v) {<br /> if (!mBound) return;<br /> // 建立並發送一個訊息給service<br /> Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);<br /> try {<br /> mService.send(msg);<br /> } catch (RemoteException e) {<br /> e.printStackTrace();<br /> }<br /> }</p><p> @Override<br /> protected void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> }</p><p> @Override<br /> protected void onStart() {<br /> super.onStart();<br /> // 綁定到service<br /> bindService(new Intent(this, MessengerService.class), mConnection,<br /> Context.BIND_AUTO_CREATE);<br /> }</p><p> @Override<br /> protected void onStop() {<br /> super.onStop();<br /> // Unbind from the service<br /> if (mBound) {<br /> unbindService(mConnection);<br /> mBound = false;<br /> }<br /> }<br />}

注意這個例子沒有示範service如何回應用戶端.如果你想讓service回應用戶端,那麼你需要在用戶端也建立一個Messanger.然後當用戶端接收到onServiceConnected()回調時,它發送一個息給service,這個訊息包含了用戶端的Messenger對象,它作為send()方法的replyTo參數.

比較 AIDL

  當你需要執行IPC時,為你的介面使用一個Messenger比使用AIDL實現它簡單,因為Messenger把所有對service的調用入隊列,一個純AIDL介面並行發送請求到service,這樣就必須用多線程來處理了.

  對於大多數應用,service不需使用多線程,所以使用一個Messenger允許service在一個時刻只處理一個請求.如果使用多線程對你的service很重要,那麼你應使用AIDL來定義你的介面.



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.