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);
}
});
}