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

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

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-06-03 05:40:20【】1人已围观

简介androideventbus能跨activity發送消息嗎正常情況下,可以。EventBus是一款針對Android優化的發布/訂閱事件總線。主要功能是替代Intent,Handler,BroadC

android eventbus能跨activity發送消息嗎

正常情況下,可以。

EventBus是一款針對Android優化的發布/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。

在Activity中的onCreate和onDestroy里分別注冊和解除注冊,并且聲明

public void onEvent(FirstEvent event) { } 等幾個函數就可以了。

要說明的是EventBus是一個進程范圍內的發布/訂閱時間總線,所以只能在一個進程內進行訂閱和發布,如果你在新的進程里給Service/Activity發送消息,就無法收到消息了。

本質上來說,EventBus是一個在進程內給不同的類發送消息的事件總線,不論是Activity或是Service都可以。

android broadreceiver 運行在哪個進程

廣播接收器是運行在UI線程。

下面介紹來自于android學習手冊,android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼采用android studio目錄結構,高亮顯示代碼,文檔都采用文檔結構圖顯示,可以快速定位。360手機助手中下載,圖標上有貝殼

1.Android廣播機制概述

Android廣播分為兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。廣播作為Android組件間的通信方式,可以使用的場景如下:

1.同一app內部的同一組件內的消息通信(單個或多個線程之間);

2.同一app內部的不同組件之間的消息通信(單個進程);

3.同一app具有多個進程的不同組件之間的消息通信;

4.不同app之間的組件之間消息通信;

5.Android系統在特定情況下與App之間的消息通信。

從實現原理看上,Android中的廣播使用了觀察者模式,基于消息的發布/訂閱事件模型。因此,從實現的角度來看,Android中的廣播將廣播的發送者和接受者極大程度上解耦,使得系統能夠方便集成,更易擴展。具體實現流程要點粗略概括如下:

1.廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行注冊;

2.廣播發送者通過binder機制向AMS發送廣播;

3.AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的消息循環隊列中;

4.消息循環執行拿到此廣播,回調BroadcastReceiver中的onReceive()方法。

 對于不同的廣播類型,以及不同的BroadcastReceiver注冊方式,具體實現上會有不同。但總體流程大致如上。

由此看來,廣播發送者和廣播接收者分別屬于觀察者模式中的消息發布和訂閱兩端,AMS屬于中間的處理中心。廣播發送者和廣播接收者的執行是異步的,發出去的廣播不會關心有無接收者接收,也不確定接收者到底是何時才能接收到。顯然,整體流程與EventBus非常類似。

在上文說列舉的廣播機制具體可以使用的場景中,現分析實際應用中的適用性:

第一種情形:同一app內部的同一組件內的消息通信(單個或多個線程之間),實際應用中肯定是不會用到廣播機制的(雖然可以用),無論是使用擴展變量作用域、基于接口的回調還是Handler-post/Handler-Message等方式,都可以直接處理此類問題,若適用廣播機制,顯然有些“殺雞牛刀”的感覺,會顯太“重”;

第二種情形:同一app內部的不同組件之間的消息通信(單個進程),對于此類需求,在有些教復雜的情況下單純的依靠基于接口的回調等方式不好處理,此時可以直接使用EventBus等,相對而言,EventBus由于是針對統一進程,用于處理此類需求非常適合,且輕松解耦。可以參見文件《Android各組件/控件間通信利器之EventBus》。

第三、四、五情形:由于涉及不同進程間的消息通信,此時根據實際業務使用廣播機制會顯得非常適宜。下面主要針對Android廣播中的具體知識點進行總結。

 

2.BroadcastReceiver

自定義BroadcastReceiver

自定義廣播接收器需要繼承基類BroadcastReceivre,并實現抽象方法onReceive(買粉絲ntext, intent)方法。廣播接收器接收到相應廣播后,會自動回到onReceive(..)方法。默認情況下,廣播接收器也是運行在UI線程,因此,onReceive方法中不能執行太耗時的操作。否則將因此ANR。一般情況下,根據實際業務需求,onReceive方法中都會涉及到與其他組件之間的交互,如發送Notification、啟動service等。

下面代碼片段是一個簡單的廣播接收器的自定義:

1 public class MyBroadcastReceiver extends BroadcastReceiver {

2     public static final String TAG = "MyBroadcastReceiver";

3     public static int m = 1;

4

5     @Override

6     public void onReceive(Context 買粉絲ntext, Intent intent) {

7         Log.w(TAG, "intent:" + intent);

8         String name = intent.getStringExtra("name");

9         Log.w(TAG, "name:" + name + " m=" + m);

10         m++;

11        

12         Bundle bundle = intent.getExtras();

13        

14     }

15 }

 

BroadcastReceiver注冊類型

BroadcastReceiver總體上可以分為兩種注冊類型:靜態注冊和動態注冊。

1).靜態注冊:

直接在AndroidManifest.xml文件中進行注冊。規則如下:

<receiver android:enabled=["true" | "false"]

android:exported=["true" | "false"]

android:i買粉絲n="drawable resource"

android:label="string resource"

android:name="string"

android:permission="string"

android:process="string" >

. . .

</receiver>

其中,需要注意的屬性

android:exported  ——此broadcastReceiver能否接收其他App的發出的廣播,這個屬性默認值有點意思,其默認值是由receiver中有無intent-filter決定的,如果有intent-filter,默認值為true,否則為false。(同樣的,activity/service中的此屬性默認值一樣遵循此規則)同時,需要注意的是,這個值的設定是以application或者application user id為界的,而非進程為界(一個應用中可能含有多個進程);

android:name  —— 此broadcastReceiver類名;

android:permission  ——如果設置,具有相應權限的廣播發送方發送的廣播才能被此broadcastReceiver所接收;

android:process  ——broadcastReceiver運行所處的進程。默認為app的進程。可以指定獨立的進程(Android四大基本組件都可以通過此屬性指定自己的獨立進程)

常見的注冊形式有:

<receiver android:name=".MyBroadcastReceiver" >

   <intent-filter>

       <action android:name="android.買粉絲.買粉絲nn.CONNECTIVITY_CHANGE" />

   </intent-filter>

   <intent-filter>

       <action android:name="android.intent.action.BOOT_COMPLETED" />

   </intent-filter>

</receiver>

其中,intent-filter由于指定此廣播接收器將用于接收特定的廣播類型。本示例中給出的是用于接收網絡狀態改變或開啟啟動時系統自身所發出的廣播。當此App首次啟動時,系統會自動實例化MyBroadcastReceiv

很赞哦!(22826)

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

职业:程序员,设计师

现居:西藏日喀则聂拉木县

工作室:小组

Email:[email protected]