Android 获取当前屏幕运行的 App 包名

学习笔记作者:admin日期:2025-06-04点击:6

摘要:介绍如何在 Android 设备上获取当前屏幕正在运行的应用程序的包名,包括不同 API 版本的实现方式和注意事项。

Android 获取当前屏幕运行的 App 包名

      在 Android 开发中,获取当前屏幕正在运行的应用程序的包名(即前台应用的包名)需要根据不同的 Android 版本采取不同的方法。由于 Android 系统对权限和隐私的保护逐步加强,尤其是从 Android 5.0(API 21)开始,直接获取前台应用的信息变得更加严格。

1. Android 5.0(API 21)及以上版本

      从 Android 5.0 开始,ActivityManager.getRunningTasks() 方法被废弃,无法直接获取前台应用信息。取而代之的是通过 UsageStatsManager 来获取前台应用的包名。

实现步骤:

  1. 添加权限声明
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>>
  2. 引导用户授予权限
    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    startActivity(intent);
  3. 获取前台应用包名
    public String getForegroundAppPackageName(Context context) {
        UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        long currentTime = System.currentTimeMillis();
        List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, currentTime - 1000 * 60, currentTime);
    
        if (stats != null && !stats.isEmpty()) {
            UsageStats recentStats = null;
            for (UsageStats usageStats : stats) {
                if (recentStats == null || usageStats.getLastTimeUsed() > recentStats.getLastTimeUsed()) {
                    recentStats = usageStats;
                }
            }
            if (recentStats != null) {
                return recentStats.getPackageName(); // 返回前台应用的包名
            }
        }
        return null; // 如果未找到前台应用,返回 null
    }

2. Android 4.4(API 19)及以下版本

      在 Android 4.4 及以下版本中,可以使用 ActivityManager.getRunningTasks() 方法获取前台应用的包名。但由于该方法已被废弃,不建议在新项目中使用。

实现步骤:

  1. 获取前台应用包名
    public String getForegroundAppPackageName(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        if (activityManager != null) {
            List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1);
            if (taskInfo != null && !taskInfo.isEmpty()) {
                return taskInfo.get(0).topActivity.getPackageName(); // 返回前台应用的包名
            }
        }
        return null;
    }

3. 其他注意事项

  • 权限限制:从 Android 10(API 29)开始,Google 进一步限制了后台应用访问前台应用信息的能力。即使是 UsageStatsManager,也需要用户明确授权。
  • 隐私保护:获取前台应用信息可能涉及用户隐私,因此在实际开发中应谨慎使用,并确保符合相关法律法规(如 GDPR)。
  • 替代方案:如果只是为了监控特定应用的行为,可以考虑与目标应用进行协作,通过广播、服务绑定等方式实现信息共享。

总结

      对于 Android 5.0 及以上版本,推荐使用 UsageStatsManager 来获取前台应用的包名,但需要用户手动授予权限。对于 Android 4.4 及以下版本,可以使用 ActivityManager.getRunningTasks(),但该方法已被废弃。开发时需注意权限管理以及隐私合规性,避免因不当使用导致应用被下架或用户投诉。

上一篇      下一篇