Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android BroadcastReceiver基礎詳解一

Android BroadcastReceiver基礎詳解一

編輯:關於Android編程

-、BroadcastReceivcer概述


1、什麼是廣播

BroadcastReceiver是Android四大組件之一,本質是一種全局的監聽器,用於監聽系統全局的廣播消息。因此它可以非常方便的實現不同組件之間的通信。


2、BroadcastReceiver的創建啟動

BroadcastReceiver是用用於接受程序所放出的Broadcast Intent,與應用程序啟動的Activity、Service相同。也只需要兩步:

①、創建需要啟動的Broadcast的Intent

②、創建一個類繼承BroadcastReceiver,在清單文件中注冊Receiver,調用content的SendBroadcast()或sendOrderedBroadcast()(發送有序廣播)的方法來啟動指定的BroadcastReceiver

注:當應用程序發出一個Broadcast Intent之後,所有匹配該Intent的BroadcastReceiver都會啟動。如果你不需要發送廣播跨應用程序,考慮使用 這類 LocalBroadcastManager

1 2 3 4 5 6 7 8 9 10 11 12 13 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_startbroadcast = (Button) this.findViewById(R.id.bt_startbroadcast); bt_startbroadcast.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(MainActivity.this, myBroadcast.class); intent.putExtra("broadcast", "hello,world! broadcast"); sendBroadcast(intent); } }); }


1 2 3 public void onReceive(Context context, Intent intent) { Toast.makeText(context,"receiver-----" + intent.getStringExtra("broadcast"), 1).show(); }

3、有序廣播

  • 正常播放 (發送 Context.sendBroadcast )是完全異步的。 所有的BroadcastReceiver是運行在一個未定義的順序,常常在同一時間。 這時效率更高,但是意味著BroadcastReceiver器,不能使用結果或中止 。

  • 有序廣播 (發送 Context.sendOrderedBroadcast )交付給一個BroadcastReceiver。 因為每個BroadcastReceiver執行後返回值,它可以傳播到下一個BroadcastReceiver,也可以完全通過abortBroadcast()方法終止廣播,這樣它就不會通過再通過後面的BroadcastReceiver兩人。 在清單文件中可以控制運行 android:priority="" 的屬性匹配intent-filter;BroadcastReceiver相同的優先級將運行在一個任意的順序。


    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class MainActivity extends Activity { private Button bt_start; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_start = (Button) this.findViewById(R.id.bt_start); bt_start.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(); intent.setAction("abc"); intent.putExtra("name", "hello,BroadcastReceivcer"); sendBroadcast(intent); } }); } 1 2 3 4 public void onReceive(Context arg0, Intent intent) { String name = intent.getStringExtra("name"); System.out.println("one=======" + name); }


    1 2 3 4 5 <receiver android:name="com.example.broadcast_order.One" > <intent-filter android:priority="10" > <action android:name="abc" /> intent-filter> receiver>


    1 2 3 4 5 6 7 8 public class Two extends BroadcastReceiver { public void onReceive(Context arg0, Intent intent) { String name = intent.getStringExtra("name"); System.out.println("Two=======" + name); // 取消Broadcast繼續傳遞 abortBroadcast(); } }



    1 2 3 4 5 <receiver android:name="com.example.broadcast_order.Two" > <intent-filter android:priority="12" > <action android:name="abc"/> intent-filter> receiver>


    二、Receiver的生命周期

    由於BroadcastReceiver本質上屬於一個監聽器,因此實現BroadcastReceiver的方法也十分簡單,只要重寫BroadcastReceiver方法中的onReceiv(Content content,Intent intent)方法即可。

    每次系統Broadcast事件發生後,系統就會創建對應的BroadcastReceiver的實例,並且自動觸發他的onReceive()方法,onReceive()方法執行完後,Broadcast的實例就會被銷毀。也就是說Broadcast的生命周期就是onReceive()這個方法。

    如果Broadcast的onReceive()方法不能在10秒內執行完成,Android會認為該程序無響應。所以不要在BroadcastReceiver的onReceive()方法中執行一些耗時操作,否則會彈出ANR的對話框。若必須要執行比較耗時的操作,則要考慮Intent的啟動一個Service來完成操作。不應該考慮使用新線程去完成耗時的操作,因為BroadcastReceiver的生命周期太短了。


    三、Receiver實現電池電量監控

    1 2 3 4 5 6 7 8 9 10 11 12 13 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_startbroadcast = (Button) this.findViewById(R.id.bt_startbroadcast); bt_startbroadcast.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 指定Broadcast能匹配Intent的方法有兩種,一種是清單文件中寫配置,一種是代碼指定如下 IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); myBroadcast receiver = new myBroadcast();// new出自定義BroadcastReceiver的類 registerReceiver(receiver,filter); } }); }


    1 2 3 4 5 6 7 8 public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(intent.ACTION_BATTERY_CHANGED)) { // 獲取當前電量 int level = intent.getIntExtra("level", 0); // 獲取總的電量 int scale = intent.getIntExtra("scale", 100); Toast.makeText(context, "電池電量為:" + ((level * 100) / scale) + "%", 1).show(); }


    注意要在清單文件中添加獲取電量權限狀態的權限:

    四、開機自動運行

    在自定義的BroadcastReceiver中啟動activities或Service

    1 2 3 4 5 public void onReceive(Context context, Intent intent) { Intent intent1 = new Intent(context, BootActivity.class); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //注冊Activity時要使用setFlag()。Service不用 context.startActivity(intent1); }

    清單文件中注冊Receiver

    1 2 3 4 5 6 <receiver android:name="com.example.BroadcastReceiverDemo.myBroadcast" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> intent-filter> receiver>

    增加開機訪問的權限:
























  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved