<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # RPC是什么 RPC即Remote Procedure Call(遠程過程調用)是一種計算機通信協議,為我們定義了計算機C中的程序如何調用另外一臺計算機S的程序,讓程序員不需要操心底層網絡協議,使得開發包括網絡分布式多程序在內的應用程序更加容易。 RPC 是典型的**Client/Server 模式**,由客戶端對服務器發出若干請求,服務器收到后根據客戶端提供的參數進行操作,然后將執行結果返回給客戶端。 # IDL是什么 RPC 只是一種協議,規定了通信的規則。在實際工作中客戶端與服務端會有各種各樣的平臺,就好像日常開發一樣,為了統一處理不同的實現,需要定義一個共同的接口,于是有了 IDL。 IDL 即 Interface Description Language (接口定義語言)。**它通過一種中立的方式來描述接口,使得在不同平臺上運行的對象和用不同語言編寫的程序可以相互通信交流**。比如,一個組件用 C++ 寫成,另一個組件用 Java 寫,仍然可以通信。 # IPC是什么 IPC 即 Inter-Process Communication (進程間通信)。IPC不是Android中獨有的,任何一個操作系統都需要有相應的IPC機制。 Android 基于 Linux,而 Linux 出于安全考慮,不同進程間不能之間操作對方的數據,這叫做“進程隔離”。但是在大多數情形下,不同進程間的數據通訊是不可避免的,因此操作系統必須提供跨進程通信機制。 # Android多進程模式 按照操作系統中的描述,線程是CPU調度的最小單元,是一種有限的系統資源;進程一般指一個執行單元,在移動設備上指一個應用。一個進程可以包含多個線程。 在Android中開啟多進程,只需要在清單文件中為四大組件指定`android:process`屬性即可。進程名以“:”開頭的進程屬于當前應用的私有進程,其他應用程序組件不可以和它跑在同一進程中,而進程名不以“:”開頭的進程屬于全局進程,其他應用通過ShareUID方式可以和它跑在同一進程中。運行在同一進程中的組件屬于同一個虛擬機和同一個Application的,運行在不同進程中的組件屬于兩個不同的組件和Application的。 使用多進程會造成以下幾個問題: * 靜態成員和單例模式完全失效 * 線程同步機制完全失效 * SharedPreferences的可靠性下降 * Application會多次創建 # Android進程間通信方式 **1、使用Bundle** 由于Bundle實現了Parcelable接口,因此可以方便的在不同的進程間傳輸。 當在一個進程中啟動另一個進程的Activity、Service和Receiver時,可以在Bundle中附加需要傳輸給遠程進程的信息并通過Intent發送出去。 **2、使用文件共享** 兩個進程通過讀/寫同一個文件來交換數據,比如A進程把數據寫入文件,B進程通過讀取這個文件來獲取數據。 文件共享方式適合在對數據同步要求不高的進程之間進行通信,并且要妥善處理并發讀/寫問題。 **3、使用Messenger** 使用Messenger來進行進程間通信時,Server端需要創建一個Handler并通過它來創建一個Messenger對象,在Service的onBind方法中返回Messenger對象底層的IBinder對象即可。 Client端在綁定Service成功的回調中,根據IBinder對象創建一個Messenger對象,通過此Messenger對象Client就可以向Server發送消息了,當需要接收Server的回復消息時,根據Client自身的Handler創建一個Messenger對象,設置給Message的replyTo屬性即可。 > 備注 * Client根據跨進程傳遞過來的IBinder對象,創建Server對應的Messenger,使用該Messenger即可向Server發送消息 * Client可以在Message的replyTo字段中攜帶自己的Messenger對象,這樣Server可以使用Client的Messenger對象向Client發送消息 使用示例: 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); } } ``` **4、使用AIDL** **5、使用ContentProvider** **6、使用Socket** ## 各種方式對比 # 參考 [Android 進階13:幾種進程通信方式的對比總結](https://blog.csdn.net/u011240877/article/details/72863432#rpc-%E6%98%AF%E4%BB%80%E4%B9%88) 《Android 開發藝術探索》任玉剛 著
                  <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>

                              哎呀哎呀视频在线观看