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 普通广播的示例:
 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" 优先级指定
// 同级别动态注册优先级高于静态注册
// 数据不能处理

 

// 有序广播能中断
// 有序广播数据能处理----

 


























posted @ 2017-04-19 21:17  张兮兮  阅读(235)  评论(0)    收藏  举报