成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 Android 中的廣播機制

移動開發 Android
Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊,這樣該程序就只會接受自己所關心的廣播內容,這些廣播內容可能是來自于系統,也可能是來自于其他應用程序的.

[[436469]]

前言

Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊,這樣該程序就只會接受自己所關心的廣播內容,這些廣播內容可能是來自于系統,也可能是來自于其他應用程序的;

Android 提供了一整套的 API,允許應用程序自由地發送和接受廣播

今天我們就來詳細介紹下

一. 廣播介紹

1、標準廣播

  • 這是一種完全異步執行的廣播,在廣播發出之后,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播消息,因此它們之間沒有任何先后順序可言。接收器不能對收到的廣播做任何處理,也不能截斷廣播繼續傳播;
  • 該種類的廣播用sendBroadcast發送;

2、有序廣播

  • 這是一種同步執行的廣播,在廣播發出之后,同一時刻只會有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執行完畢后,廣播才會繼續傳遞;
  • 所以此時的廣播接收器是有先后順序的,優先級高的廣播接收器就可以先收到廣播消息,并且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣后面的廣播接收器就無法收到廣播消息了;
  • 該種類的廣播用sendOrderedBroadcast發送;

3、粘性廣播

  • 粘性廣播的特點是Intent會一直保留到廣播事件結束,而這種廣播也沒有所謂的10秒限制,10秒限制是指普通的廣播如果onReceive方法執行時間太長,超過10秒的時候系統會將這個廣播置為可以被干掉的‘候選人’,一旦系統資源不夠的時候,就會干掉這個廣播而讓它不執行。該廣播用sendStickyBroadcast發送;
  • 在Android5.0 & API 21中已經失效,所以不建議使用;

二、廣播詳解

Android 內置了很多系統級別的廣播,我們可以在應用中通過監聽這些廣播來得到各種系統的狀態信息。比如手機開機后會發送一條廣播,電池的電量發生變化會發出一條廣播,時間或時區發生改變也會發出一條廣播等等;

注冊廣播方式一般有兩種:

動態注冊在代碼中注冊;

靜態注冊在 AndroidManifest.xml 中注冊

1、靜態注冊

一般為常駐廣播,在AndroidManifest.xml里通過標簽聲明

  1. <receiver android:name=".MyBroadcastReceiver"  android:exported="true"
  2.     <intent-filter> 
  3.         <action android:name="android.intent.action.BOOT_COMPLETED"/> 
  4.         <action android:name="android.intent.action.INPUT_METHOD_CHANGED" /> 
  5.     </intent-filter> 
  6. </receiver> 

intent過濾器里指定的是接收器訂閱的action;

2、動態注冊

非常駐廣播,在使用時注冊,用完及時銷毀;

  1. BroadcastReceiver br = new MyBroadcastReceiver(); 
  2. IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
  3.     filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
  4.     this.registerReceiver(br, filter); 

記得及時注銷,以免內存泄漏;

  1. @Override 
  2.  protected void onDestroy() { 
  3.      super.onDestroy(); 
  4.      unregisterReceiver(receiver); 
  5.  } 

3、自定義廣播

注冊廣播

  1.  <receiver 
  2.             android:name=".test.MyBroadcastReceiver" 
  3.             android:enabled="true" 
  4.             android:exported="true"
  5.             <intent-filter> 
  6.                 <action android:name="com.test.test" /> 
  7.             </intent-filter> 
  8.   </receiver> 
  9. public class MyBroadcastReceiver extends BroadcastReceiver { 
  10.     @Override 
  11.     public void onReceive(Context context, Intent intent) { 
  12.         Toast.makeText(context,"發送標準廣播",Toast.LENGTH_LONG).show(); 
  13.     } 
  14.   Intent intent = new Intent("com.test.test"); 
  15.                  sendBroadcast(intent); 
  16. //發送有序廣播 
  17.  Intent intent = new Intent("com.test.test"); 
  18.                  sendOrderedBroadcast(intent,null);  

4、本地廣播

我們發送和接受的廣播全部屬于系統全局廣播,即發出的廣播可以被其它任何應用程序接收到,并且我們也可以接受來自于其它任何應用程序的廣播;

為了解決廣播安全性問題,Android 引入了一套本地廣播機制,使用這個機制發出的廣播只能在應用程序內部進行傳遞,并且廣播接受器也只能接受來自本應用程序發出的廣播,這樣所有的安全性問題就都不存在了;

初始化廣播:

  1. private LocalBroadcastManager localBroadcastManager; 
  2.    private void init() { 
  3.        //獲取實例 
  4.        localBroadcastManager = LocalBroadcastManager.getInstance(this); 
  5.        IntentFilter intentFilter = new IntentFilter(); 
  6.        intentFilter.addAction("om.test.LOCAL_BROADCAST"); 
  7.        LocalReceiver localReceiver = new LocalReceiver(); 
  8.        localBroadcastManager.registerReceiver(localReceiver, intentFilter); 
  9.    } 
  10. Intent intent = new Intent("om.test.LOCAL_BROADCAST"); 
  11.        localBroadcastManager.sendBroadcast(intent); 
  12. 定義 
  13.    private class LocalReceiver extends BroadcastReceiver { 
  14.        @Override 
  15.        public void onReceive(Context context, Intent intent) { 
  16.            Toast.makeText(context, "本地廣播.....", Toast.LENGTH_LONG).show(); 
  17.        } 
  18.    } 

優點:

  • 可以明確知道正在發送的廣播不會離開我們的程序,因此不必擔心機密數據泄露:
  • 其它的程序無法將廣播發送到我們程序內部,因此不需要擔心會有安全漏洞問題:
  • 發送本地廣播比發送系統全局廣播更加高效:

5、帶權限的標準廣播

發廣播

當調用sendBroadcast(Intent, String)或sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)時,可以指定權限參數;

  1. sendBroadcast(new Intent("com.test"), 
  2.               Manifest.permission.SEND_SMS); 

要想接收這個廣播,那么這個接收的app必須申請該權限

  1. <uses-permission android:name="android.permission.SEND_SMS"/> 

接收廣播

如果在注冊廣播接收器時指定了權限參數(使用registerReceiver(BroadcastReceiver,IntentFilter,String,Handler)或清單文件中的里),則只有在清單文件中使用請求權限的廣播發送者才可以將Intent發送給接收者;

在清單文件中聲明:

  1. <receiver android:name=".MyBroadcastReceiver" 
  2.           android:permission="android.permission.SEND_SMS"
  3.     <intent-filter> 
  4.         <action android:name="com.test"/> 
  5.     </intent-filter> 
  6. </receiver> 

在注冊的時候聲明:

  1. IntentFilter filter = new IntentFilter("com.test); 
  2. registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null ); 

要給它發消息,那廣播發送的app就必須得申請獲得相應的權限才行:

  1. <uses-permission android:name="android.permission.SEND_SMS"/> 

總結

動態注冊廣播不是常駐型廣播,也就是說廣播跟隨Activity的生命周期。注意在Activity結束前,移除廣播接收器;

靜態注冊是常駐型,也就是說當應用程序關閉后,如果有信息廣播來,程序也會被系統調用自動運行;

當廣播為有序廣播時:優先級高的先接收(不分靜態和動態)。同優先級的廣播接收器,動態優先于靜態;

同優先級的同類廣播接收器,靜態:先掃描的優先于后掃描的,動態:先注冊的優先于后注冊的;

當廣播為默認廣播時:無視優先級,動態廣播接收器優先于靜態廣播接收器。同優先級的同類廣播接收器,靜態:先掃描的優先于后掃描的,動態:先注冊的優先于后冊的;

本文轉載自微信公眾號「Android開發編程」

責任編輯:姜華 來源: Android開發編程
相關推薦

2013-03-26 13:55:45

Android Bro

2024-04-18 08:27:05

Android數據類型

2025-02-05 12:22:21

2011-09-27 10:23:24

Java反射機制

2013-03-28 09:07:37

Android開發Intent機制

2017-05-15 19:40:40

AndroidIPC機制

2024-07-02 08:32:19

2025-02-26 10:49:14

2012-05-25 09:09:25

Windows Pho

2010-07-07 18:34:43

UML公共機制

2010-06-08 18:01:00

UML組成

2011-06-29 17:20:20

Qt 內存 QOBJECT

2009-09-23 16:30:01

Hibernate f

2011-05-26 15:23:34

JavaReflection

2020-04-24 15:44:50

MySQL數據庫鎖機制

2013-03-28 16:12:12

Message機制應用

2013-04-11 12:40:16

Android消息機制

2024-09-06 17:49:46

2009-04-10 09:55:44

C#反射.NET

2009-07-15 09:15:26

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩国产一区 | 奇米超碰 | 天堂一区 | 久久久噜噜噜久久中文字幕色伊伊 | 日韩在线中文字幕 | 亚洲第一区久久 | 久久里面有精品 | 伊人欧美视频 | av在线一区二区三区 | 狠狠草视频 | 午夜日韩 | sese视频在线观看 | 久久乐国产精品 | 午夜免费观看体验区 | 亚洲精品一区二区三区中文字幕 | 久久久亚洲 | 久久av一区 | 一区二区三区欧美在线观看 | 欧美精品久久久 | 欧美一区二区三区精品 | 午夜天堂精品久久久久 | 欧美一区二区三区在线观看视频 | 中文字幕av色 | 久久久久久久久久久久91 | 亚洲精品一区二区三区蜜桃久 | 国产精品视频播放 | 天天操天天摸天天干 | 久在线观看| 中文字幕加勒比 | 亚洲精品一 | 国产亚洲一区精品 | 琪琪午夜伦伦电影福利片 | 狠狠av| 日韩在线第一 | 国产精品成人品 | 国产成人高清视频 | 欧美日韩免费在线 | 亚洲免费在线观看视频 | 91精品国产一区二区三区 | 国产精品一区二区在线 | 日韩超碰 |