android ,关于广播接收者的两种不同方式的用法及区别

(1)代码中动态注册

步骤如下:

  1. 实例化自定义的广播接收者
  2. 实例化意图过滤器,并设置要过滤的广播类型(如,我们接收收到短信系统发出的广播)
  3. 使用Context的registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)方法注册广播

代码:

//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();

//实例化过滤器并设置要过滤的广播  
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

//注册广播   
myContext.registerReceiver(smsBroadCastReceiver,intentFilter, 
             "android.permission.RECEIVE_SMS", null);

(2)在Manifest.xml中静态注册

直接在Manifest.xml文件的节点中配置广播接收者。

 <receiver android:name=".MyBroadCastReceiver">  
            
            <intent-filter android:priority="20">
            <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
            intent-filter>  
receiver>

还要在同级的位置配置可能使用到的权限

<uses-permission android:name="android.permission.RECEIVE_SMS">
uses-permission>

(3)两种注册广播的不同

  1. 第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
  2. 第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

二.发送广播

当我们需要发送一个自定义的广播来通知程序中其他组件一些状态时,就可以使用发送一条广播的方式。

有两种方式分别发送两种不同的广播:
通过mContext.sendBroadcast(Intent)mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限);
通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。

区别
无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。

(1)无序广播的使用:

定义一个按钮,设置其点击事件,发送一个无序广播。

        Intent intent = new  Intent();
        //设置intent的动作为com.example.broadcast,可以任意定义
        intent.setAction("com.example.broadcast");
        //发送无序广播
        sendBroadcast(intent);

定义一个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"收到广播", Toast.LENGTH_SHORT).show();
    }
}

在Manifest.xml中配置该接收者。

<receiver
            android:name=".MyReceiver" >
            <intent-filter>
                
                <action android:name="com.example.broadcast"/>
            intent-filter>
receiver>

运行结果为:Toast打印出 “收到广播”。

(2)有序广播的使用

和无序广播使用不同的是 通过 mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每个接收者设置优先级,就可以在小于自己优先级的接收者得到广播前,修改或终止广播。

定义一个按钮,设置其点击事件,发送一个有序广播。

        Intent intent = new  Intent();
        //设置intent的动作为com.example.broadcast,可以任意定义
        intent.setAction("com.example.broadcast");
        //发送无序广播
        //第一个参数:intent
        //第二个参数:String类型的接收者权限
        //第三个参数:BroadcastReceiver 指定的接收者
        //第四个参数:Handler scheduler
        //第五个参数:int 此次广播的标记 
        //第六个参数:String 初始数据
        //第七个参数:Bundle 往Intent中添加的额外数据
        sendOrderedBroadcast(intent, null, null, null, "这是初始数据", );

定义多个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver1 extends BroadcastReceiver {
    public MyReceiver1() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播中的数据(即得到 "这是初始数据" 字符串)
        String message = getResultData();
        Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
        //修改数据
        setResultData("这是修改后的数据");
    }
}
public class MyReceiver2 extends BroadcastReceiver {
    public MyReceiver2() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = getResultData();
        Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
        //终止广播
        abortBroadcast();
    }
}
public class MyReceiver3 extends BroadcastReceiver {
    public MyReceiver3() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = getResultData();
        Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
    }
}

在Manifest.xml中配置该接收者。并设置优先级:MyReceiver1>MyReceiver2>MyReceiver3。


<receiver
            android:name=".MyReceiver1" >
            
            <intent-filter android:priority="1000">                
                
                <action android:name="com.example.broadcast"/>
            intent-filter>
receiver>
<receiver 
               android:name=".MyReceiver2" >
                   
                   <intent-filter  android:priority="0">
                   
                   <action android:name="com.example.broadcast"/>
            intent-filter>
receiver>
<receiver 
               android:name=".MyReceiver3" >
                   
                   <intent-filter  android:priority="-1000">
                   
                   <action android:name="com.example.broadcast"/>
            intent-filter>
receiver>

运行结果:MyReceiver1得到广播数据后打印“这是初始数据”,MyReceiver2接收到广播数据打印“这是修改后的数据”,MyReceiver3没有打印。



文/世界是我的床(简书作者)
原文链接:http://www.jianshu.com/p/ea5e233d9f43
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

你可能感兴趣的:(android ,关于广播接收者的两种不同方式的用法及区别)