上一篇文章學(xué)習(xí)了用AIDL實現(xiàn)IPC,地址安卓實現(xiàn)IPC(三)—— AIDL,這一篇來學(xué)習(xí)用廣播實現(xiàn)IPC怜庸,效果圖如下:
實現(xiàn)的效果比較簡單扔茅,就是點擊按鈕然后彈出一個Toast,不過這個Toast是在另一個應(yīng)用實現(xiàn)的哦,下面貼上代碼來一探究竟:
整體代碼就不貼了,只是貼上點擊按鈕后的執(zhí)行的部分代碼:
Intent intent1 = new Intent();
intent1.setAction("com.example.computer_ren.otherapplication.BroadCast");
intent1.setPackage("com.example.computer_ren.otherapplication");
intent1.putExtra("data","你好,我是服務(wù)器");
sendBroadcast(intent1);
從代碼可以看到但汞,啟動另一個應(yīng)用的組件也是用的Intent的隱式啟動,不過這個是發(fā)送的一個廣播抽米,將intent對象傳進(jìn)去特占,intent內(nèi)包含我們需要傳遞的數(shù)據(jù),這樣就實現(xiàn)了數(shù)據(jù)的傳遞云茸,下面看看接收端怎么對數(shù)據(jù)進(jìn)行處理的:
public class MyBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null &&
intent.getAction().equals("com.example.computer_ren.otherapplication.BroadCast")) {
Toast.makeText(context, intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
}
}
}
接收端創(chuàng)建了一個廣播接收器是目,根據(jù)action來判斷發(fā)送端發(fā)來的廣播,根據(jù)intent提供的方法getExtra()取出數(shù)據(jù)标捺。
這里注冊廣播我是采用的靜態(tài)注冊:
<!--靜態(tài)注冊廣播懊纳,不隨activty的周期,activity銷毀依然能接收到廣播-->
<receiver android:name=".MyBroadCast">
<intent-filter>
<action android:name="com.example.computer_ren.otherapplication.BroadCast"/>
</intent-filter>
</receiver>
這里需要注意一點亡容,就是發(fā)送端隱式啟動時的action嗤疯、接收端判斷用的action和注冊廣播時設(shè)置的action,三個地方要一致闺兢。
好了茂缚,以上就是對安卓實現(xiàn)IPC的第三種方式——Broadcast的學(xué)習(xí),過程相對于AIDL還是比較簡單屋谭,這里涉及到兩個知識點脚囊,一個就是intent的隱式啟動,另一個就是廣播的靜態(tài)注冊桐磁。除此之外還有廣播的一些知識點悔耘,比如本地廣播和全局廣播,有序廣播和普通廣播等我擂。
對了衬以,因為廣播時運行在主線程中,所以不能在其中執(zhí)行一些耗時操作校摩,如果開啟一個子線程去異步執(zhí)行耗時操作看峻,由于onReceive()的生命周期很短,onReceive()執(zhí)行完后衙吩,廣播就結(jié)束了互妓,廣播實例也就銷毀了,如果此時異步操作還未結(jié)束,那么就會出錯车猬,比如典型的空指針異常啊之類的。所以如果需要在廣播接收器中做一些耗時操作尺锚,正確的姿勢應(yīng)該是用Intent去啟動一個service珠闰,在service中去處理耗時操作。
下一篇文章: