天天看點

廣播...

1.廣播接收者

廣播接收者簡單地說就是接收廣播意圖的Java類,此Java類繼承BroadcastReceiver類,重寫:

public void onReceive(Context context,Intent intent),其中intent可以獲得傳遞的資料;

廣播意圖就是通過Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intent intent)發送的意圖,通過這個語句,能夠廣播給所有滿足條件的元件,比如intent設定了action="com.xiazdong",則所有在AndroidManifest.xml中設定過<action android:name="com.xiazdong"/>的廣播接收者都能夠接收到廣播;

注:onReceive方法必須在10秒内完成,如果沒有完成,則抛“Application No Response”當廣播接收者onReceive方法需要執行很長時間時,最好将此耗時工作通過Intent發送給Service,由Service完成,并且不能使用子線程解決,因為BroadcastReceiver是接收到廣播後才建立的,并且生命周期很短,是以子線程可能在沒有執行完就已經被殺死了。

[java] view plaincopy

  1. public void onReceive(Context context,Intent intent){  
  2.     Intent intent = new Intent(context,XxxService.class);  
  3.     context.startService(intent);  
  4. }  

2.廣播發送者

通常廣播發送方就是調用Context.sendBroadcast()的程式,而廣播接收者就是繼承BroadcastReceiver的程式;

通常廣播發送方都是通過隐式意圖,這樣才能發送給多人;

廣播發送方分為普通廣播和有序廣播;

同步廣播:發送方發出後,幾乎同時到達多個廣播接收者處,某個接收者不能接收到廣播後進行一番處理後傳給下一個接收者,并且無法終止廣播繼續傳播;Context.sendBroadcast(intent);

有序廣播:廣播接收者需要提前設定優先級,優先級高的先接收到廣播,優先級數值為-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">設定;比如存在3個廣播接收者A、B、C,優先級A>B>C,是以A最先收到廣播,當A收到廣播後,可以向廣播中添加一些資料給下一個接收者(intent.putExtra()),或者終止廣播(abortBroadcast());Context.sendOrderedBroadcast(intent);

二、廣播接收者核心代碼

同步廣播發送方核心代碼:

  1. Intent intent = new Intent();  
  2. intent.setAction("...");  
  3. Context.sendBroadcast(intent);  

有序廣播發送方核心代碼:

  1. Context.sendOrderedBroadcast(intent,null);  

廣播接收者核心代碼:

  1. public class Receiver extends BroadcastReceiver{  
  2.     public void onReceive(Context context, Intent intent) {  
  3.         Bundle bundle = intent.getExtras();  
  4.         ...  
  5.     }  

AndroidManifest.xml

[html] view plaincopy

  1. <application>           
  2.     <receiver android:name=".Receiver">   
  3.         <intent-filter android:priority="1000">   
  4.             <action android:name="com.xiazdong"/>  
  5.         </intent-filter>  
  6.     </receiver>  
  7. </application>          

三、廣播執行個體

1.同步廣播執行個體

場景說明:

(1)廣播發送者:

  1. package com.xiazdong.broadcastsender;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. import android.widget.Toast;  
  9. public class MainActivity extends Activity {  
  10.     private Button button;  
  11.     private OnClickListener listener = new OnClickListener(){  
  12.         @Override  
  13.         public void onClick(View v) {  
  14.             Intent intent = new Intent();  
  15.             intent.setAction("com.xiazdong");  
  16.             intent.putExtra("name", "xiazdong");  
  17.             MainActivity.this.sendBroadcast(intent);  
  18.             Toast.makeText(getApplicationContext(), "發送廣播成功", Toast.LENGTH_SHORT).show();  
  19.         }  
  20.     };  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         button = (Button)this.findViewById(R.id.button);  
  26.         button.setOnClickListener(listener);  

(2)廣播接收者

  1. package com.xiazdong.broadcastreceiver1;  
  2. import android.content.BroadcastReceiver;  
  3. import android.content.Context;  
  4. import android.util.Log;  
  5. public class Receiver extends BroadcastReceiver {  
  6.         String name = intent.getExtras().getString("name");  
  7.         Log.i("Recevier1", "接收到:"+name);  
  1. <receiver android:name=".Receiver">  
  2.         <intent-filter>  
  3.              <action android:name="com.xiazdong"/>  
  4. </receiver>  

結果:

2.有序廣播執行個體

(1)廣播發送者

  1.             MainActivity.this.sendOrderedBroadcast(intent, null);   //有序廣播發送  

Receiver1

  1.         abortBroadcast();   //Receiver1接收到廣播後中斷廣播  
  1.       <intent-filter android:priority="1000"> <!-- 設定最高優先級 -->  
  2.          <action android:name="com.xiazdong"/>  
  3.       </intent-filter>