標籤:
1,Bundle一種最簡單的進程間傳遞資料的方式
使用Bundle在進程間傳遞資料(資料要被序列化,基礎資料型別 (Elementary Data Type)都實現了序列化)。
Intent intent = new Intent("romote"); Bundle bundle=new Bundle(); bundle.putParcelable(KEY,new Book(1,"wcx")); intent.putExtras(bundle);startActivity(intent);//另一個進程擷取資料Book book=getIntent().getParcelableExtra(MainActivity.KEY);Log.e(LOG_TAG,book.toString());
2,通過檔案分享權限設定的方式
比如把某個對象序列化到硬碟上,在另一個進程對其還原序列化,擷取對象的資料。
通過這種A進程寫入到檔案,B進程讀取檔案的方式,也可以實現資料共用。
但如果多進程並發的讀寫,會造成很大的麻煩。所以有並發的讀寫的操作,需要線程同步。
它適用於對資料同步要求不高之間的進程進行通訊。
3,Messenger
Messenger可以在不同的進程中傳遞Message對象。而Message中可以放入我們需要傳遞的資料。
它是一種輕量級的IPC方式,它的底層是AIDL。
實現的步驟:
在遠程服務中,建立Messenger對象時和一個Handler進行綁定。而此Handler負責處理用戶端發送過來的訊息。
在bind方法中通過getBinder(),返回Messenger中的Binder對象。
在用戶端,通過綁定服務,服務串連後,擷取到Binder對象,通過Binder對象,建立Messenger。
把用戶端需要發送的訊息封裝到Message中。
Message的obj可以在同進程中傳遞資料,但在多進程裡,obj只能指定系統提供的實現Parceable介面的對象。所以基礎資料型別 (Elementary Data Type)(實現的都是Serializable介面)都不可以。自訂的實現Parceable介面的對象也不可以。但是好在可以使用Bundle,Bundle支援所有序列化的對象。
封裝資料完畢後,通過Messenger發送Message。
然後在遠程服務的Handler去處理這些傳遞過來的資料。
遠程服務:
private static final String LOG_TAG = "====>"; @Nullable @Override public IBinder onBind(Intent intent) { Log.e(LOG_TAG, "線程id:" + android.os.Process.myPid() + ""); return messenger.getBinder(); } //handler處理用戶端發送的訊息 private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case MainActivity.CORRECT: String name=msg.getData().getString("football"); Log.e(LOG_TAG,name); break; default: Log.e(LOG_TAG, "default"); break; } } }; Messenger messenger=new Messenger(handler);
用戶端:
private void messengerMethod(){ //綁定服務 Intent intent=new Intent(); intent.setComponent(new ComponentName("asule.myhope","asule.myhope.MyMessengerService")); bindService(intent,conn,BIND_AUTO_CREATE); } private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { messenger = new Messenger(service); Message message=new Message(); message.what=CORRECT; Bundle bundle=new Bundle(); bundle.putString("football", "ronaldo"); message.setData(bundle); try { messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } };
上面的例子示範的是用戶端發送資料到服務端。遠程服務也可以通過Messenger回複用戶端資料。
在用戶端發送資料完畢後,通過Message.replayTo參數把用戶端的Messager傳遞給服務端。服務端使用該Messager發送資料到用戶端。
此時的用戶端只需要建立Messenger,與一個處理資料的Handler進行綁定就大功告成了。
Android的IPC方式