如何在新应用安装时触发自身应用后台代码运行?
实现新应用安装时触发代码执行的方案
方案1:监听系统广播(适配高版本需动态注册+前台保活)
- Android平台原生提供了
ACTION_PACKAGE_ADDED广播,用于监听应用安装事件。但Android 8.0(API 26)起,静态注册的广播接收器对该系统广播失效,必须动态注册,且你的应用进程需处于存活状态(可通过前台服务维持)。 - 代码示例(Kotlin):
// 在前台服务或活跃页面中动态注册接收器 val packageAddedReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (Intent.ACTION_PACKAGE_ADDED == intent?.action) { val newPackage = intent.data?.schemeSpecificPart // 此处执行你的业务逻辑,比如记录新应用信息 newPackage?.let { // do something } } } } val filter = IntentFilter(Intent.ACTION_PACKAGE_ADDED).apply { addDataScheme("package") } context?.registerReceiver(packageAddedReceiver, filter) - 注意:高版本系统中,只有应用处于前台或前台服务运行时,动态注册的接收器才能正常接收广播,否则进程可能被系统回收导致监听失效。
方案2:借助无障碍服务(无需依赖广播,后台持续运行)
- 无障碍服务可监听系统窗口变化、通知栏事件,以此判断新应用是否安装完成。这种方式不需要依赖广播,只要用户开启无障碍权限,就能在后台持续运行。
- 实现步骤:
- 清单文件声明服务:
<service android:name=".AppInstallMonitorService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_config" /> </service> - 创建无障碍配置文件
res/xml/accessibility_config.xml:<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeWindowStateChanged|typeNotificationStateChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" /> - 实现服务逻辑:
class AppInstallMonitorService : AccessibilityService() { override fun onAccessibilityEvent(event: AccessibilityEvent?) { event?.let { // 监听安装完成的通知或安装窗口 if (it.eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { it.text?.takeIf { textList -> textList.any { it.contains("已安装") } }?.run { // 执行你的代码逻辑 } } } } override fun onInterrupt() {} }
- 清单文件声明服务:
- 优势:无需前台服务也能长期运行;缺点:需要用户手动在系统设置中开启无障碍权限,属于敏感权限,需在应用中明确说明用途。
方案3:前台服务+定时扫描(兜底方案)
- 如果前两种方式受系统限制无法满足需求,可通过前台服务维持进程存活,定时扫描设备应用列表,对比历史记录找出新增应用。
- 核心思路:
- 启动前台服务,确保进程不被系统回收(需申请
FOREGROUND_SERVICE权限)。 - 定期调用
PackageManager.getInstalledPackages()获取当前所有应用包名。 - 将当前包名列表与本地存储的历史列表对比,发现新增项时执行代码。
- 启动前台服务,确保进程不被系统回收(需申请
- 注意:合理设置扫描间隔(比如5-10分钟一次),避免过度消耗电量和资源。
权限与限制说明
- 前台服务:Android 9.0及以上需申请
FOREGROUND_SERVICE权限,且必须显示通知告知用户服务运行状态。 - 无障碍服务:属于敏感权限,应用上架时需详细说明权限用途,避免被平台拒绝。
- Android 12+对后台进程限制更严格,前台服务是维持进程存活的可靠方式,但需严格遵循系统权限规范。
内容的提问来源于stack exchange,提问作者hacker1024
相关产品推荐
相关产品推荐

