当前位置:操作系统 > 安卓/Android >>

Android BroadcastReceiver学习

BroadcastReceiver 用于异步接收广播Intent。主要有两大类,用于接收广播的:
正常广播 Normal broadcasts(用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。  
有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。


    要注意的是,即使是Normal broadcasts,系统在某些情况下可能会恢复到一次传播给一个receiver。 特别是receiver可能需要创建一个进程,为了避免系统超载,只能一次运行一个receiver。


    Broadcast Receiver 并没有提供可视化的界面来显示广播信息。可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息。


生命周期
    一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
    因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。


发送广播
    事件的广播比较简单,构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法,请查阅API Doc。
    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); // 发送广播


接收广播
    通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件。
[java] public class SMSReceiver extends BroadcastReceiver {  
 
        @Override  
        public void onReceive(Context context, Intent intent) {  
                // get data from SMS intent   
                Bundle bundle = intent.getExtras();  
                if (bundle != null){  
                        // get message by "pdus"   
                        Object[] objArray = (Object[]) bundle.get("pdus");  
 
                        // rebuild SMS   
                        SmsMessage[] messages = new SmsMessage[objArray.length];  
                        for (int i=0; i < objArray.length; i++){  
                                messages[i] = SmsMessage.createFromPdu((byte[])objArray[i]);  
 
                                StringBuilder str = new StringBuilder("from: ");  
                                str.append(messages[i].getDisplayOriginatingAddress());  
                                str.append("\nmessage:\n");  
                                str.append(messages[i].getDisplayMessageBody());  
 
                                Toast.makeText(context, str.toString(), Toast.LENGTH_LONG)  
                                                .show();  
                        }  
                }  
        }  

public class SMSReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
                // get data from SMS intent
                Bundle bundle = intent.getExtras();
                if (bundle != null){
                        // get message by "pdus"
                        Object[] objArray = (Object[]) bundle.get("pdus");

                        // rebuild SMS
                        SmsMessage[] messages = new SmsMessage[objArray.length];
                        for (int i=0; i < objArray.length; i++){
                                messages[i] = SmsMessage.createFromPdu((byte[])objArray[i]);

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,