Android Studio:如何在指定应用启动时触发自身应用/Activity启动?
监听应用启动的可行方案
针对你需要监听任意应用启动并触发自身Activity的需求,以下两个方案是当前Android生态下最可行且相对简单的实现方式:
一、使用UsageStatsManager(官方推荐)
从Android 5.0(API 21)开始,系统提供了UsageStatsManager API,专门用于获取应用使用统计数据,包括应用启动、切换的事件。相比后台轮询的Service,这个方案更合规,不需要自己维持长期后台进程。
实现步骤:
申请特殊权限
在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)监听应用启动事件
- 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获取应用使用记录,判断是否有目标应用启动
- Android 10(API 29)及以上:可以注册
二、使用AccessibilityService(实时性更高)
辅助功能服务由系统托管,能实时监听窗口状态变化,不需要自己维持后台进程,适合对实时性要求高的场景。
实现步骤:
创建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() {} }在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>创建辅助功能配置文件
在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" />引导用户开启辅助功能
需要提示用户进入系统设置的辅助功能页面开启你的服务,代码参考: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
相关产品推荐
相关产品推荐

