Android的IPC方式

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.