如何在其他应用启动时自动打开你的 Android 应用并悬浮显示

本文介绍如何通过 accessibilityservice 监听系统中其他应用的启动行为,并结合“显示在其他应用上方”权限实现在目标应用(如游戏)打开时自动启动你的应用或悬浮界面。

在 Android 中,无法直接监听或拦截其他应用的启动过程(出于隐私与安全限制),但可通过系统提供的 AccessibilityService 机制间接实现类似效果。该服务允许应用接收系统级 UI 事件(如 Activity 切换、窗口焦点变化),从而判断是否有新应用被打开。

✅ 实现步骤概览

  1. 声明并配置 AccessibilityService
    创建继承自 AccessibilityService 的服务类,重写 onAccessibilityEvent(),重点监听 TYPE_WINDOW_STATE_CHANGED 或 TYPE_WINDOWS_CHANGED 事件:
public class AppLaunchMonitorService

extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { String packageName = event.getPackageName() != null ? event.getPackageName().toString() : ""; // 示例:当检测到某游戏包名启动时,触发响应 if ("com.example.game".equals(packageName)) { launchMyLauncher(); showFloatingOverlay(); // 如需悬浮窗 } } } private void launchMyLauncher() { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); } private void showFloatingOverlay() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { // 请求悬浮窗权限 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else { // 启动悬浮窗 Service(如 FloatingViewService) startService(new Intent(this, FloatingViewService.class)); } } @Override public void onInterrupt() {} }
  1. 配置 accessibility_service_config.xml(位于 res/xml/)

     android:accessibilityEventTypes="typeWindowStateChanged|typeWindowsChanged"
     android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews"
     android:canRetrieveWindowContent="true"
     android:notificationTimeout="100" />
  2. 在 AndroidManifest.xml 中注册服务

    
     
         
     
     
    
  3. 动态申请必要权限

  • ACCESSIBILITY_SERVICE:需用户手动在「设置 → 辅助功能」中启用你的服务;
  • SYSTEM_ALERT_WINDOW(即“显示在其他应用上方”):Android 6.0+ 需运行时请求(调用 Settings.canDrawOverlays() + ACTION_MANAGE_OVERLAY_PERMISSION)。

⚠️ 注意事项与限制

  • 非 100% 可靠:AccessibilityService 依赖 UI 状态变更,部分轻量级 Activity 切换或后台启动可能漏检;
  • 系统兼容性差异:MIUI、EMUI 等定制系统可能限制 AccessibilityService 行为,需针对性适配;
  • 隐私合规要求:Google Play 明确禁止滥用 AccessibilityService 实现非辅助功能(如广告注入、强制拉活),上线前务必确保用途符合 Play 政策;
  • ✅ 推荐替代思路:若仅需“游戏启动后快速唤起”,可考虑与目标游戏方合作,通过深度链接(Deep Link)或 App Links 协议触发唤醒(需对方配合)。

? 总结

借助 AccessibilityService 是当前 Android 平台下实现“监听其他应用启动”的主流可行方案,但需平衡功能性、稳定性与合规性。务必清晰告知用户服务用途,在设置页提供一键跳转入口,并做好降级处理(如监听失败时提示手动启动)。悬浮层实现请严格遵循 TYPE_APPLICATION_OVERLAY(Android 8.0+)规范,避免使用已废弃的 TYPE_PHONE 等类型。