導航:首頁 > 操作系統 > android多次接收廣播

android多次接收廣播

發布時間:2023-06-13 05:55:02

android怎麼接收耳機插拔廣播

接收耳機的廣播就可以了!耳機廣播為:Intent.ACTION_HEADSET_PLUG
,動態注冊!

⑵ Android系統廣播(Broadcast)注冊,發送,接收流程解析

以下廣播簡稱Broadcast

   是Android四大組件之一,在四大組件的另外兩個組件 和 擁有發送和接收廣播的能力。Android 是在 進程間通信機制的基礎上實現的,內部基於消息發布和訂閱的事件驅動模型,廣播發送者負責發送消息,廣播接收者需要先訂閱消息,然後才能收到消息。 進程間通信與 的區別在於:

   有三種類型

   存在一個注冊中心,也可以說是一個調度中心,即 。廣播接收者將自己注冊到 中,並指定要接收的廣播類型;廣播發送者發送廣播時,發送的廣播首先會發送到 , 根據廣播的類型找到對應的 ,找到後邊將廣播發送給其處理。

   這里以普通廣播為例子, 接收者有兩種注冊方式,一種是 ,一種是 :

(廣播的發送分為 兩種,這里針對有序的廣播) 中的android:priority=""和 中的IntentFilter.setPriority(int)可以用來設置廣播接收者的優先順序,默認都是0 , 范圍是[-1000, 1000],值越大優先順序越高,優先順序越高越早收到。

   在相同優先順序接收同個類型廣播時, 的廣播接收器比 的廣播接收者更快的接收到對應的廣播,這個之後會進行分析。

   註:以下源碼基於rk3399_instry Android7.1.2

   的流程可分為 , 和 三個部分,這里依次分析下

   在Android系統的 機制中,前面提到, 作為一個注冊和調度中心負責注冊和轉發 。所以 的注冊過程就是把它注冊到 的過程。

   這里我們分析 廣播的過程, 和 有一個共同的父類 ,所以它們對應的注冊過程其實是調用 ,接下來我們按照流程逐步分析調用流程的源碼。

frameworks/base/core/java/android/content/ContextWrapper.java

   在之前的 Android應用程序啟動入口ActivityThread.main流程分析 分析過,在我們啟動 Activity 時會創建一個 對象,然後通過 傳給我們啟動的 ,其內部就會將該對象賦值給 ; 的 方法也是類似的賦值流程,這里放個簡易的源碼應該更好理解

   可以看到最後都會將生成的 對象賦值給對應的
對象。接下來繼續分析 , 即 函數。

/frameworks/base/core/java/android/app/ContextImpl.java

   這里我們首先看下如何將廣播接收者 封裝成一個 介面的 本地對象
/frameworks/base/core/java/android/app/LoadedApk.java

   每一個注冊過廣播接收者的 或 組件在<font color='Crimson'> LoadedApk </font>類中都有個對應的 對象,該對象負責將 與 組件關聯起來。這些對象,以關聯的 作為關鍵字保存在一個 中。之後對應的 又以 的 作為關鍵字保存在 的成員變數 對象中。最後通過 對應的 方法獲得其 介面的 本地對象。之後再回到 注冊方法內,將 對象發給 進行注冊。

/frameworks/base/core/java/android/app/ActivityManagerNative.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

   在的 或 注冊一個 時,並不是將其注冊到<font color='OrangeRed'>AMS</font>中,而是將與它關聯的<font color='OrangeRed'>InnerReceiver</font>對象注冊到<font color='OrangeRed'>AMS</font>中,當<font color='OrangeRed'>AMS</font>接收到廣播時,會根據 在內部找到對應的<font color='OrangeRed'>InnerReceiver</font>對象,然後在通過這個對象將這個廣播發送給對應的 處理。

   注冊過程這邊畫了一個簡單的流程圖:

   <font color='OrangeRed'>Broadcast</font>的發送過程可簡單描述為以下幾個過程:

frameworks/base/core/java/android/content/ContextWrapper.java

/frameworks/base/core/java/android/app/ContextImpl.java

/frameworks/base/core/java/android/app/ActivityManagerNative.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

⑶ android廣播有多個接收器

_<intent-filter>就可以了,
例:以下的MyBroadcastReceiver可以同時監聽farsight.inf1和farsight.inf2類型的廣播
<application Android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name="com.fs.receiver.broadcast.MyBroadcastReceiver">
<intent-filter>
<action android:name="farsight.inf1" />
</intent-filter>
<intent-filter>
<action android:name="farsight.inf2" />
</intent-filter>
</receiver>
</application>
當廣播監聽到廣播後監聽器類中函數public void onReceive(Context context, Intent intent) 會被調用,
為了區別到底監聽到的是farsight.inf1類型的廣播還是farsight.inf2類型的廣播,可以使用函數中參數intent調

getAction()函數,該函數的返回值會返回farsight.inf1或farsight.inf2.用返回的表達類型的字元串則可以
知道是監聽到哪一個廣播被監聽到後調用的onReceive函數
3. 多個廣播接收器可以接收同一廣播比較簡單,只要創建多個廣播接收器類,然後在MyBroadcastReceiver.xml
中將這些廣播接收器都配置好!並且配置相同的<intent-filter>就可以了
例:
廣播接收器一的代碼
public class OneBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
System.out.printfln("One....");
}
}
廣播接收器二的代碼
public class TwoBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
System.out.printfln("Two....");
}
}
如果以上兩監聽器類在同一個項目中,則在AndroidManifest.xml的<application>標簽中嵌套配置
兩個<receiver>標簽
<receiver android:name="OneBroadcastReceiver類的包名.OneBroadcastReceiver">
<intent-filter>
<action android:name="farsight.inf" />
</intent-filter>
</receiver>
<receiver android:name="TwoBroadcastReceiver類的包名.TwoBroadcastReceiver">
<intent-filter>
<action android:name="farsight.inf" />
</intent-filter>
</receiver>
如果以兩個接收器不是在同一個項目中,則分別把上面的兩組<receiver>標簽配置在分自所在的
項目的 AndroidManifest.xml文件的<application>標簽中配置即可,
以上做完後,只要發送廣播的類型為farsight.inf,則OneBroadcastReceiver和TwoBroadcastReceiver類中的onReceive函數都會被自動調用,
當多個廣播接收器監聽同一個廣播,還要控制其中接收器接收順序,那就會用到另一個知識點——有序廣播

⑷ Android使用廣播監聽網路狀態變化 一直收到系統廣播

因為這個系統廣播在不停的發送,系統網路狀態在不停的變化。比如關閉,打開,掃描,正在連接,已連接等狀態。

⑸ Android 第六講 廣播接收器和服務

兩種方式:靜態注冊和動態注冊
動態注冊:

1)動態注冊:需要定義一個繼承自BroadcastReceiver類的子類,該接收器需要在Activity中的onDestroy中注銷
2)靜態注冊:通過在AndroidManifest.xml中配置

兩種廣播形式:有序廣播和無序廣播
1)無序廣播:接受標准廣播的接收器將同時收到廣播消息,非同步執行,沒有先後順序 sendBroadCast
2)有序廣播:sendOrderedBroadCast,按照一定順序先後被接受順序,由priority屬性決定,abortBroadCast中斷廣播

如果只想在本應用中發送和接受廣播,使用LocalBroadcastReceiver來對廣播進行管理
本地廣播不支持靜態注冊
優點 :安全高效

Service是Android中的一種組件,和Activity的級別一致,但不能自己運行,只能後台運行,和其他組件交互,服務必須注冊才能使用

本地服務:服務依附在主線程中,節約資源,主線程死掉服務終止
遠程服務:服務在獨立進程中,靈活性好 ,佔用資源高

兩種服務的啟動模式:
1)start方式:調用者和服務之間沒有關聯,調用者退出不會影響服務,startService啟動服務,如果服務不存在,調用onCreat方法,然後onStartCommand被調用。stopService關閉服務,onDestroy方法被調用
2)bind方式:調用者和服務綁定,調用者退出,服務終止bindService啟動服務,onCreate方法創建服務,onBind方法綁定服務,onUnbind方法解綁,onDestory在服務結束時調用

閱讀全文

與android多次接收廣播相關的資料

熱點內容
網路驅動下載到哪個文件夾 瀏覽:476
達內程序員培訓西安 瀏覽:498
人保送車主惠app上怎麼年檢 瀏覽:604
android手機開機密碼 瀏覽:480
linux查看某個進程命令 瀏覽:529
閑置的騰訊雲伺服器 瀏覽:437
rar壓縮包mac 瀏覽:626
php混淆加密工具 瀏覽:581
java把數字拆分 瀏覽:464
如何下載svn伺服器舊版本 瀏覽:559
命令與征服4攻略 瀏覽:914
實數四則運演算法則概念 瀏覽:294
cs16優化命令 瀏覽:871
Minecraft雲伺服器免費 瀏覽:828
png壓縮最小 瀏覽:182
老韓綜app怎麼看不了了 瀏覽:229
只有一個程序員的體驗 瀏覽:323
用伺服器地址怎麼有網 瀏覽:552
路由器伺服器昵稱是什麼 瀏覽:715
程序員男友消失了 瀏覽:401