Android攻城狮组件篇—BroadcastReceiver
生活随笔
收集整理的這篇文章主要介紹了
Android攻城狮组件篇—BroadcastReceiver
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
組件篇—BroadcastReceiver
1. Boastcast(廣播)是一種廣泛運用的在應用程序之間傳輸信息的機制。
2. BroadcastReceiver(廣播接受者)是對發送出來的廣播進行過濾并響應的一類組件,它就是用來接收來自系統和應用中的廣播。
3. 用途:
* 當開機完成后系統會產生一條廣播;有些程序會接收此廣播而啟動程序,這就是“自啟動”。
* 當網絡狀態改變時系統會產生一條廣播;一般用于提示用戶。
* 當電池電量改變時,系統會產生一條廣播;
* 其他。
----------------
為什么需要廣播?
假如沒有廣播,那么,很多事情都要自己做,需要自己想辦法去獲取數據。
有了廣播,我們只需等待廣播告訴我們信息。
廣播的優點:
1. 大大減少開發的工作量和開發周期
2. 作為應用開發者,只需要掌握 BroadcastReceiver,不需要了解底層實現。
使用方法: 發送: 1. 把信息裝入一個 Intent對象(如Action、Category) 2. 通過調用相應的方法將 Intent對象以廣播方式發送出去:sendBroadcast()sendOrderBroadcast()sendStickyBroadcast() 接收:當 Intent 發送以后,所有已經注冊的 BroadcastReceiver 會檢查注冊時的 IntentFilter 是否與發送的 Intent 相匹配,若匹配則就會調用 BroadcastReceiver的 onReceive()方法。所以當我們定義一個 BroadcastReceiver 的時候,都需要實現 onReceive()方法。注意:BroadcastReceiver需要注冊* 靜態注冊* 代碼注冊 注意!!!! 1. BroadcastReceiver 生命周期只有十秒左右。 2. BroadcastReceiver 里面不能做一些耗時操作(就是因為生命周期短) 3. 耗時操作應該通過發送 Intent 給 Service,由Service來完成 4. 不能使用子線程。使用子線程不可靠!因為BroadcastReceiver生命周期太短,可能接收都結束了,子線程還沒結束。接收器一旦結束了,Receiver所在的進程很容易在需要的時候被殺死,因為此時它是空進程(沒有任何活動組件的進程就是空進程),一旦宿主進程被殺掉了,那么正在工作的子進程也會被殺死。 廣播的種類: 1. 普通廣播(Normal broadcasts)所有監聽該廣播的廣播接收者都可以監聽到該廣播。 2. 有序廣播(Ordered broadcasts)按照接收者的優先級順序接收廣播,優先級別在 intent-filter中的priority中聲明,-1000到1000之間,值越大,優先級越高。可以終止廣播意圖的繼續傳播。接收者可以篡改內容。 3. 異步廣播(粘滯性滯留廣播)不能將處理結果傳給下一個接收者,無法終止廣播。
總結:
使用方法: 發送: 1. 把信息裝入一個 Intent對象(如Action、Category) 2. 通過調用相應的方法將 Intent對象以廣播方式發送出去:sendBroadcast()sendOrderBroadcast()sendStickyBroadcast() 接收:當 Intent 發送以后,所有已經注冊的 BroadcastReceiver 會檢查注冊時的 IntentFilter 是否與發送的 Intent 相匹配,若匹配則就會調用 BroadcastReceiver的 onReceive()方法。所以當我們定義一個 BroadcastReceiver 的時候,都需要實現 onReceive()方法。注意:BroadcastReceiver需要注冊* 靜態注冊* 代碼注冊 注意!!!! 1. BroadcastReceiver 生命周期只有十秒左右。 2. BroadcastReceiver 里面不能做一些耗時操作(就是因為生命周期短) 3. 耗時操作應該通過發送 Intent 給 Service,由Service來完成 4. 不能使用子線程。使用子線程不可靠!因為BroadcastReceiver生命周期太短,可能接收都結束了,子線程還沒結束。接收器一旦結束了,Receiver所在的進程很容易在需要的時候被殺死,因為此時它是空進程(沒有任何活動組件的進程就是空進程),一旦宿主進程被殺掉了,那么正在工作的子進程也會被殺死。 廣播的種類: 1. 普通廣播(Normal broadcasts)所有監聽該廣播的廣播接收者都可以監聽到該廣播。 2. 有序廣播(Ordered broadcasts)按照接收者的優先級順序接收廣播,優先級別在 intent-filter中的priority中聲明,-1000到1000之間,值越大,優先級越高。可以終止廣播意圖的繼續傳播。接收者可以篡改內容。 3. 異步廣播(粘滯性滯留廣播)不能將處理結果傳給下一個接收者,無法終止廣播。
?-------------------------
普通廣播的示例:-------------------------------
1 普通廣播的示例: 2 1. 先在主界面設置一個Button,設置點擊事件doClick。 3 2. 在 MainActivity 中實現方法doClick(): 4 public void doClick(View view){ 5 switch (view.getId()){ 6 case R.id.btn_send1: // 發送普通廣播 7 Intent intent = new Intent(); // 發送信息就要創建一個Intent 8 intent.putExtra("msg","這是一條普通廣播"); 9 // 設置一個標識,用于過濾(會在注冊的時候用到) 10 intent.setAction("BC_ONE");// 其實這里最好使用完整類名,但因為只是舉個例子,所以寫成“BC_ONE” 11 // 將intent發送出去 12 sendBroadcast(intent); 13 break; 14 } 15 } 16 然后新建一個類 BC1 ,繼承 BroadcastReceiver 并實現方法 onReceive(): 17 public void onReceive(Context context, Intent intent) { 18 String s = intent.getStringExtra("msg"); 19 System.out.printf("receive1收到消息:"+s); 20 } 21 最后,在配置文件 AndroidManifest中注冊接收者: 22 <receiver android:name=".BC1"> 23 <intent-filter android:priority="100"> 24 <action android:name="BC_ONE"></action> 25 </intent-filter> 26 </receiver> 27 其中 android:priority="100" 是把優先級設置為100,一般的范圍是-1000到1000。 28 ----------------- 29 截斷廣播: abortBroadcast(); 30 普通廣播之下,若在優先級較高的BC2的類里面添加: 31 abortBroadcast(); 32 是不能截斷廣播的,BC1仍然會收到廣播,并且系統會報錯。 動態注冊 在 MainActivity 的onCreate()方法里面直接注冊: IntentFilter intentFilter = new IntentFilter("BC_ONE"); // 動態注冊所需的過濾器 BC3 bc3 = new BC3(); // 動態注冊的對象 registerReceiver(bc3,intentFilter); // 接收器的動態注冊 1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.fragment_main); 7 // 動態注冊 8 9 /* 10 IntentFilter filter = new IntentFilter("bc1"); 11 BC1 bc1 = new BC1(); 12 registerReceiver(bc1, filter); 13 */ 14 15 } 16 17 public void doClick(View view) { 18 switch (view.getId()) { 19 case R.id.button1:// 發生普通廣播 20 Intent intent = new Intent(); 21 intent.putExtra("msg", "這是普通廣播"); 22 intent.setAction("bc1"); 23 sendBroadcast(intent); 24 break; 25 case R.id.button2:// 發生有序廣播 26 Intent intent2 = new Intent(); 27 intent2.putExtra("msg", "這是有序廣播"); 28 intent2.setAction("bc1"); 29 sendOrderedBroadcast(intent2, null); 30 break; 31 32 case R.id.button3:// 發生普通廣播 33 Intent intent3 = new Intent(); 34 intent3.putExtra("msg", "這是有序廣播"); 35 intent3.setAction("bc3"); 36 sendStickyBroadcast(intent3); 37 IntentFilter filter = new IntentFilter("bc3"); 38 BC3 bc3 = new BC3(); 39 registerReceiver(bc3, filter); 40 break; 41 } 42 } 43 }?
“粘滯性”是需要在配置文件中添加權限的:異步: <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses>總結:
// 普通廣播不能被截斷,
// 同級別接收先后是隨機的
// 可以由清單文件中android:priority="100" 優先級指定
// 同級別動態注冊優先級高于靜態注冊
// 數據不能處理
?
// 有序廣播能中斷
// 有序廣播數據能處理----
轉載于:https://www.cnblogs.com/my334420/p/6735917.html
總結
以上是生活随笔為你收集整理的Android攻城狮组件篇—BroadcastReceiver的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D Shader 新手教程(
- 下一篇: 3月4日 与柳传志面对面(谁是这个时代的