<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] 官方文檔:[https://developer.android.com/guide/components/bound-services?hl=zh-cn](https://developer.android.com/guide/components/bound-services?hl=zh-cn) # 使用 Messenger的使用示例如下: Server端: ```java // MessengerService.java public class MessengerService extends Service { private static final String TAG = "MessengerService"; private static class MessengerHandler extends Handler { @Override public void handleMessage(@NonNull Message msg) { switch (msg.what) { case MyConstants.MSG_FROM_CLIENT: Log.i(TAG, "handleMessage: " + msg.getData().getString("msg")); Messenger client = msg.replyTo; Message replyMessage = Message.obtain(null, MyConstants.MSF_FROM_SERVICE); Bundle bundle = new Bundle(); bundle.putString("reply", "I has receive your msg"); replyMessage.setData(bundle); try { client.send(replyMessage); } catch (RemoteException e) { e.printStackTrace(); } break; default: super.handleMessage(msg); } } } private final Messenger mMessenger = new Messenger(new MessengerHandler()); @Nullable @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } } ``` Client端: ```java // MessengerActivity.java public class MessengerActivity extends AppCompatActivity { private static final String TAG = "MessengerActivity"; private Messenger mService; private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); Message message = Message.obtain(null, MyConstants.MSG_FROM_CLIENT); Bundle data = new Bundle(); data.putString("msg", "hello, this is client"); message.setData(data); message.replyTo = mGetReplyMessenger; try { mService.send(message); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler { @Override public void handleMessage(@NonNull Message msg) { switch (msg.what) { case MyConstants.MSF_FROM_SERVICE: Log.i(TAG, "handleMessage: " + msg.getData().getString("reply")); break; default: break; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); Intent intent = new Intent(this, MessengerService.class); bindService(intent, mServiceConnection, BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); unbindService(mServiceConnection); } } ``` # 源碼分析 在Service中,根據Handler創建一個Messenger對象;然后的onBind方法中,返回的Binder對象是Messenger對象的getBinder()方法。首先從Messenger類看起: ```java // Messenger.java public final class Messenger implements Parcelable { private final IMessenger mTarget; public Messenger(Handler target) { mTarget = target.getIMessenger(); } public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target); } public void send(Message message) throws RemoteException { mTarget.send(message); } public IBinder getBinder() { return mTarget.asBinder(); } // Parcelable序列化實現 //... } ``` Messenger只有一個成員變量,是IMessenger類型的mTarget。構造方法有如下兩種重載: ```java // Messenger.java // 構造方法1 public Messenger(Handler target) { mTarget = target.getIMessenger(); } // 構造方法2 public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target); } ``` 其中,方法1適用于在Service中根據Handler構造Messenger;方法2適用于在Client中從IBinder對象生成Messenger。 ## Service中實現 ```java // MessengerService.java private final Messenger mMessenger = new Messenger(new MessengerHandler()); @Nullable @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } ``` 其中Messenger構造方法如下: ```java // Messenger.java public Messenger(Handler target) { mTarget = target.getIMessenger(); } ``` 調用Handler對象的getIMessenger方法來為成員變量mTarget進行賦值: ```java // Handler.java IMessenger mMessenger; final IMessenger getIMessenger() { synchronized (mQueue) { if (mMessenger != null) { return mMessenger; } mMessenger = new MessengerImpl(); return mMessenger; } } ``` ```java // Handler.java#MessengerImpl private final class MessengerImpl extends IMessenger.Stub { public void send(Message msg) { msg.sendingUid = Binder.getCallingUid(); Handler.this.sendMessage(msg); } } ``` 其中MessengerImpl是IMessenger.Stub的實現類。 * Handler中IMessenger類型的成員變量mMessenger,就是Messenger中的IMessenger類型的成員變量mTarget,也是整個跨進程調用中最重要的對象。 * 在Service的onBind方法中調用Messenger對象的getBinder方法獲得mTarget跨進程傳遞。 * 在Client中,拿到IBinder對象后,根據IBinder創建出Messenger對象,當調用Messenger對象的send方法時,其實調用的就是Service中Handler的sendMessage方法。 ***** 方法2中,參數是IBinder對象時,調用IMessenger.Stub的asInterface方法獲得遠程對象。IMessenger的AIDL文件聲明如下: ```plain // IMessenger.aidl package android.os; import android.os.Message; oneway interface IMessenger { void send(in Message msg); } ``` ## Client中實現 在Client中拿到IBinder對象后,調用Messenger的構造方法2獲得Messenger對象: ```java // Messenger.java public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target); } ``` 調用Messenger的send方法發送消息: ```java // MessengerActivity.java(Client類) mService.send(message); ``` ```java public void send(Message message) throws RemoteException { mTarget.send(message); } ``` mTarget即IMessenger的實現為: ```java // Handler.java#MessengerImpl private final class MessengerImpl extends IMessenger.Stub { public void send(Message msg) { msg.sendingUid = Binder.getCallingUid(); Handler.this.sendMessage(msg); } } ``` 可以看到,調用了Service中的Handler的sendMessage方法。 ## 總結 可以看到,Messenger對AIDL進行了封裝,我們在整個使用中對于AIDL是無感的,只需要使用Messenger這個信使來進行消息的傳遞即可。關鍵思路如下: 1、Messenger類擁有一個重要的成員變量mTarget,是IMessenger類型的 2、Handler中擁有IMessenger類的默認實現,在Service中創建一個Handler,然后從Handler中獲取IMessenger實現,賦值給新創建的Messenger 4、Service的onBind方法中返回的IBinder對象,其實就是Messenger的成員變量mTarget 5、Client的onServiceConnected方法中,拿到IBinder對象后,根據IBinder對象創建一個Messenger對象,IBinder對象的主要作用是初始化了Messenger類的mTarget成員變量 6、Client需要跨進程調用時,調用Client中Messenger對象的send方法,實際上是調用了mTarget的send方法,默認實現在Service的Handler中,也就是調用Handler發送消息。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看