获取 Android 应用切换事件的多种方法

学习笔记作者:admin日期:2025-05-28点击:32

摘要:介绍通过 AccessibilityEvent、ActivityLifecycleCallbacks、UsageStatsManager、ActivityManager 和 WindowManager 等方式获取应用切换事件的实现方法和注意事项。

获取 Android 应用切换事件的多种方法

      在 Android 开发中,获取应用切换事件是一项常见的需求。以下是几种常用的方法及其实现细节:

1. 使用 AccessibilityEvent

      AccessibilityEvent 是无障碍服务的核心类,可以通过监听 onAccessibilityEvent() 方法来捕获应用切换事件。具体步骤如下:

  • 重写 onAccessibilityEvent(AccessibilityEvent event) 方法。
  • 检查 event.eventType 是否为 TYPE_WINDOW_STATE_CHANGED
  • 获取当前前台应用的包名。
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
    if (event?.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
        val packageName = event.packageName
        println("当前前台应用包名: $packageName")
    }
}

2. 使用 ActivityLifecycleCallbacks

      通过 Application.ActivityLifecycleCallbacks 可以监听当前应用内的 Activity 切换。具体步骤如下:

  • 在自定义的 Application 类中注册 ActivityLifecycleCallbacks
  • 监听 onActivityResumed()onActivityPaused() 方法。
class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityResumed(activity: Activity) {
                println("Activity 切换到前台: ${activity.javaClass.simpleName}")
            }

            override fun onActivityPaused(activity: Activity) {
                println("Activity 切换到后台: ${activity.javaClass.simpleName}")
            }

            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
            override fun onActivityStarted(activity: Activity) {}
            override fun onActivityStopped(activity: Activity) {}
            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
            override fun onActivityDestroyed(activity: Activity) {}
        })
    }
}

3. 使用 UsageStatsManager

      通过 UsageStatsManager 可以获取设备上所有应用的使用情况。具体步骤如下:

  • 添加权限 android.permission.PACKAGE_USAGE_STATS
  • 引导用户授予“使用情况访问权限”。
  • 查询最近使用的应用。
val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val endTime = System.currentTimeMillis()
val startTime = endTime - 1000 * 60 // 最近一分钟

val stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime)
stats?.let {
    it.sortedByDescending { it.lastTimeUsed }.firstOrNull()?.let { recentApp ->
        println("最近使用的应用包名: ${recentApp.packageName}")
    }
}

4. 使用 ActivityManager

      通过 ActivityManager 可以获取当前前台应用的信息。具体步骤如下:

  • 获取 ActivityManager 实例。
  • 调用 getRunningTasks()getRunningAppProcesses() 获取前台应用。
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    val appProcess = activityManager.runningAppProcesses.find { it.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND }
    appProcess?.let {
        println("当前前台应用包名: ${it.processName}")
    }
} else {
    @Suppress("DEPRECATION")
    val taskInfo = activityManager.getRunningTasks(1).firstOrNull()
    taskInfo?.let {
        println("当前前台应用包名: ${it.topActivity?.packageName}")
    }
}

5. 使用 WindowManager

      通过 WindowManager 可以监听窗口变化。具体步骤如下:

  • 添加悬浮窗权限。
  • 监听窗口焦点变化。
// 代码示例省略,需结合具体需求实现

总结

      以上介绍了五种获取应用切换事件的方法,每种方法都有其适用场景和局限性。开发者应根据实际需求选择合适的方法,同时注意权限管理和隐私保护。

上一篇      下一篇