当前位置: 代码迷 >> 综合 >> 007 Android之Broadcast Receiver
  详细解决方案

007 Android之Broadcast Receiver

热度:29   发布时间:2023-12-21 20:10:17.0

文章目录

    • 广播的概念
    • 广播的类型
    • 广播接收实例
      • IP拨号器
      • 开机自启动
      • 监听应用安装和卸载

广播的概念

  • 现实中的广播:电视台发送广播,使用收听机可以收听广播,得到广播信息
  • Android中的广播:系统会产生很多事件,比如 电量不足 收发短信 拨打电话
  • Android中的收音机:Broadcast Receiver 广播接收器
  • 广播接收器类似Windows下的消息钩子

广播的类型

  • 无序广播:与Intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序之分(同时收到)
    • 广播接收者无法使用setResult系列 getResult系列以及abort系列api,使用sendBroadCast发送广播
  • 有序广播:与Intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
    • 可以使用setResult系列函数来结果传给下一个接收者
    • 通过getResult系列函数来取得上一个接收者
    • 优先级的定义:-1000-1000
    • 最终接收者:所有广播接收者都收到广播之后,它才接收,并且一定会接收
    • 拦截有序广播:abortBroadCast

广播接收实例

IP拨号器

原理:当拨号后,拨打电话时会产生一个广播,我们可以设定一个广播接收器,接收指定广播进行处理,在拨号时加上对应的IP前缀

步骤

  1. 新建一个类继承自Broadcast Receiver,重写onReceive方法,处理接收到的广播
  2. 在清单文件中增加广播接收器的描述,Intent过滤器动作
  3. 在清单文件中增加权限
  4. 打电话测试

在这里插入图片描述

新建一个广播接收者

在这里插入图片描述

命名为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>

在清单文件中添加安装包相关的动作

在这里插入图片描述

此时我们去卸载和安装应用程序,都可以被程序监控到,并且打印相关日志

  相关解决方案