文章目录
-
- 广播的概念
- 广播的类型
- 广播接收实例
-
- IP拨号器
- 开机自启动
- 监听应用安装和卸载
广播的概念
- 现实中的广播:电视台发送广播,使用收听机可以收听广播,得到广播信息
- Android中的广播:系统会产生很多事件,比如 电量不足 收发短信 拨打电话
- Android中的收音机:Broadcast Receiver 广播接收器
- 广播接收器类似Windows下的消息钩子
广播的类型
- 无序广播:与Intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序之分(同时收到)
- 广播接收者无法使用setResult系列 getResult系列以及abort系列api,使用sendBroadCast发送广播
- 有序广播:与Intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
- 可以使用setResult系列函数来结果传给下一个接收者
- 通过getResult系列函数来取得上一个接收者
- 优先级的定义:-1000-1000
- 最终接收者:所有广播接收者都收到广播之后,它才接收,并且一定会接收
- 拦截有序广播:abortBroadCast
广播接收实例
IP拨号器
原理:当拨号后,拨打电话时会产生一个广播,我们可以设定一个广播接收器,接收指定广播进行处理,在拨号时加上对应的IP前缀
步骤
- 新建一个类继承自Broadcast Receiver,重写onReceive方法,处理接收到的广播
- 在清单文件中增加广播接收器的描述,Intent过滤器动作
- 在清单文件中增加权限
- 打电话测试
新建一个广播接收者
命名为CallReceiver,并且重写onReceive方法
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.//throw new UnsupportedOperationException("Not yet implemented");String phoneNum=getResultData();setResultData("123456"+phoneNum);}
在清单文件中注册广播,并且指定名称过滤器和category
<receiverandroid:name=".CallReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.NEW_OUTGOING_CALL"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></receiver>
然后在清单文件中新增intent-filter,并指定打电话的action
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
然后新增打电话权限。实际效果,当电话号拨出时,会自动新增123456的号码前缀
开机自启动
原理:自定义广播接收器,注册开机启动广播,开启后启动Activity
新建一个广播接收器,命名为BootReceiver
@Overridepublic void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.Intent intent1=new Intent();intent1.setClass(context,MainActivity.class);intent1.setFlags(intent1.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent1);}
重写onReceive方法,设置标志位,在启动时新建一个任务栈,并启动Activity
<receiverandroid:name=".BootReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></receiver>
并在清单文件中设置Action为开启启动
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
然后添加开启启动权限
启动app,启动完成之后,对应的广播已经生效。此时重启模拟器,app会自动启动。
监听应用安装和卸载
原理:自定义广播接收器,注册监听应用安装卸载和更新的动作
新建一个广播接收器,命名为AppReceiver
@Overridepublic void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.//获取广播中包含的应用包名Uri uri=intent.getData();//获取接收的广播动作String action=intent.getAction();//过滤动作if (action.equals("android.intent.action.PACKAGE_ADDED")){
Log.d("GuiShou",uri+"被安装");}else if (action.equals("android.intent.action.PACKAGE_REPLACED")){
Log.d("GuiShou",uri+"被替换");}else if (action.equals("android.intent.action.PACKAGE_REMOVED")){
Log.d("GuiShou",uri+"被卸载");}}
重写onReceive函数
<receiverandroid:name=".AppReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.PACKAGE_ADDED" /><action android:name="android.intent.action.PACKAGE_REMOVED" /><action android:name="android.intent.action.PACKAGE_REPLACED" /><data android:scheme="package"/><category android:name="android.intent.category.DEFAULT" /></intent-filter></receiver>
在清单文件中添加安装包相关的动作
此时我们去卸载和安装应用程序,都可以被程序监控到,并且打印相关日志