黑马程序员技术交流社区

标题: Android-BoadcastReceiver广播接收者2 [打印本页]

作者: 张伟南    时间: 2016-11-15 21:13
标题: Android-BoadcastReceiver广播接收者2
内容接着Android-BoadcastReceiver广播接收者1的帖子。
二、自定义广播的,建立BroadcastReceiver来接收广播,应用举例
例1、发送一条无序广播给所有关注者
步骤1、建立一个发送广播的工程,按钮事件监听方法如下:
        public void send(View view){
                Intent intent = new Intent();
                intent.setAction("com.gdkm.rjjs");  //广播的订阅标志
                intent.putExtra("msg", "来自SendBroadCast的广播消息");
       //广播携带的消息,可以是任意类型
                this.sendBroadcast(intent);
        }

步骤2、建立一个接受广播的工程TestBroadcastReceiver1,里面可以没有Activity界面,在新建的时候取消掉自动创建Activity和图标的勾。

建立一个MyReceiver1 extends BroadcastReceiver
public class MyReceiver1 extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
                // 广播接受者的业务方法,广播发生时,自动调用
                Log.i("MyReceiver1", intent.getStringExtra("msg"));
                Toast.makeText(context, intent.getStringExtra("msg"), 2).show();
        }
}

        <receiver android:name="com.gdkm.receiver.MyReceiver1">
            <intent-filter>
                <action android:name="com.gdkm.rjjs"></action>
            </intent-filter>
        </receiver>
    </application>

发布两个工程,点击按钮,广播接受者就自动接收到广播消息作出相应的处理。


例2、发送一条有序广播,依次由两个程序接收,程序1先处理广播信息,并且进行数据的处理,再由程序2接收广播。
步骤1、建立一个发送广播的工程,按钮事件监听方法如下:
        public void send(View view){
                Intent intent = new Intent();
                intent.setAction("com.gdkm.rjjs");
                intent.putExtra("msg", "来自SendBroadCast的广播消息");
                this.sendOrderedBroadcast(intent, null);
        }

步骤2、建立第一个广播接受者,设置优先级
public class MyReceiver1 extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                Log.i("MyReceiver1", intent.getStringExtra("msg"));
                //this.abortBroadcast(); //取消广播的继续发送
               
                //附加消息到广播上
                Bundle bundle = new Bundle();
                bundle.putString("receiver1", "第一个接受者附加的数据");
                this.setResultExtras(bundle);
               
                Toast.makeText(context, intent.getStringExtra("msg"), 2).show();
        }
}

        <receiver android:name="com.gdkm.receiver.MyReceiver1">
            <intent-filter android:priority="2">
                <action android:name="com.gdkm.rjjs"></action>
            </intent-filter>
        </receiver>
    </application>


步骤3、再建立一个广播接受者,优先级为1,后收到广播,并且去除前一个广播附加的数据

public class MyReceiver2 extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                Log.i("MyReceiver2", intent.getStringExtra("msg"));
                Bundle bundle = this.getResultExtras(true);
                String text =bundle.getString("receiver1");
                Log.i("MyReceiver2", text);
        }

}

        <receiver android:name="com.gdkm.receiver.MyReceiver2">
            <intent-filter android:priority="1">
                <action android:name="com.gdkm.rjjs"></action>
            </intent-filter>
        </receiver>
    </application>

步骤4、可以在第一个广播接收者onReceive方法中取消这个广播的继续发送,调用:
this.abortBroadcast(); //取消广播的继续发送



有序广播的实际应用:系统来电、来短信就是一个有序广播,编写短信监听程序,黑名单过滤电话,就是编写一个优先级最高的广播接收者,在程序中结束掉来电的广播,起到拦截电话的作用。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2