1.前言

2.解决 :静态注册的广播不能接收本应用发送的广播     

Intent intent = new Intent("android.intent.action.Mybroadcast");
//加上这一句后就可以接收了(参数1:广播发送类的包名,参数2:广播接受者路径)
intent.setComponent(new ComponentName("com.example.broadcaststudy","com.example.broadcaststudy.MyReceiver"));
sendBroadcast(intent);

 3.Android8.0以后,对静态注册广播作出了限制,具体什么限制,我也不清楚,哈哈。可以自己百度查查。所以不建议使用静态注册广播。 

4.动态注册广播

private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    intentFilter=new IntentFilter();
    intentFilter.addAction("android.intent.action.Mybroadcast");
    myReceiver=new MyReceiver();
    registerReceiver(myReceiver,intentFilter);}

 5.跨应用发送广播时正常发送

Intent intent = new Intent("android.intent.action.Mybroadcast");
 //不要加这一句,否则接收不到ComponentName("com.example.broadcaststudy","com.example.broadcaststudy.MyReceiver")); sendBroadcast(intent);

6.发送有序广播

Intent intent = new Intent("android.intent.action.Mybroadcast");
//第二个参数是我自定义的权限,可以传入null,表示不设权限
sendOrderedBroadcast(intent,"com.android.MyPermission");

Manifest文件自定义权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcaststudy">
//即使是本应用的接收器也要申明权限,否则收不到广播
//关于signature权限级别,可以去百度一下,我自己也还不懂
    <uses-permission android:name="com.android.MyPermission"/>
    <permission
        android:name="com.android.MyPermission"
        android:protectionLevel="signature"/>

.........

这样每个接收器接收此广播时都要申请权限

 

7.有序广播等级

      我测试了一下,两个应用里的广播接收器,如果都不设优先级,本应用的广播接收器先接收到。如果另一个应用的接收器设了优先级哪怕是  1   。那么设了优先级的先接收到。

      注意前方高能,如果两个设置了一样的等级。。。。。

      我也不知道怎么回事了,由于笔者只是初学,就先不追究那么深了。我试了一下,

      第一次都设为  1  ,结果接收器B(另一个应用的接收器)先收到。

      第一次都设为  2  ,结果接收器A(本应用的接收器)先收到。

IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.Mybroadcast");
//设置优先级
intentFilter.setPriority(1);
MyReceiver2 myReceiver2=new MyReceiver2();
registerReceiver(myReceiver2,intentFilter);

 8.本地广播

       本地广播其实和带有权限的有序广播有点像,顾名思义就是只能在本应用传播的广播,这样做是出于安全考虑,不想让信息泄露。用法也简单。

       本来由Activity注册和发送的广播,现在交给LocalBroadcastManager对象来做。

private IntentFilter intentFilter;
private MyReceiver myReceiver;
private LocalBroadcastManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    intentFilter=new IntentFilter();
    intentFilter.addAction("android.intent.action.Mybroadcast");

//获取LocalBroadcastManager对象

    manager=LocalBroadcastManager.getInstance(this);

    myReceiver=new MyReceiver();

//LocalBroadcastManager对象注册广播
    manager.registerReceiver(myReceiver,intentFilter);
    findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent("android.intent.action.Mybroadcast");

//LocalBroadcastManager对象发送广播
            manager.sendBroadcast(intent);
        }
    });

}