Android四大组件之广播
Android四大組件之廣播
廣播分類
1、標準廣播
? 標準廣播是一種完全異步執行的廣播,在廣播發出去以后,所有的BroadcastReceiver都會在同一時間接收到這一廣播,因此他們沒有先后順序可言。這種廣播的效率很高,但是它是無法被攔截的廣播方式。
2、有序廣播
? 有序廣播則是一種同步進行的廣播。在廣播發出去以后同一時刻只有有一個BroadcastReceiver能夠收到該廣播,當BroadcastReceiver中的邏輯執行完畢后,廣播才會繼續往下傳遞。因為有序廣播是有先后順序的,優先級別高的BroadcastReceiver就可以先收到廣播,而且BroadcastReceiver還可以截斷正在傳遞的廣播,這樣后面的BroadcastReceiver就無法收到廣播信息了
標準廣播和有序廣播的區別:
1、啟動方式不同標準廣播是通過sendBroadcast()方法進行啟動的,有序廣播是通過sendOrderedBroadcast()進行啟動的
2、標準廣播是異步分發同時接受,不能截斷;有序廣播按照優先級的順序分發優先級高就先收到,同時也可以通過abortBroadcast();方法進行截斷廣播,后面的BroadcastReceiver就收不到廣播。
系統廣播
? 系統廣播就是Android系統內置的很多系統級別的廣播,我們可以在程序中通過監聽這些廣播來得到各種系統的狀態信息。比如:手機開機關機、電池電量發生改變的也會發送一條廣播、系統時間改變也會發出一條廣播等等,如果想要接收這些廣播就需要使用BroadcastReceiver。
? 使用廣播首先要在程序中進行注冊分為兩種注冊方式分別是:動態注冊、靜態注冊
動態注冊就是在代碼中進行注冊,使用動態注冊廣播在頁面關閉時要通過調用unregisterReceiver()方法進行取消注冊;靜態注冊是在AndroidManifest.xml中注冊
使用靜態注冊廣播時,在Android8.0系統之后靜態注冊的廣播是無法收到隱式廣播的,而默認情況下我們發出的廣播都是隱式廣播,因為在代碼中啟動廣播要加上setPackage()這個方法。
自定義廣播
自定義廣播分為標準(無序)自定義廣播以及有序自定義廣播:
sendBroadcast(intent); //發送標準自定義廣播
sendOrderedBroadcast(Intent, null); //發送有序自定義廣播
有序自定義廣播的第二個參數是接受權限,一般為null。有序廣播接收器可以設置接收優先級priority,優先級高的先收到廣播,并且可以設置截斷廣播,這樣之后的接收器就無法接受廣播。
發送自定義廣播
Intent intent = new Intent(“Example.MY_BROADCAST”);// 設置啟動什么樣的廣播
intent.setPackage(getPackageName); //上面講解了為什么要加入這個步驟
sendOrderedBroadcast(intent, null); // 啟動廣播
使用本地廣播
簡介:系統廣播和自定義廣播都屬于系統全部的廣播,即發出的廣播很有可能被其他任何應用程序接受,并且也可以接受來自于其他任何應用程序的廣播
為了廣播的安全問題,Android引入了本地廣播的機制,使用本地廣播發出的廣播只能在本應用內部進行傳遞,并且只能廣播接收器也只能接受本應用發出的廣播通知,這樣就可以解決被其他應用監聽廣播的安全問題了。
另外,本地廣播是無法通過靜態注冊的方式接收的。靜態注冊主要是為了讓程序在未啟動的情況下也能收到廣播,而發送本地廣播時,程序肯定已經啟動了,因此也完全不需要使用靜態注冊功能。
使用時也是需要初始化廣播:
public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private IntentFilter intentFilter;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);localBroadcastManager = LocalBroadcastManager.getInstance(this);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 發送廣播Intent intent = new Intent("com.zzz.mybroadcastreceiver.LOCAL_BROADCAST");localBroadcastManager.sendBroadcast(intent);}});intentFilter = new IntentFilter();intentFilter.addAction("com.zzz.mybroadcastreceiver.LOCAL_BROADCAST");localReceiver = new LocalReceiver();localBroadcastManager.registerReceiver(localReceiver,intentFilter);//注冊本地廣播監聽器}@Overrideprotected void onDestroy() {super.onDestroy();// 頁面效果,取消注冊廣播localBroadcastManager.unregisterReceiver(localReceiver);}// 接受廣播class LocalReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();}} }總結
以上是生活随笔為你收集整理的Android四大组件之广播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Python对文件进行批量重命名——
- 下一篇: Java部分面试题