您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

02 消息訂閱與發布和eventbus(android broadreceiver 運行在哪個進程)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-22 13:22:54【】8人已围观

简介er,并注冊到系統中。之前常說:靜態注冊的廣播接收器即使app已經退出,主要有相應的廣播發出,依然可以接收到,但此種描述自Android3.1開始有可能不再成立,具體分析詳見本文后面部分。 

er,并注冊到系統中。

之前常說:靜態注冊的廣播接收器即使app已經退出,主要有相應的廣播發出,依然可以接收到,但此種描述自Android 3.1開始有可能不再成立,具體分析詳見本文后面部分。

 

2).動態注冊:

動態注冊時,無須在AndroidManifest中注冊<receiver/>組件。直接在代碼中通過調用Context的registerReceiver函數,可以在程序中動態注冊BroadcastReceiver。registerReceiver的定義形式如下:

1 registerReceiver(BroadcastReceiver receiver, IntentFilter filter)

2 registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheler)

典型的寫法示例如下:

1 public class MainActivity extends Activity {

2     public static final String BROADCAST_ACTION = "買粉絲.example.買粉絲rn";

3     private BroadcastReceiver mBroadcastReceiver;

4

5     @Override

6     protected void onCreate(Bundle savedInstanceState) {

7         super.onCreate(savedInstanceState);

8         setContentView(R.layout.activity_main);

9

10         mBroadcastReceiver = new MyBroadcastReceiver();

11         IntentFilter intentFilter = new IntentFilter();

12         intentFilter.addAction(BROADCAST_ACTION);

13         registerReceiver(mBroadcastReceiver, intentFilter);

14     }

15    

16     @Override

17     protected void onDestroy() {

18         super.onDestroy();

19         unregisterReceiver(mBroadcastReceiver);

20     }

21

22 }

注:Android中所有與觀察者模式有關的設計中,一旦涉及到register,必定在相應的時機需要unregister。因此,上例在onDestroy()回到中需要unregisterReceiver(mBroadcastReceiver)。

當此Activity實例化時,會動態將MyBroadcastReceiver注冊到系統中。當此Activity銷毀時,動態注冊的MyBroadcastReceiver將不再接收到相應的廣播。

 

3.廣播發送及廣播類型

經常說”發送廣播“和”接收“,表面上看廣播作為Android廣播機制中的實體,實際上這一實體本身是并不是以所謂的”廣播“對象存在的,而是以”意圖“(Intent)去表示。定義廣播的定義過程,實際就是相應廣播”意圖“的定義過程,然后通過廣播發送者將此”意圖“發送出去。被相應的BroadcastReceiver接收后將會回調onReceive()函數。

下段代碼片段顯示的是一個普通廣播的定義過程,并發送出去。其中setAction(..)對應于BroadcastReceiver中的intentFilter中的action。

1 Intent intent = new Intent();

2 intent.setAction(BROADCAST_ACTION);

3 intent.putExtra("name", "qqyumidi");

4 sendBroadcast(intent);

根據廣播的發送方式,可以將其分為以下幾種類型:

1.Normal Broadcast:普通廣播

2.System Broadcast: 系統廣播

3.Ordered broadcast:有序廣播

4.Sticky Broadcast:粘性廣播(在 android 5.0/api 21中deprecated,不再推薦使用,相應的還有粘性有序廣播,同樣已經deprecated)

5.Local Broadcast:App應用內廣播

下面分別總結下各種類型的發送方式及其特點。

1).Normal Broadcast:普通廣播

此處將普通廣播界定為:開發者自己定義的intent,以買粉絲ntext.sendBroadcast_"AsUser"(intent, ...)形式。具體可以使用的方法有:

sendBroadcast(intent)/sendBroadcast(intent, receiverPermission)/sendBroadcastAsUser(intent, userHandler)/sendBroadcastAsUser(intent, userHandler,receiverPermission)。

普通廣播會被注冊了的相應的感興趣(intent-filter匹配)接收,且順序是無序的。如果發送廣播時有相應的權限要求,BroadCastReceiver如果想要接收此廣播,也需要有相應的權限。

2).System Broadcast: 系統廣播

Android系統中內置了多個系統廣播,只要涉及到手機的基本操作,基本上都會發出相應的系統廣播。如:開啟啟動,網絡狀態改變,拍照,屏幕關閉與開啟,點亮不足等等。每個系統廣播都具有特定的intent-filter,其中主要包括具體的action,系統廣播發出后,將被相應的BroadcastReceiver接收。系統廣播在系統內部當特定事件發生時,有系統自動發出。

3)Ordered broadcast:有序廣播

有序廣播的有序廣播中的“有序”是針對廣播接收者而言的,指的是發送出去的廣播被BroadcastReceiver按照先后循序接收。有序廣播的定義過程與普通廣播無異,只是其的主要發送方式變為:sendOrderedBroadcast(intent, receiverPermission, ...)。

對于有序廣播,其主要特點總結如下:

1>多個具當前已經注冊且有效的BroadcastReceiver接收有序廣播時,是按照先后順序接收的,先后順序判定標準遵循為:將當前系統中所有有效的動態注冊和靜態注冊的BroadcastReceiver按照priority屬性值從大到小排序,對于具有相同的priority的動態廣播和靜態廣播,動態廣播會排在前面。

2>先接收的BroadcastReceiver可以對此有序廣播進行截斷,使后面的BroadcastReceiver不再接收到此廣播,也可以對廣播進行修改,使后面的BroadcastReceiver接收到廣播后解析得到錯誤的參數值。當然,一般情況下,不建議對有序廣播進行此類操作,尤其是針對系統中的有序廣播。

4)Sticky Broadcast:粘性廣播(在 android 5.0/api 21中deprecated,不再推薦使用,相應的還有粘性有序廣播,同樣已經deprecated)。

既然已經deprecated,此處不再多做總結。

5)Local Broadcast:App應用內廣播(此處的App應用以App應用進程為界)

由前文闡述可知,Android中的廣播可以跨進程甚至跨App直接通信,且注冊是exported對于有intent-filter的情況下默認值是true,由此將可能出現安全隱患如下:

1.其他App可能會針對性的發出與當前App intent-filter相匹配的廣播,由此導致當前App不斷接收到廣播并處理;

2.其他App可以注冊與當前App一致的intent-filter用于接收廣播,獲取廣播具體信息。

無論哪種情形,這些安全隱患都確實是存在的。由此,最常見的增加安全性的方案是:

1.對于同一App內部發送和接收廣播,將exported屬性人為設置成false,使得非本App內部發出的此廣播不被接收;

2.在廣播發送和接收時,都增加上相應的permission,用于權限驗證;

3.發送廣播時,指定特定廣播接收器所在的包名,具體是通過intent.setPackage(packageName)指定在,這樣此廣播將只會發送到此包中的App內與之相匹配的有效廣播接收器中。

App應用內廣播可以理解成一種局部廣播的形式,廣播的發送者和接收者都同屬于一個App。實際的業務需求中,App應用內廣播確實可能需要用到。同時,之所以使用應用內廣播時,而不是使用全局廣播的形式,更多的考慮到的是Android廣播機制中的安全性問題。

相比于全局廣播,App應用內廣播優勢體現在:

1.安全性更高;

2.更加高效。

為此,Android v4兼容包中給出了封裝好的LocalBroadcastManager類,用于統一處理App應用內的廣播問題,使用方式上與通常的全局廣播幾乎相同,只是注冊/取消注冊廣播接收器和發送廣播時將主調買粉絲ntext變成了LocalBroadcastManager的單一實例。

代碼片段如下:

很赞哦!(48978)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:贵州遵义汇川区

工作室:小组

Email:[email protected]