我们知道在android中有四大组件,Activity,Service,ContentProvider,还有就是BroadCast,在写项目中很常用BroadCast,今天我们就讲解下BroadCast的用法。
广播Broadcast按照注册方法分为静态注册和动态注册,按照类型分为有序和无序。
1.静态注册,静态注册也是常驻性广播:
静态注册是在清单文件中注册的:
1)下面是静态注册中的有序广播:
我们这里有三个广播接受者,分别是JingYouOneReceiver,JingYouTwoReceiver,JingYouThreeReceiver。
我们看一下这三个类:

JingYouOneReceiver:

public class JingYouOneReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        String string=intent.getExtras().getString("msg");
        Log.e("test","JingYouOneReceiver =="+string);

        Bundle bundle=new Bundle();
        bundle.putString("msgone","传递到第二个广播的值");
        setResultExtras(bundle);
    }
}

JingYouTwoReceiver:

public class JingYouTwoReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
       String string=getResultExtras(true).getString("msgone");
        Log.e("test",string);


        Bundle bundle=new Bundle();
        bundle.putString("msgtwo","传递到第三个广播的值");
        setResultExtras(bundle);
    }
}

JingYouThreeReceiver:

public class JingYouThreeReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        String string=getResultExtras(true).getString("msgtwo");
        Log.e("test",string);
    }
}

其次我们在清单文件中注册这三个广播:

<receiver android:name=".broadcaseDemo.JingYouOneReceiver">
            <intent-filter android:priority="1000">
                <action android:name="com.jingyou"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </receiver>
        <receiver android:name=".broadcaseDemo.JingYouTwoReceiver">
            <intent-filter android:priority="900">
                <action android:name="com.jingyou"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </receiver>
        <receiver android:name=".broadcaseDemo.JingYouThreeReceiver">
            <intent-filter android:priority="800">
                <action android:name="com.jingyou"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </receiver>

发送广播:

Intent intent = new Intent();
        intent.setAction("com.jingyou");
        intent.putExtra("msg", "静有");
        sendOrderedBroadcast(intent, null);

注意:使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数(sendOrderedBroadcast()方法中的第二个参数),如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。
例如:sendOrderedBroadcast(intent, “lib.permission.MY_BROADCAST_PERMISSION”);
我们在AndroidMainfest.xml中定义一个权限:

android里如何注册广播 android 注册广播有几种方式_bundle


然后声明使用了此权限:

android里如何注册广播 android 注册广播有几种方式_android_02

我们只需要注意:1.发送广播是sendOrderedBroadcast;
2.清单文件加上级别priority,1000优先级最高;
3.级别高的广播向级别低的广播传至值
Bundle bundle=new Bundle();
bundle.putString(“msgone”,”第一个传过来的”);
setResultExtras(bundle);
4.级别低的接收值: String string=getResultExtras(true).getString(“msgtwo”);

2)这是静态注册中的无序广播:
这是静态注册的无序广播的三个广播类,JingWuOneReceiver,JingWuTwoReceiver,JingWuThreeReceiver
JingWuOneReceiver:

public class JingWuOneReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        String string=intent.getExtras().getString("msg");
        Log.e("test","第一个=="+string);
    }
}

JingWuTwoReceiver和JingWuThreeReceiver只需要把类名JingWuOneReceiver 换成自己广播的类名就好。

清单文件:

<!--注意:先注册的先收到广播,例如先注册JingWuOneReceiver,再注册的JingWuTwoReceiver,最后是JingWuThreeReceiver,那么收到广播的顺序是JingWuOneReceiver-->JingWuTwoReceiver-->JingWuThreeReceiver-->
<receiver android:name=".broadcaseDemo.JingWuOneReceiver">
            <intent-filter >
                <action android:name="com.jingwu"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
 </receiver>
 <receiver android:name=".broadcaseDemo.JingWuTwoReceiver">
            <intent-filter >
                <action android:name="com.jingwu"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
 </receiver>
 <receiver android:name=".broadcaseDemo.JingWuThreeReceiver">
            <intent-filter >
                <action android:name="com.jingwu"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
 </receiver>

发送广播:

Intent intent = new Intent();
        intent.setAction("com.jingwu");
        intent.putExtra("msg", "静无");
        sendBroadcast(intent);

静态注册就完了,但是需要说明的是,在不同app中,不管你的app是否已经退出程序或者杀死进程,只要action相同就可以收到广播。

2.下面是动态注册,动态注册不是常驻性广播
动态注册是在代码中注册:
1)动态无序广播
首先是三个动态无序的广播类:DongWuOneBroadcast,DongWuTwoBroadcast,DongWuThreeBroadcast
三个类只是类名不一样,我们就写一个DongWuOneBroadcast,后面两个只需要换类名就好

public class DongWuOneBroadcast extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

        String string=intent.getExtras().getString("msg");
        Log.e("test",string);
    }
}

发送广播:

//注册广播
    DongWuOneBroadcast    dongWuOneBroadcast = new DongWuOneBroadcast();
    DongWuTwoBroadcast    dongWuTwoBroadcast = new DongWuTwoBroadcast();
    DongWuThreeBroadcast dongWuThreeBroadcast = new DongWuThreeBroadcast();

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.dongwu");
        //注意:最后一个注册的先收到广播,例如我最先注册的是dongWuOneBroadcast,接下来是dongWuTwoBroadcast,接下来是dongWuThreeBroadcast,那么接受广播的顺序就是dongWuThreeBroadcast-->dongWuTwoBroadcast-->dongWuOneBroadcast,这和静态无序是相反的。
        registerReceiver(dongWuOneBroadcast, intentFilter);
        registerReceiver(dongWuTwoBroadcast, intentFilter);
        registerReceiver(dongWuThreeBroadcast, intentFilter);


//发送广播
Intent intent = new Intent();
        intent.setAction("com.dongwu");
        intent.putExtra("msg", "动无");
        sendBroadcast(intent);

动态注册有序广播在代码中测试没有实现,不知道是自己的方法有问题还是什么原因,希望知道的同学能够告诉我

最后,别忘了动态注册中unregist(静态注册不需要),在Ondestory中

unregisterReceiver(dongWuOneBroadcast);
unregisterReceiver(dongWuTwoBroadcast);
unregisterReceiver(dongWuThreeBroadcast);