1. 程式人生 > >Android筆記三十三.BroadcastReceiver使用

Android筆記三十三.BroadcastReceiver使用

mod 調用 raw ras ive ceo () 廣泛 全部

廣播是一種廣泛運用在應用程序之間傳輸信息的機制,而BroadcastReceiver是對發送出來的廣播進行過濾接收並響應的一類組件。

BroadcastReceiver本質上是一種全局監聽器用於監聽系統全局的廣播消息並接收指定的廣播,因此它能夠很方便地實現系統中不同組件之間的通信。例如以下為BroadcastReceiver知識點結構:

技術分享 一、發送與接收廣播 1.發送廣播 廣播的發送通過調用Context.sendBroadcast()、Context.sendOderedBroadcast()來實現: (1)Context.sendBroadcast(Intent intent)
:用於發送普通廣播。當中intent參數表示接收該廣播的廣播接收者所須要滿足的條件,以及廣播所傳遞的數據;
(2)Context.sendOderedBroadcast(Intent intent, String receiverPermission):用於發送有序廣播。intent參數同上。receiverPermission表示接收該廣播的許可權限。 2.接收廣播 廣播的接收,則利用組件BroadcastReceiver是對發送出來的廣播進行過濾接收並響應指定的廣播。通常一個廣播能夠被訂閱了該Intnet的多個廣播接收者所接收。如同一個廣播臺。能夠被多個多位聽眾收聽一樣。
啟動BroadcastReceiver步驟: (1)創建Intent,指定BroadcastReceiver的特征; (2)調用Context的sendBroadcast()(發送普通廣播)或sendOrderBroadcast()(發送有序廣播)方法來發送廣播,觸發指定的BroadcasttReceiver。

為此,當應用程序發出一個廣播之後,全部匹配該Intent的BroadcastReceiver都有可能被啟動。 二、廣播的分類 1.普通廣播 是全然異步的。能夠在同一時刻(邏輯上)被全部接收者接收到,消息傳遞的效率比較高。

但缺點是接收者不能將處理結果傳遞給下一個接收者。而且無法終止Broadcast Intent的傳播。

2.有序廣播 該廣播的接收者將按預先聲明的優先級次序接收廣播。

有序廣播接收者能夠終止廣播的傳播(通過調用abortBroadcast()方法)。廣播的傳播一旦終止,後面的接收者就無法接收到廣播。另外,廣播的接收者能夠將數據傳遞給下一個接收者(通過setResultExtras(Bundle bundle)方法)。

三、BroadcastReceiver應用開發步驟 BroadcastReceiver自身並不實現圖形用戶界面,可是當它收到某個消息之後,能夠啟動Activity作為響應,或者通過NotificationManager提醒用戶,或者啟動Service等等。

1.創建廣播接收器

實現一個繼承於BroadcastReceiver基類的子類,並實現裏面的onReceiver()方法;

  1. public class MyBroadcastReceiver extends BroadcastReceiver
  2. {
  3. public void onReceiver(Context context,Intent intent){
  4. }
  5. }
在onReceiver()方法中,接收了一個Intent的參數,通過它能夠獲取廣播所攜帶的數據。也能夠啟動一個Service服務來處理耗時任務等 2.發送廣播,並指定該廣播的Intent屬性 廣播接收者註冊好了以後。並不會直接執行,必須在接收廣播之後才會被調用。因此。必須首先發送廣播,在Activity或Service調用Context的sendBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent, String receiverPermission)發送廣播。
3.註冊廣播接收器。指定其接收哪一個廣播。

創建完廣播接收者後。並不能立即使用,還必須為它(廣播接收者)註冊一個指定的廣播。就如同我們有了收音機後,還必須選擇收聽哪個頻道一樣。

(1)靜態註冊:是指在AndroidManifest.xml文件裏進行註冊。
  1. <receiver android:name=".MyBroadcastReceiver">
  2. <intent-filter>
  3. <action
  4. android:name = "com.jiangdongguo.android.myBroadcastReceover">
  5. <action/>
  6. </intent-filter>
  7. </receiver>
(2)動態註冊:須要在代碼中動態的指定廣播地址並註冊,一般是在Activity或Service中調用ContextWrapper的
  1. MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
  2. IntentFilter filter = new IntentFilter("com.jiangdongguo.android.myBroadcastReceover"); //指定接收哪個廣播
  3. registerReceiver(BroadcastReceiver receiver。IntentFilter filter)方法進行註冊
當中,MyBroadcastReceiver為基類BroadcastReceiver子類。

註冊完畢後。就可以接收相應的廣播消息。一旦廣播(Broadcast)事件發生後,系統就會創建相應的BroadcastRecevier實例,並自己主動觸發它的onReceiver()方法,onReceiver()方法運行後,BroadcastReceiver的實例就會被銷毀。

三、源代碼實戰 實現:在Activity中啟動一個廣播,通過廣播接收器接收該廣播並作出響應。 1.MyBroadcastReceiver.java: 繼承於BroadcastReceiver子類-廣播接收器,用於接收指定廣播並作出對應響應。

  1. package com.example.mybroadcast;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.widget.Toast;
  6. /*BroadcastReceiver子類
  7. * 用於接收指定發送廣播*/
  8. public class MyBroadcastReceiver extends BroadcastReceiver {
  9. @Override
  10. public void onReceive(Context arg0, Intent arg1) {
  11. Toast.makeText(arg0, "我是BroadcastReceiver,我已經接收到發送的廣播。", Toast.LENGTH_SHORT).show();
  12. }
  13. }
凝視:我們能夠在onReceiver()方法中獲取Intent攜帶的數據,也能夠啟動一個Service服務來運行耗時任務等。 2.MainActivity.java 主Activity。用於發送一個廣播。或者能夠取代AdroidManifest.xmlproject文件註冊廣播接收器
  1. package com.example.mybroadcast;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.content.IntentFilter;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. public class MainActivity extends Activity {
  10. private Button sendBroad;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. /*1.廣播接收器註冊方式二:註冊一個廣播接收器*/
  16. MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
  17. IntentFilter filter = new IntentFilter("com.jiangdongguo.Android.BroadcastReceiver");
  18. registerReceiver(myBroadcastReceiver,filter);
  19. sendBroad = (Button)findViewById(R.id.send);
  20. sendBroad.setOnClickListener(new OnClickListener(){
  21. public void onClick(View v) {
  22. /*2.發送一個廣播,並指明其action屬性*/
  23. //a.指明該廣播的action屬性
  24. Intent intent = new Intent("com.jiangdongguo.Android.BroadcastReceiver");
  25. //b.發送廣播
  26. sendBroadcast(intent);
  27. }
  28. });
  29. }
  30. }
3.AndroidManifest.xml project文件。在這裏的作用是添加對BroadcastReceiver註冊。

  1. <?xml version="1.0" encoding="utf-8"?

    >

  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.mybroadcast"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="14" />
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@drawable/ic_launcher"
  12. android:label="@string/app_name"
  13. android:theme="@style/AppTheme" >
  14. <activity
  15. android:name=".MainActivity"
  16. android:label="@string/app_name" >
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN" />
  19. <category android:name="android.intent.category.LAUNCHER" />
  20. </intent-filter>
  21. </activity>
  22. <!--廣播接收器註冊方式一: 接收的哪一個廣播-->
  23. <!-- <receiver android:name=".MyBroadcastReceiver">
  24. <intent-filter >
  25. <action android:name="com.jiangdongguo.Android.BroadcastReceiver"/>
  26. </intent-filter>
  27. </receiver> -->
  28. </application>
  29. </manifest>
效果演示 技術分享 源代碼分析: (1)假設確定須要依據廣播來完畢一項比較耗時的操作,則能夠考慮通過Intent啟動一個Service來完畢操作。不應考慮使用新線程去完畢耗時的操作。由於BroadcastReceiver本身的生命周期極短,可能出現的情況是子線程可能沒有結束,BroadcastReceiver就已經退出了。

(2)假設廣播接收者所在的進程結束了,盡管該進程內還實用戶啟動的新線程。但因為該進程內不包括不論什麽活動組件,因此系統可能在內存緊張時優先結束線程

這樣就可能導致BroadcastReceiver啟動的子線程不能運行完畢




Android筆記三十三.BroadcastReceiver使用