本文介绍如何通过 accessibilityservice 监听系统中其他应用的启动行为,并结合“显示在其他应用上方”权限实现在目标应用(如游戏)打开时自动启动你的应用或悬浮界面。
在 Android 中,无法直接监听或拦截其他应用的启动过程(出于隐私与安全限制),但可通过系统提供的 AccessibilityService 机制间接实现类似效果。该服务允许应用接收系统级 UI 事件(如 Activity 切换、窗口焦点变化),从而判断是否有新应用被打开。
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() {}
}配置 accessibility_service_config.xml(位于 res/xml/)
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowsChanged" android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews" android:canRetrieveWindowContent="true" android:notificationTimeout="100" />
在 AndroidManifest.xml 中注册服务
动态申请必要权限
借助 AccessibilitySe
