Android广播之监听应用程序安装与卸载

😄作者简介:小曾同学.com,一个致力于测试开发的博主⛽️,
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

在本篇文章你将学到如何监听应用程序的安装与卸载

文章目录

  • 背景
  • 实战
    • 第一步:`创建广播接收器`
    • 第二步:`注册广播`
    • 第三步:`注销广播`

背景

为什么要监听应用的安装与卸载:主要是收集信息
为什么要收集信息:对于一些大公司来说要做一个产品。首先要做一些战略性的参考,比如说什么产品比较好以及某个产品的预测未来,就会通过安装或者卸载在用户手机中广告监听。比如说腾讯通过在QQ应用上监听应用程序卸载与安装,当时小米有一款产品叫米聊,比较火爆,然后腾讯看这款产品这么好,能不能用到自己的产品上,然后微信就产生了。

实战

注意事项:

  • 需要使用动态注册
  • 新增应用监听: "android.intent.action.PACKAGE_ADDED"
  • 卸载监听:"android.intent.action.PACKAGE_REMOVED"
  • 通过调用 addDataScheme() 方法,并传递数据方案"package"作为参数。这意味着您的 IntentFilter 将只对"package"数据方案的 Intent 感兴趣。通常,这用于声明您的广播接收器只对与应用程序安装和卸载相关的 Intent 感兴趣。

第一步:创建广播接收器

名为AppStateChangeReceiver,继承BroadcastReceiver,并重写onReceive(),我们在onReceive()方法中只获取action并打印 log,具体逻辑如下。

public class AppStateChangeReceiver extends BroadcastReceiver {public static final String TAG = "AppStateChangeReceiver";@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action != null && action.equals(Intent.ACTION_PACKAGE_ADDED)) {// 应用已安装String packageName = intent.getData().getSchemeSpecificPart();Log.d(TAG,"新增了"+packageName);} else if (action != null && action.equals(Intent.ACTION_PACKAGE_REMOVED)) {// 应用已卸载String packageName = intent.getData().getSchemeSpecificPart();Log.d(TAG,"卸载了"+packageName);}}
}

第二步:注册广播

因为安装与卸载需要动态注册,所以我们在oncreate方法中注册,逻辑如下:

public class MainActivity extends AppCompatActivity {AppStateChangeReceiver appStateChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("android.intent.action.PACKAGE_ADDED");intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");intentFilter.addDataScheme("package");appStateChangeReceiver = new AppStateChangeReceiver();registerReceiver(appStateChangeReceiver,intentFilter);}}

在动态注册广播时,一定要记住步骤:

  1. 新建一个类继承BroadcastReceiver
  2. 实现onReceive方法
  3. 在代码中实例化新建类的广播类
  4. 在代码中实例化IntentFilter
  5. 调用IntentFilter对象的addAction方法设置频道
  6. 调用registerReceiver注册广播
  7. 通过sendBroadcast发送广播
  8. 通过unregisterReceiver

第三步:注销广播

protected void onDestroy() {super.onDestroy();unregisterReceiver(appStateChangeReceiver);}

测试结果如下:
当设备上新增或删除应用时,都会收到打印信息。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

221 基于matlab编制的直齿圆柱齿轮应力计算程序

基于matlab编制的直齿圆柱齿轮应力计算程序,输入设计参数:模数、齿顶高、齿宽、啮合齿数、转速、扭矩、安全系数、压力角、齿轮类型(开式、闭式)等,输出弯曲应力和许用应力,并对比是否满足要求。并把程序成…

Eclipse新建类的时候如何自动添加注释

Eclipse新建类的时候如何自动添加注释 主要有两种方法:①创建类文件时自动添加注释;②文件注释 方法一:类注释 windows -> preferencesJava -> Code Style -> Code TemplatesCode -> new Java filesedit 填入下面的数据 ${fi…

在vue3中实现pptx、word、excel预览

插件推荐 PPTXjs vue-office 代码 <script setup lang"ts" name"home"> import { computed, nextTick, ref, onMounted } from vue; //引入VueOfficeDocx组件 import VueOfficeDocx from vue-office/docx; //引入VueOfficeExcel组件 import VueOf…

解决CSS中鼠标移入到某个元素其子元素被遮挡的问题

我们在开发中经常遇到一种场景&#xff0c;就是给元素加提示信息&#xff0c;就是鼠标移入到盒子上面时&#xff0c;会出现提示信息这一功能&#xff0c;如果我们给盒子加了hover&#xff0c;当鼠标移入到盒子上时&#xff0c;让他往上移动5px&#xff0c;即transform: transla…

C/C++基础----数组和引入指针

数组 数组的定义 语法&#xff1a; 类型 变量名[数组大小] {数组内容1,数组内容2}; int array[5] {1,2,3,4,5};代码 int main(){// 定义数组&#xff0c;大小不写&#xff0c;数组内默认有多少元素大小就为多少int array_a[] {1, 2, 3, 4, 5, 6};// 定义数组长度为5&#x…

计算机基础知识-第10章-计算机网络概论

一、什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 要注意不…

jenkins+sonar配置

安装插件 Sonar Scanner 用于扫描项目 配置sonar scanner jenkins集成sonar 1、sonar生成token 生成完保存好&#xff0c;刷新后无法查看 2、jenkins配置全局凭据 3、jenkins配置系统设置

2、ESP-WROOM-32开发板笔记

ESP32 是乐鑫开发的一系列低成本、低功耗的片上系统微控制器&#xff0c;具有 Wi-Fi 和蓝牙无线功能以及双核处理器。 目录 一、特点 二、硬件内存 三、支持外设 四、引脚定义 1、仅输入引脚 2、SPI闪存 3、电容式触摸 IO 4、ADC 5、DAC 6、RTC GPIO 7、PWM 8、I2C 9、SPI …

时间复杂度详解2——时间复杂度的计算

时间复杂度基本计算规则&#xff1a; 基本操作即只有常数项&#xff0c;认为其时间复杂度为O(1)顺序结构&#xff0c;时间复杂度按加法进行计算循环结构&#xff0c;时间复杂度按乘法进行计算分支结构&#xff0c;时间复杂度取最大值判断一个算法效率时&#xff0c;往往只需要…

第十二届蓝桥杯大赛软件赛省赛Java 大学 B 组题解

1、ASC public class Main {public static void main(String[] args) {System.out.println(

LeetCode- 合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…

Java | Leetcode Java题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> letterCombinations(String digits) {List<String> combinations new ArrayList<String>();if (digits.length() 0) {return combinations;}Map<Character, String> phoneM…

Linux的学习之路:7、yum与git

摘要 本章主要是说一下yum和git的操作 目录 摘要 一、什么是yum 二、yum三板斧 1、list 2、install 3、remove 三、怎么创建仓库 四、git三板斧 1、add 2、commit 3、push 4、pull 五、思维导图 一、什么是yum YUM是Yellowdog Updater Modified的简称&#xf…

Github 2024-04-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2Cuda项目1C++项目1C项目1HTML项目1Jupyter Notebook项目1JavaScript项目1Python - 100天从新手到大师 创建周期:22…

unity_Button:单击的三种实现方式

1.针对特定单个按钮 此代码直接绑定到button上面无需其他操作 using UnityEngine; using UnityEngine.UI;public class PrintHelloOnButtonClick : MonoBehaviour {private Button button;void Start(){// 获取当前GameObject上的Button组件button GetComponent<Button&g…

CTF-SHOW SSRF

web351 存在一个flag.php页面&#xff0c;访问会返回不是本地用户的消息&#xff0c;那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议&#xff0c;之后判断我们传入的url中是否含有localhost和127.0.0&#xff0c;如果没有则…

VulnHub靶机-easy_cloudantivirus 打靶

easy_cloudantivirus 靶机 目录 easy_cloudantivirus 靶机一、导入虚拟机配置二、攻击方式主机发现端口扫描web渗透-SQL注入命令注入反弹shellssh爆破提权 一、导入虚拟机配置 靶机地址&#xff1a; https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/下载完成&am…

Docker 安装RabbitMQ以及使用客户端图形化界面

目录 一、点击进入docker 镜像仓库 1.1 直接在官网里 搜索 rabbitmq 1.2 在标签里 直接搜索3.10-management 因为这个标签包含用户操作界面 二、启动docker 2.1 首先拉取镜像&#xff1a; 2.2 Docker运行&#xff0c;并设置开机自启动 三、访问用户操作界面 一、点击进入…

PTA(题目集二 题目 代码 C++)

目录 题目一&#xff1a; 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码&#xff1a; 题目七&#xff1a; 代…

python中time库的time.time()函数的作用是什么?

python中time库的time.time()函数的作用是什么&#xff1f; 作用&#xff1a;Python time time() 返回当前时间的时间戳&#xff08;1970纪元后经过的浮点秒数&#xff09;。 time()方法语法&#xff1a;time.time() #!/usr/bin/python # Write Python 3 code in this onlin…