当前位置: 首页 > news >正文

Android 静默安装成功后自启动

近期开发上线一个常驻app,项目已上线,今天随笔记录一下静默安装相关内容。我分三篇静默安装(root版)、静默安装(无障碍版)、监听系统更新、卸载、安装。
先说说我的项目需求:要求app一直运行,通过指令进行自动安装并在安装成功后自动开启。行业人事都了解,非root权限不可能无声无息的完成此要求。我分两步完成了此功能开发。今天记录一下root权限下实现静默安装app。
本文通过监听系统广播的方式,实现静默安装后的自启动。

简单介绍一下相关广播

ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)
ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本
ACTION_PACKAGE_CHANGED  一个已存在的应用程序包已经改变,包括包名
ACTION_PACKAGE_REMOVED  一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)
ACTION_PACKAGE_RESTARTED    用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)
ACTION_PACKAGE_DATA_CLEARED 用户已经清楚一个包的数据,包括包名(清除包程序不能接收到这个广播)

自定义广播

// 自定义广播
class BootService : BroadcastReceiver(){override fun onReceive(p0: Context?, p1: Intent?) {p1?.let {val action = it.actionwhen(action){Intent.ACTION_PACKAGE_REPLACED,Intent.ACTION_PACKAGE_REPLACED ->{p0?.let {con -> {// 启动appval intent = con.packageManager.getLaunchIntentForPackage(con.packageName)intent?.flags= Intent.FLAG_ACTIVITY_NEW_TASKcon.startActivity(intent)}}}else -> {}}}}
}

注册自定义的广播

<receiverandroid:name="com.zhujing.nadedemospace.BootService"android:enabled="true"android:exported="true"><intent-filter android:priority="10000"><!--监听开机--><action android:name="android.intent.action.BOOT_COMPLETED" /><category android:name="android.intent.category.DEFAULT" /></intent-filter><intent-filter><!--监听关机--><action android:name="android.intent.action.ACTION_SHUTDOWN" /><action android:name="android.intent.action.REBOOT" /></intent-filter><intent-filter><!--监听安装、更新、卸载--><action android:name="android.intent.action.PACKAGE_ADDED" /><action android:name="android.intent.action.PACKAGE_REPLACED" /><action android:name="android.intent.action.PACKAGE_REMOVED" /><!--固定格式,注意:package为固定内容,不可修改!!!--><data android:scheme="package" /></intent-filter></receiver>

到此就完成了。注意
1、com.zhujing.nadedemospace.BootService,最好使用全路径注册,以防自定义广播注册失败!!!
2、 <data android:scheme="package" /> package是固定内容,不可修改!!!

静默安装相关内容更新完毕,欢迎各位同学指导……

http://www.lryc.cn/news/324155.html

相关文章:

  • 计算机二级真题讲解每日一题:《format格式化》
  • RabbitMQ问题
  • flutter->Scaffold左侧/右侧侧边栏和UserAccountsDrawerHeader的使用
  • vulnhub prime1通关
  • JVM快速入门(1)JVM体系结构、运行时数据区、类加载器、线程共享和独享、分区、Java对象实例化
  • CSS3新属性(学习笔记)
  • 41-Vue-webpack基础
  • 数据仓库的分层理论
  • MySQL 8.0-索引- 不可见索引(invisible indexes)
  • Uibot6.0 (RPA财务机器人师资培训第3天 )财务招聘信息抓取机器人案例实战
  • Eureka和Nacos的关系
  • 极简自建web视频会议,私有云,rtmp/rtsp/webrtc一键参会直播会议互动方案
  • 5G智能网关助力工业铸造设备监测升级
  • 奇舞周刊第523期:来自 rust 生态的强烈冲击?谈谈 Leptos 在语法设计上的精妙之处...
  • 《边缘计算:连接未来的智慧之桥》
  • php 各种魔术函数的触发条件
  • Linux的学习之路:2、基础指令(1)
  • 0103设计算法-算法基础-算法导论第三版
  • [NCTF2019]SQLi ---不会编程的崽
  • 上位机开发 halcon坐标转轴坐标
  • [数据结构]二叉树(下)
  • 动手学深度学习|notebook教程
  • C#面:简述 .NET Framework 类库中的“命名空间”
  • android.os.TransactionTooLargeException解决方案,Kotlin
  • ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP
  • 汇丰:当前的美股是泡沫吗?
  • 颠覆传统:Web3如何塑造未来的数字经济
  • iOS模拟器 Unable to boot the Simulator —— Ficow笔记
  • 使用 Flink + Faker Connector 生成测试数据压测 MySQL
  • Android单片机硬件通信《GPIO通信》