Android получает имя пакета приложения верхнего уровня стека

Требования: Поскольку необходимо реализовать функцию блокировки приложения, необходимо оценить экран блокировки приложения, отображаемого на переднем плане, поэтому, когда фоновая служба блокировки приложения приостановлена, необходимо оценить имя пакета приложения на вершина стека.

Вот краткое изложение

До Android 5.0 мы часто использовали методы ActivityManagerкласса getRunningTasks(), чтобы получить текущий список задач, а затем получить задачу наверху стека (то есть верхнее приложение). Ниже приведен пример кода для получения имени пакета приложения в верхней части стека: (это код java, если вы хотите использовать kotlin, вы можете просто использовать AS для его переключения)

import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;

public String getTopPackageName(Context context) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (activityManager != null) {
        // 获取任务列表
        List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(1);
        if (runningTasks != null && !runningTasks.isEmpty()) {
            // 获取栈顶任务
            ActivityManager.RunningTaskInfo taskInfo = runningTasks.get(0);
            // 获取栈顶应用的包名
            ComponentName componentName = taskInfo.topActivity;
            if (componentName != null) {
                return componentName.getPackageName();
            }
        }
    }
    return null;
}

Однако, чтобы защитить конфиденциальность пользователей, Google отказался от этого метода.Теперь он использует UsageStatsManager, чтобы определить, какое приложение использовалось последним.Да, он может определить только последнее приложение.

import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;

import java.util.List;

public String getRecentAppPackageName(Context context) {
    UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
    if (usageStatsManager != null) {
        // 获取当前时间戳
        long endTime = System.currentTimeMillis();
        long startTime = endTime - 5000; // 设置查询的时间范围,例如最近5秒内的应用程序
        
        // 查询最近使用的应用程序
        List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, startTime, endTime);
        if (usageStatsList != null && !usageStatsList.isEmpty()) {
            // 找到最近使用的应用程序
            UsageStats recentUsageStats = null;
            for (UsageStats usageStats : usageStatsList) {
                if (recentUsageStats == null || usageStats.getLastTimeUsed() > recentUsageStats.getLastTimeUsed()) {
                    recentUsageStats = usageStats;
                }
            }
            
            // 获取最近使用应用程序的包名
            if (recentUsageStats != null) {
                return recentUsageStats.getPackageName();
            }
        }
    }
    return null;
}

Таким образом, можно получить приложение на вершине стека.

Кроме того, чтобы определить, какое приложение отображается в данный момент, вы можете использовать ActivityManager для оценки.Обратите внимание , что если вы используете определенное приложение, плавающее окно всегда будет этим приложением, если плавающее окно не закрыто.

import android.app.ActivityManager;
import android.content.Context;

public boolean isAppForeground(Context context, String packageName) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (activityManager != null) {
        // 获取当前运行的进程列表
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        if (appProcesses != null) {
            // 遍历进程列表
            for (ActivityManager.RunningAppProcessInfo processInfo : appProcesses) {
                // 判断指定应用程序的进程是否处于前台
                if (processInfo.processName.equals(packageName) && processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    return true;
                }
            }
        }
    }
    return false;
}

Supongo que te gusta

Origin blog.csdn.net/LoveFHM/article/details/130630723
Recomendado
Clasificación