android - 如何在 Lollipop 中获取 `getTopActivity` 名称或获取当前正在运行的应用程序包名称?

标签 android android-5.0-lollipop

我正在创建应用程序锁定应用程序。如何在 Lollipop 中获取当前正在运行的任务? getRunningTaskinfo 方法在 Lollipop API 中被弃用了,那么如何解决这个问题呢?

最佳答案

试试这个:

ActivityManager mActivityManager =(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);

if(Build.VERSION.SDK_INT > 20){
String mPackageName = mActivityManager.getRunningAppProcesses().get(0).processName;
}
else{
  String mpackageName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}

我们可以使用 UsageStats:

public static String getTopAppName(Context context) {
    ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    String strName = "";
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            strName = getLollipopFGAppPackageName(context);
        } else {
            strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return strName;
}


private static String getLollipopFGAppPackageName(Context ctx) {

    try {
        UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService("usagestats");
        long milliSecs = 60 * 1000;
        Date date = new Date();
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime());
        if (queryUsageStats.size() > 0) {
            Log.i("LPU", "queryUsageStats size: " + queryUsageStats.size());
        }
        long recentTime = 0;
        String recentPkg = "";
        for (int i = 0; i < queryUsageStats.size(); i++) {
            UsageStats stats = queryUsageStats.get(i);
            if (i == 0 && !"org.pervacio.pvadiag".equals(stats.getPackageName())) {
                Log.i("LPU", "PackageName: " + stats.getPackageName() + " " + stats.getLastTimeStamp());
            }
            if (stats.getLastTimeStamp() > recentTime) {
                recentTime = stats.getLastTimeStamp();
                recentPkg = stats.getPackageName();
            }
        }
        return recentPkg;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "";
}

//启用 USAGE_STATS

    // Declare USAGE_STATS permisssion in manifest

    <uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />


    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    startActivity(intent);

关于android - 如何在 Lollipop 中获取 `getTopActivity` 名称或获取当前正在运行的应用程序包名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066231/

相关文章:

java - 为什么我无法通过无线 ADB 安装此 Android 程序?

android - 与 Dialog Activity 共享元素转换

android - 是否有可能获得另一个应用程序的原色,如 Lollipop 的最近 View

Android 谷歌地图 Activity 无法启动

Android 向左/向右滑动以分页,向上/向下滑动以在 webView 中滚动

android - ViewPager 中的 Espresso Recylerview 匹配多个 View

Android Lollipop Activity 屏幕已损坏

java - W/TextToSpeech : speak failed: not bound to TTS engine

android - 尝试测试 AnimatedVectorDrawable 时出错, "Can' t 从 x 到 z 变形”

android - 如何避免我的应用程序在三星设备上进入优化