android 广播 BroadcastReceiver

来源:互联网 发布:松下剃须刀哪款好 知乎 编辑:程序博客网 时间:2024/05/19 16:05
BroadcastReceiver
正常广播 Normal broadcasts(用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。但意味着receiver不能包含所要使用的结果或中止的API。  
有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。
只能一次运行一个receiver;
一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
发送广播
可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法
    1.new Intent with action name 
        Intent intent = new Intent(String action);
      或者 只是new Intent, 然后
        intent.setAction(String action);


    2.set data等准备好了后,in activity,
        sendBroadcast(Intent); // 发送广播
注册Receiver
静态
<receiver android:name=".SMSReceiver"> 
        <intent-filter> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
        </intent-filter> 
</receiver>
动态
receiver = new CallReceiver(); 
registerReceiver(receiver, new IntentFilter("android.intent.action.PHONE_STATE")); 
动态必须卸载
unregisterReceiver(receiver);


小结:
1. 对于sendBroadCast的intent对象,需要设置其action name; 
2. 推荐使用显式指明receiver,在配置文件AndroidManifest.xml指明; 
3. 一个receiver可以接收多个action; 
4. 每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive;

5. 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理。

------------------------------------------------------------------------------------------------------------------------------------------

如有建议和意见

邮件与QQ:bitday@yeahoo.cn

原创粉丝点击