1.前言
这是我(Android初学者)记的笔记,如果不对欢迎大佬指教。
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"/>
.........
这样每个接收器接收此广播时都要申请权限
<uses-permission android:name="com.android.MyPermission"/>
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); } }); }