Android BroadcastReceiver 的靜態動態註冊及區別
前言
為了方便Android系統各個應用程式及程式內部進行通訊,Android系統引入了一套廣播機制。各個應用程式可以對感興趣的廣播進行註冊,當系統或者其他程式發出這條廣播的時候,對發出的廣播進行註冊的程式便能夠收到這條廣播。為此,Android系統中有一套完整的API,允許程式只有的傳送和接受廣播。
本文會分別介紹靜態註冊廣播和動態註冊廣播的方法並比較這兩種的區別。
在此會先說明發送廣播的兩種方法
廣播兩種基本型別
在一個程式中,可以傳送廣播供當前程式的廣播接收器收到。首先我們來看下兩種方式的傳送廣播。
在Android系統中,主要有兩種基本的廣播型別:
- 標準廣播(Normal Broadcasts)
- 有序廣播(Ordered Broadcasts)
標準廣播
是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器會在同一時間接收到這條廣播,廣播無法被截斷。
傳送廣播的方式十分簡單,只需要例項化一個Intent物件,然後呼叫context的* sendBroadcast() *方法。
//intent中的引數為action
Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
sendBroadcast(intent);
這樣就完成了廣播的傳送,至於接收呢,需要用到廣播接收器,這個下面會寫到。
有序廣播
是一種同步執行的廣播,在廣播發出之後,優先順序高的廣播接收器可以優先接收到這條廣播,並可以在優先順序較低的廣播接收器之前截斷停止傳送這條廣播。
至於有序廣播:
//intent中的引數為action
Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
sendOrderBroadcast(intent,null);//第二個引數是與許可權相關的字串。
到此時,如果你的程式中只有一個廣播接收器的話,是體現不出有序廣播的特點的,
右擊包名——New——Other——BroadcastReceiver多建立幾個廣播接收器。
此時你還是會發現,所有的廣播接收器是同時接收到廣播訊息的。注意上面介紹的時候說到優先順序,這個時候我們需要設定優先順序,在AndroidManifest檔案中的Receiver標籤中設定廣播接收器的優先順序。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--注意此時有一個Priority屬性-->
<intent-filter android:priority="100">
<action android:name="android.intent.action.BROADCAST_TEST"></action>
</intent-filter>
</receiver>
優先順序越高的廣播接收器可以先收到廣播,也可以在收到廣播的時候呼叫abortBroadcast()方法截斷廣播。優先順序低的廣播接收器就無法接收到廣播了。
註冊廣播
自定義BroadcastReceiver
在Android的廣播接收機制中,如果需要接收廣播,就需要建立廣播接收器。而建立廣播接收器的方法就是新建一個類(可以是單獨新建類,也可以是內部類(public)) 繼承自BroadcastReceiver
class myBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//接收到廣播的處理,注意不能有耗時操作,當此方法長時間未結束,會報錯。
//同時,廣播接收器中不能開執行緒。
}
}
兩種註冊方法
動態註冊
所謂動態註冊是指在程式碼中註冊。步驟如下 :
- 例項化自定義的廣播接收器。
- 建立IntentFilter例項。
- 呼叫IntentFilter例項的addAction()方法新增監聽的廣播型別。
- 最後呼叫Context的registerReceiver(BroadcastReceiver,IntentFilter)動態的註冊廣播。
此時,已經為我們自定義的廣播接收器綁定了廣播,當收到和繫結的廣播一直的廣播的時候,就會呼叫廣播接收器中的onReceiver方法。
MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.example.dimple.MY_BROADCAST");
registerReceiver(myBroadcastReceiver,intentFilter);
PS:這裡提醒一點,如果需要接收系統的廣播(比如電量變化,網路變化等等),別忘記在AndroidManifest配置檔案中加上許可權。
另外,動態註冊的廣播在活動結束的時候需要取消註冊:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myBroadcastReceiver);
}
靜態註冊
這裡我們使用靜態註冊來接收開機廣播。
使用Android Studio 中的快捷方法來建立廣播接收器。
右擊包名——New——Other——BroadcastReceiver。
PS:靜態註冊的廣播接收器需要在AndroidManifest檔案中註冊,由於使用的AS的快捷方式,所以已經建立好了。
如圖所示:
在建立好的廣播接收器中新增一個Toast提示。程式碼如下:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"開機啟動!",Toast.LENGTH_LONG).show();
}
}
然後在AndroidManifest檔案中新增:
許可權
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
Intent-filter
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--新增以下3行-->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
此時重啟Android系統就可以收到開機提示了。
總結
動態註冊和靜態註冊的區別:
動態註冊的廣播接收器可以自由的控制註冊和取消,有很大的靈活性。但是隻能在程式啟動之後才能收到廣播,此外,不知道你注意到了沒,廣播接收器的登出是在onDestroy()方法中的。所以廣播接收器的生命週期是和當前活動的生命週期一樣。
靜態註冊的廣播不受程式是否啟動的約束,當應用程式關閉之後,還是可以接收到廣播。
標準廣播和有序廣播的接收和傳送都是全域性性的,這樣會使得其他程式有可能接收到廣播,會造成一定的安全隱患。為了解決這個問題,Android系統中有一套本地廣播的機制。這個機制是讓所有的廣播事件(接收與傳送)都在程式內部完成。主要是採用的一個localBroadcastReceiver對廣播進行管理。
相關推薦
Android BroadcastReceiver 的靜態動態註冊及區別
前言 為了方便Android系統各個應用程式及程式內部進行通訊,Android系統引入了一套廣播機制。各個應用程式可以對感興趣的廣播進行註冊,當系統或者其他程式發出這條廣播的時候,對發出的廣播進行註冊的程式便能夠收到這條廣播。為此,Android系統中有一
靜態/動態註冊廣播的區別
廣播接收器註冊一共有兩種形式 : 靜態註冊和動態註冊.兩者及其接收廣播的區別:1.動態註冊廣播不是常駐型廣播,也就是說廣播跟隨activity的生命週期。注意: 在activity結束前,移除廣播接收器
Android之JNI動態註冊native方法和JNI資料簡單使用
1、介紹JNI註冊方式 JVM 查詢 native 方法有兩種方式: 1)、按照 JNI 規範的命名規則(靜態註冊) 2) 、呼叫 JNI 提供的 RegisterNatives 函式,將本地函式註冊到 JVM 中(動態註冊) 2、動態註冊的步驟
Android 6.0動態許可權及跳轉GPS設定介面
public class CheckPermissionsActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { /** * 需要進行檢測的許可權陣列 */ prote
Android 6.0動態許可權及小米(MIUI)許可權的特殊處理
前言 常規操作許可權的頁面及流程 許可權說明 許可權授取流程 小米許可權特殊處理 各個android作
(第一行程式碼筆記系列-廣播1)android 廣播動態註冊和靜態註冊有什麼區別及基本用法
新建一個BroadcastTest專案,然後修改MainActivity中的程式碼,如下所示: public class MainActivity extends Activity { private IntentFilter intentFilter; private NetworkChange
BroadcastReceiver(廣播)的靜態註冊和動態註冊 --Android開發
encoding save private tac app tco sta content con BroadcastReceiver是安卓四大組件之一,本例通過代碼的方式演示靜態註冊和動態註冊。 1、靜態註冊 靜態註冊只需要AndroidManifest.xml中進行
Android靜態註冊和動態註冊廣播的區別
1)靜態註冊:在AndroidManifest.xml註冊,android不能自動銷燬廣播接收器,也就是說當應用程式關閉後,還是會接收廣播。 2)動態註冊:在程式碼中通過registerReceive
動態註冊和靜態註冊的區別
動態註冊的廣播會受Activity的生命週期的影響, 當Activity銷燬的時候,廣播就失效了。 而靜態註冊的廣播,即使Activity銷燬了,仍然可以收到廣播。更牛掰的是即使殺死程序,仍然可以收到廣播。 動態註
vue的路由及靜態路由和動態路由的區別
1.路由主要分為以下幾點:(圖見) 靜態路由與動態路由的區別: 定義: 靜態路由:靜態路由是在路由器中設定固定的路由表;除非網路管理員進行干預,否則靜 態路由表不會發生變化。 動態路由:由網路中的路由器之間相互通訊,傳遞路由資訊,利用收到的路由資訊更新路由表的路由方式。 使用場景: 靜態路
淺析靜態庫和動態庫的區別及linux下二者的生成和使用
從程式設計的角度來講,庫檔案通常被分為靜態庫檔案和動態庫檔案,其目的在於將部分程式碼封裝在一起編譯後供自己或他人呼叫,好處在於編譯後的庫檔案看不到原始碼,可保密,同時不會因為不小心修改了函式而出問題,便於維護。但是二者之間存在一定的差異。 1.靜態庫: &n
Linux下靜態、動態庫(隱式、顯式呼叫)的建立和使用及區別
顯式呼叫的動態庫的建立與隱式呼叫相同。(隱式呼叫與靜態庫的使用方法一樣,不需要包含匯出函式的標頭檔案(顯式呼叫也不用包含標頭檔案),只需要在編譯可執行程式時指定庫檔案的路徑)顯式呼叫和隱式呼叫的區別在於:編譯可執行程式時需要指定庫檔案的搜尋路徑,而顯式呼叫編譯可執行程式時不用加上動態庫的搜尋路徑(因為已經在主
Android jni 靜態註冊 和動態註冊
JNI 開發流程 1.編寫native 方法 2.javah 命令,生成.h 檔案 java_類的全名_方法名 或者自己手寫 3.複製.h 標頭檔案到cpp 工程 4.複製jni.h
Android廣播的靜態與動態註冊
靜態廣播:不用程式啟動就可以接收,可用作開機自啟動(裝置開機時會發送廣播,下面列出幾項廣播的ACTION),當然也能自己設定action的值。 Intent.ACTION_BOOT_COMPL
android 靜態、動態註冊廣播淺析
前言 程式碼優化過程中發現好多app的全域性網路監聽使用動態註冊廣播方式,而沒有采用在清單檔案中進行註冊 產生了疑問,研究開來知識點還是有一些。總結如下 1.廣播的註冊方式 在Android中有兩種方式,即動態註冊(程式碼註冊)、靜態註冊(清單檔
android 靜態廣播和動態廣播的區別和用法
一、什麼是廣播 BroadcastReceiver是android 系統的四大元件之一,本質上就是一個全域性的監聽器,用於監聽系統全域性的廣播訊息,可以方便的實現系統中不同元件之間的通訊。 程式可以通過呼叫context的sendBroadcast()方法來啟動指定的Br
web中靜態資源和動態資源的概念及區別
1.靜態資源和動態資源的概念 簡單來說: 靜態資源:一般客戶端傳送請求到web伺服器,web伺服器從記憶體在取到相應的檔案,返回給客戶端,客戶端解析並渲染顯示出來。 動態資源:一般客戶端請求的動態資源,先將請求交於web容器,web容器連線資料庫,資料庫處理資料之後,將內容
Android的廣播Receiver動態註冊和靜態註冊
廣播接收器註冊一共有兩種形式 : 靜態註冊和動態註冊. 兩者及其接收廣播的區別: 1.動態註冊的廣播 永遠要快於 靜態註冊的廣播,不管靜態註冊的優先順序設定的多高,不管動態註冊的優先順序有多低>\ 2.動態註冊廣播不是 常駐型廣播 ,也就是說廣播跟隨activ
Android 取消靜態註冊的BroadcastReceiver
大家都知道,關於Android廣播事件的註冊有兩種方式。1:在程式碼中動態註冊;2:在Manifest中的靜態註冊。 本文主要討論怎麼取消 靜態註冊的廣播 經過查詢資料發現,可以利用PackageManager中的setComponentEnableSetting(
Android JNI 函式註冊的兩種方式(靜態註冊/動態註冊)
JNI/NDK 在Android開發中,由於種種原因我們需要呼叫C/C++程式碼, 這個時候就要用到Android開發者都聽說