You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在新应用安装时触发自身应用后台代码运行?

实现新应用安装时触发代码执行的方案

方案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:借助无障碍服务(无需依赖广播,后台持续运行)

  • 无障碍服务可监听系统窗口变化、通知栏事件,以此判断新应用是否安装完成。这种方式不需要依赖广播,只要用户开启无障碍权限,就能在后台持续运行。
  • 实现步骤:
    1. 清单文件声明服务:
      <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>
      
    2. 创建无障碍配置文件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" />
      
    3. 实现服务逻辑:
      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:前台服务+定时扫描(兜底方案)

  • 如果前两种方式受系统限制无法满足需求,可通过前台服务维持进程存活,定时扫描设备应用列表,对比历史记录找出新增应用。
  • 核心思路:
    1. 启动前台服务,确保进程不被系统回收(需申请FOREGROUND_SERVICE权限)。
    2. 定期调用PackageManager.getInstalledPackages()获取当前所有应用包名。
    3. 将当前包名列表与本地存储的历史列表对比,发现新增项时执行代码。
  • 注意:合理设置扫描间隔(比如5-10分钟一次),避免过度消耗电量和资源。

权限与限制说明

  • 前台服务:Android 9.0及以上需申请FOREGROUND_SERVICE权限,且必须显示通知告知用户服务运行状态。
  • 无障碍服务:属于敏感权限,应用上架时需详细说明权限用途,避免被平台拒绝。
  • Android 12+对后台进程限制更严格,前台服务是维持进程存活的可靠方式,但需严格遵循系统权限规范。

内容的提问来源于stack exchange,提问作者hacker1024

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:58:04