Android應用程序可以發送廣播,也可以接收Android系統或者其它應用發出的廣播,這跟發布-訂閱設計模式很相似。當一些受到關心的事件發生后,廣播會被自動發送。舉例來說,當一些系統事件(如開機,設備開始充電等)發生,Android系統會發送廣播。應用程序也可以發送自定義的廣播,比如當某個應用關注的事件(如數據更新等)發生后可以發送廣播提醒它。
當一系列系統事件發生的時候,系統會自動發送廣播,比如飛行模式的切換。系統廣播會發送給所有注冊監聽廣播的應用。
廣播消息封裝在一個Intent對象中,其中的action屬性標識的事件的類型(比如android.intent.action.AIRPLANE_MODE),可能在intent的附件字段還包含了附加的信息。比如,用于表示飛行模式的intent包含一個附加的布爾字段來表示飛行模式的狀態是開啟還是關閉。
如果想要具體了解如何如何讀取一個intent并且獲取附加字段,參閱Intents and Intent Filters
參閱Android SDK中的BROADCAST_ACTIONS.TXT來了解所有系統廣播的action。每一個系統廣播都有一個常量與其綁定。比如,常量ACTION_AIRPLANE_MODE_CHANGED表示android.intent.action.AIRPLANE_MODE。每一個廣播的action的文檔都在與其關聯的常量域中。
Android 7.0或更高版本不再發送下列系統廣播,這項優化會影響所有的應用程序,而不只是那些針對Android 7.0開發的程序。
針對Android 7.0(API level 24)或更新版本開發的應用必須在程序中使用 ACTION_NEW_PICTURE
ACTION_NEW_VIDEO
注冊監聽下列的廣播,在程序清單中聲明不再有效。
應用程序可以使用兩種方式接收廣播:在應用清單中定義一個廣播接收器;在程序中注冊一個廣播接收器。
要定義一個靜態廣播接收器,執行下面的步驟:
當應用程序安裝的時候,軟件包管理器會在系統中注冊廣播接收器。之后這個廣播接收器就變成了你的應用程序中一個獨立的入口,這就意味著如果你的應用程序不在運行,系統可以啟動你的程序并傳遞廣播。
系統會創建一個新的BroadcastReceiver組件對象來處理接收到的廣播。這個對象只在調用onReceive(Context, Intent)方法期間有效。一旦從該方法返回,系統就認為這個組件對象已經失效。
要注冊一個上下文相關的動態廣播接收器,執行以下步驟:
你的廣播接收器的狀態會影響它所在的進程的狀態,轉而會影響進程被系統殺死的可能性。比如,當一個進程執行一個廣播接收器(執行onReceive()方法中的代碼),它會被當作一個前臺進程。除非內存極度匱乏,否則系統會一直讓該進程運行。
然而,一旦從onReceive()返回,廣播接收器就不再處于激活狀態,它的宿主進程也就跟其它的普通進程具有相同的優先級。如果那個進程只擁有一個在應用清單中定義的接收器,那么當從onReceive()返回后,系統會把它當作一個低優先級的進程,當其它優先級更高的進程需要更多內存的時候,它就可能被殺掉。
鑒于這個原因,你不應該在一個廣播接收器中啟動一個長時間在后臺運行的線程。當從onReceive()返回后,系統可能會殺掉進程來回收內存,這會結束所有運行在這個進程中的線程。為了避免這種情況,你要么調用goAsync()(如果你希望能夠長時間在后臺線程中運行廣播接收器),要么在接收器中使用JobScheduler調度一個JobService。這樣系統就直到你的進程還在繼續執行任務。參閱 Processes and Application Life Cycle來獲取更多信息。
下面的代碼片段展示了使用goAsync()來標識進程需要更多時間來完成任務。如果你要執行的任務會造成UI阻塞(>16ms),這種方式非常有效。
```public class MyBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "MyBroadcastReceiver"; @Override public void onReceive(final Context context, final Intent intent) { final PendingResult pendingResult = goAsync(); AsyncTask<String, Integer, String> asyncTask = new AsyncTask<String, Integer, String>() { @Override protected String doInBackground(String... params) { StringBuilder sb = new StringBuilder(); sb.append("Action: " + intent.getAction() + "n"); sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "n"); Log.d(TAG, log); // Must call finish() so the BroadcastReceiver can be recycled. pendingResult.finish(); return data; } }; asyncTask.execute(); }}```
Android提供了三種發送廣播的方式:
下面的代碼片段示范了如何通過創建Intent并且調用sendBroadcast(Intent)來發送廣播:
Intent intent = new Intent();intent.setAction("com.example.broadcast.MY_NOTIFICATION");intent.putExtra("data","Notice me senpai!");sendBroadcast(intent);
廣播消息被封裝在一個Intent對象中。intent的action屬性必須提供應用的包名并且能夠唯一地標識一個廣播事件。你可以通過調用putExtra(String, Bundle)來附加額外的xinxi。你也可以通過調用intent的setPackage(String)方法來將廣播范圍限定在某個組織的一系列應用的范圍之內。
注意:雖然intents同時被用來發送廣播和啟動Activity,但是這些行為之間并沒有任何關聯。廣播接收器無法捕捉到用來啟動Activity的intent;同樣地,當你廣播一個intent,你也無法啟動一個Activity。
權限機制可以讓你將廣播的范圍限制在一系列擁有特定權限的應用之間。你既可以限制發送發,也可以限制接收方。
當你調用sendBroadcast(Intent, String)或者 sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)時,你可以指定一個權限參數。只有應用在應用清單中申請了那個權限,其中的receiver才能接收到廣播。比如下面的代碼發送了一個帶權限的廣播:
sendBroadcast(new Intent("com.example.NOTIFY"), Manifest.permission.SEND_SMS);
要接收這個廣播,應用必須申請下面的權限:
<uses-permission android:name="android.permission.SEND_SMS"/>
你既可以指定一個系統中已經存在的權限,比如SEND_SMS,也可以用自定義一個權限。關于權限的詳情請參考System Permissions。
如果你在注冊receiver的時候指定了一個權限參數,那么只有申請了相應權限的應用才能夠向你的receiver發送廣播。
比如,假設你的receiver在應用清單中這樣定義:
<receiver android:name=".MyBroadcastReceiver" android:permission="android.permission.SEND_SMS"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"/> </intent-filter></receiver>
或者在代碼中這樣定義一個上下文相關的receiver:
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null );
那么,如果你要向這些receiver發送廣播,發送方必須申請如下的權限:
<uses-permission android:name="android.permission.SEND_SMS"/>
下面是關于發送和接收廣播的安全性考慮和最佳使用方案:
148542.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
ps4發售上市時間?國行PS4主機于2014年12月12日零點開啟國內預售,2015年1月11日正式發售。Ps4多少年前出的?八年前,2014年2月22日是PS4在日本發售的日子,而國行的PS4是2015年3月20日發售的。到目前為止,PS4銷量已經超過1.169億臺,足以稱得上流行硬件。PlayStation4是索尼銷售的一款固定家用游戲機,被親切地稱為 "PS4 "被游戲玩家。如序列號所示,...
安徽界首市屬于哪個市 界首在安徽哪里?界首在哪里? 界首,安徽省縣級市,由阜陽市管理,位于安徽省西北部,又稱界溝和小上海。南接臨泉縣、阜陽,東接太和縣,西北與河南省沈丘、丹城交界。因南宋著名將軍劉琦失敗而得名??谷諔馉幤陂g,由于交通堵塞,界首沒有受到日軍的侵犯,上海、南京等城市的商人紛紛遷往界首。一度,人口急劇增加,商人聚集,貿易繁榮,因此被譽為小上海。首領歷史悠久,文化豐富。東漢時期,王莽和...
123木頭人是男的唱的嗎?《123木頭人》的這首歌的原唱是一個女子團體“黑女孩”?!?23木頭人》是一首由徐潔兒和王亞軍作詞,徐潔兒作曲,省黑人女孩演唱的歌曲,收錄在該樂隊2006年發行的專輯《粉紅高壓電》中。后來123 Woodenhead有了男版,由歌手水煮魚演唱。黑妹的原名是黑澀谷美美,是2006年由星媒社成立的省女子歌唱團體。這個組合之前有9個成員,分別是吳映潔、黃暐婷、周宜霈、王婧喬、詹...