1.BroadCast 廣播:
使用很簡單,實例化一個意圖對象,把要發送的信息封裝在意圖對象中,然後使用
Context。sendBroadCast()方法,把意圖對象發送(即廣播)出去。
代碼示例:
- //用給出的action創建一個意圖對象,該action在廣播過濾器中要用到
- Intent intent = new Intent("bc1");
- //要廣播的信息
- intent.putExtra("val", BroadcastReceiver1.class.getName());
- //發送廣播
- sendBroadcast(intent);
2.BroadCastReceiver廣播接收器:
必須建立一個廣播接收器來接收廣播消息,廣播接收器的核心是過濾器IntentFilter。
建立廣播接收器分爲靜態建立和動態建立:
首先要新建一個廣播接收類繼承BroadcastReceiver,重寫onReceive方法;
代碼示例,BroadcastReceiver1 .java:
- public class BroadcastReceiver1 extends BroadcastReceiver {
- @Override
- public void onReceive(Context arg0, Intent arg1) {
- String val = arg1.getStringExtra("val");
- Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();
- }
- }
①如果是靜態建立:在清單文件中註冊BroadCastReceiver;
代碼示例,AndroidManifest.xml:
- <receiver android:name=".BroadcastReceiver1">
- <intent-filter >
- <action android:name="bc1"/>
- </intent-filter>
- </receiver>
receiver節點的android:name是廣播接收類的類名,intent-filter節點的android:name爲要過濾的廣播消息,只接受
action="bc1"的廣播。
這樣通過sendBoardCast(intent)發送出來的廣播,被該廣播接收器通過廣播過濾器匹配後接收,並通過onReceive()方
法處理接收到的信息,完成了整個信息傳遞的過程。
②如果是動態建立,不需要在清單文件中註冊BroadCastReceiver,在發送廣播的類中實例化一個IntentFiltler的成員變
量,並在onStart()方法中註冊廣播過濾器,在onStop()方法中註銷廣播過濾器。
代碼示例:
- public class MainAct extends Activity {
- IntentFilter intentFilter = new IntentFilter();
- BroadcastReceiver2 bc2 = new BroadcastReceiver2();
- ......
- @Override
- protected void onStart() {
- super.onStart();
- intentFilter.addAction("bc2");
- registerReceiver(bc2, intentFilter);//註冊監聽
- }
- @Override
- protected void onStop() {
- super.onStop();
- unregisterReceiver(bc2); //取消監聽
- }
- }
--------------------------------------------------本示例完整代碼--------------------------------------------------------------
AndroidManifest.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.wyx.demo"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="8" />
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MainAct"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <receiver android:name=".BroadcastReceiver1">
- <intent-filter >
- <action android:name="bc1"/>
- </intent-filter>
- </receiver>
- </application>
- </manifest>
MainAct.java:
- /**
- * 該頁面負責發送廣播信息:
- * 發送廣播消息,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,
- * 然後通過調用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,
- * 把 Intent對象以廣播方式發送出去。
- */
- public class MainAct extends Activity {
- IntentFilter intentFilter = new IntentFilter();
- BroadcastReceiver2 bc2 = new BroadcastReceiver2();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn1 = (Button)findViewById(R.id.btn1);
- btn1.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent("bc1");
- intent.putExtra("val", BroadcastReceiver1.class.getName());
- sendBroadcast(intent);
- }
- });
- Button btn2 = (Button)findViewById(R.id.btn2);
- btn2.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent("bc2");
- intent.putExtra("val", BroadcastReceiver2.class.getName());
- sendBroadcast(intent);
- }
- });
- }
- @Override
- protected void onStart() {
- super.onStart();
- intentFilter.addAction("bc2");
- registerReceiver(bc2, intentFilter);//註冊監聽
- }
- @Override
- protected void onStop() {
- super.onStop();
- unregisterReceiver(bc2); //取消監聽
- }
- }
BroadcastReceiver1.java:
- public class BroadcastReceiver1 extends BroadcastReceiver {
- @Override
- public void onReceive(Context arg0, Intent arg1) {
- String val = arg1.getStringExtra("val");
- Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();
- }
- }
Context.sendBroad()主要是用來廣播無序事件(也被稱爲有序廣播 Normal broadcast),即所有的接收者在理論上是同時接收到事件,同時執行的,對消息傳遞的效率而言這是比較好的做法。
Context.sendOrderedBroadcast()方法用來向系統廣播有序事件(Ordered broadcast),接收者按照在Manifest.xml文件中設置的接收順序依次接收Intent,順序執行的,接收的優先級可以在系統配置文件中設置(聲明在intent-filter元素的android:priority屬性中,數值越大優先級別越高,其取值範圍爲-1000到1000。當然也可以在調用IntentFilter對象的setPriority()方法進行設置)。對於有序廣播而言,前面的接收者可以對接收到得廣播意圖(Intent)進行處理,並將處理結果放置到廣播意圖中,然後傳遞給下一個接收者,當然前面的接收者有權終止廣播的進一步傳播。如果廣播被前面的接收者終止後,後面的接收器就再也無法接收到廣播了。
廣播接收器(Broadcaset)運行的線程:
無論對於有序廣播還是無序廣播,廣播接收器默認都是運行在主線程中的(main線程,即UI線程)。可以通過在程序中使用registerReceiver(receiver, filter, broadcastPermission, scheduler)方法中的最後一個參數指定要運行的廣播接收器的線程。也可以在Manifest.xml文件中設置(Intent-filter標籤中設置android:process)。
無序廣播(Normal Broadcast)
基本步驟:寫一個類繼承BroadcastReceiver,並重寫onReceive方法,而後在AndroidManifest.xml文中中進行配置,或者直接在代碼中註冊。