Android——BroadcastReceiver学习笔记
BroadcastReceiver学习笔记(一)
创建一个广播接收器需要继承BroadcastReceiver,并重写onReceive()方法。onReceive()方法内写当接到广播时要执行的代码。
IntentFilter:可以理解为意图过滤器,可以通过添加actions、categories或者data来匹配intent中的actions、categories或者data;
通过Android studio 快捷创建广播器:
Exported属性表示是否允许这个广播接收器接收本程序以外的广播,Enabled属性表示是否启用这个广播接收器。如果之后想改这两个属性可以到AndroidMainfest.xml文件中修改。
关于发送标准广播,想根据书上自定义广播接收器,然后设置隐式广播,但是失败了,自定义的广播接收器接收不到,后来上网搜发现Android8.0以后加了限制,然后先找到了第一种方法:
//参数1-包名 参数2-广播接收者所在的路径名 ComponentName componentName=new ComponentName(getApplicationContext(),"com.example.broadcasttest.MyBroadcastReceiver"); intent.setComponent(componentName);
这样是设置一个ComponentName组件来显示的处理意图,直接就指定了处理该意图的广播接收器,这样明显和我之前的想法优点背道而驰,而且只能指定一个类接收,那样也不太符合标准广播的理念:在广播发出之后,所有的 广播接收器几乎都会在同一时刻接收到这条广播消息。
所以我又找到了一个方法:
PackageManager pm = getPackageManager(); if(null == pm) return; List<ResolveInfo> broadcastReceivers = pm.queryBroadcastReceivers(intent, 0); for(int i = 0;i < broadcastReceivers.size(); i++) { Log.v("MainActivity", "resolveInfos---" + broadcastReceivers.get(i).toString()); intent.setPackage((broadcastReceivers.get(i).activityInfo.packageName)); sendBroadcast(intent); }
上面的方法是先获取到当前活动所在的包管理器,然后调用queryBroadcastReceivers (Intent intent, int flags)方法获取到所有能处理当前意图的广播接收器,flags为修改返回数据的附加选项标志,因为我们这里没有要修改返回的数据,所以填0。
获取到所有能处理当前意图的广播后就遍历一条一条发送广播就行了。这样就做到了隐式广播,而且可以有多个广播接收器接收到。但是这样改之后也算不上是标准广播了,因为标准广播是在同一时间内都接收到广播,而这个是有先后顺序的。
在使用本地广播的时候,《第一行代码》里用到的是LocalBroadcastManager,但这个类已经不在Android自带的类里了,会飘红,需要像RecyclerView那样在build.gradle里添加依赖才可以用。而且查阅了Android JetPack之后发现这个类已经不建议使用了。
本地广播只能通过动态注册的方式来接收,不能通过静态注册,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序肯定是启动了,因此也完全不需要使用静态注册的功能。