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

Android Studio:如何在指定应用启动时触发自身应用/Activity启动?

监听应用启动的可行方案

针对你需要监听任意应用启动并触发自身Activity的需求,以下两个方案是当前Android生态下最可行且相对简单的实现方式:

一、使用UsageStatsManager(官方推荐)

从Android 5.0(API 21)开始,系统提供了UsageStatsManager API,专门用于获取应用使用统计数据,包括应用启动、切换的事件。相比后台轮询的Service,这个方案更合规,不需要自己维持长期后台进程。

实现步骤:

  1. 申请特殊权限
    在AndroidManifest.xml中添加权限:

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />
    

    这个权限无法通过常规的requestPermissions申请,需要引导用户跳转到系统设置页面授权:

    val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    startActivity(intent)
    
  2. 监听应用启动事件

    • Android 10(API 29)及以上:可以注册UsageEvents.Callback实时接收事件
      val usageStatsManager = getSystemService(USAGE_STATS_SERVICE) as UsageStatsManager
      val callback = object : UsageEvents.Callback() {
          override fun onEvents(events: UsageEvents) {
              var event = UsageEvents.Event()
              while (events.getNextEvent(event)) {
                  if (event.eventType == UsageEvents.Event.ACTIVITY_RESUMED) {
                      // 捕获到应用启动/切换到前台的事件
                      val targetPackage = "com.target.app"
                      if (event.packageName == targetPackage) {
                          // 启动自身Activity
                          val launchIntent = packageManager.getLaunchIntentForPackage(packageName)?.apply {
                              flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
                          }
                          launchIntent?.let { startActivity(it) }
                      }
                  }
              }
          }
      }
      // 注册回调,监听最近的事件
      usageStatsManager.registerUsageEventsCallback(mainExecutor, callback)
      
    • Android 10以下:需要定期轮询queryUsageStats获取应用使用记录,判断是否有目标应用启动

二、使用AccessibilityService(实时性更高)

辅助功能服务由系统托管,能实时监听窗口状态变化,不需要自己维持后台进程,适合对实时性要求高的场景。

实现步骤:

  1. 创建AccessibilityService子类

    class AppLaunchMonitorService : AccessibilityService() {
        override fun onAccessibilityEvent(event: AccessibilityEvent) {
            if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
                val packageName = event.packageName?.toString() ?: return
                val targetPackage = "com.target.app"
                if (packageName == targetPackage) {
                    // 启动自身Activity
                    val intent = packageManager.getLaunchIntentForPackage(packageName)?.apply {
                        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
                    }
                    intent?.let { startActivity(it) }
                }
            }
        }
    
        override fun onInterrupt() {}
    }
    
  2. 在Manifest中声明服务

    <service
        android:name=".AppLaunchMonitorService"
        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_service_config" />
    </service>
    
  3. 创建辅助功能配置文件
    在res/xml下新建accessibility_service_config.xml:

    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeWindowStateChanged"
        android:accessibilityFeedbackType="feedbackGeneric"
        android:accessibilityFlags="flagDefault"
        android:canRetrieveWindowContent="true" />
    
  4. 引导用户开启辅助功能
    需要提示用户进入系统设置的辅助功能页面开启你的服务,代码参考:

    val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    startActivity(intent)
    

方案对比与注意事项

  • UsageStatsManager:权限申请逻辑清晰,符合系统规范,但Android 10以下只能轮询,存在一定延迟;
  • AccessibilityService:实时性强,但用户开启辅助功能的门槛较高,且不能滥用该权限(否则可能被应用商店拒绝上架);
  • 后台启动Activity限制:Android 10(API 29)及以上对后台启动Activity有严格限制,若你的应用处于后台,可能需要配合PendingIntent或确保满足系统允许后台启动的条件(如应用最近被用户交互过、有前台服务等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:05:03