Android 5.0之后如何获取topStack

android5.0之前可以用下面代码获取

List<ActivityManager.RunningTaskInfo> infos = activityManager.getRunningTasks(1);

 String packname = infos.get(0).topActivity.getPackageName();
而android5.0之后

该方法已经被Google禁用,那么我们该如何获取呢,经过百度,Google 发现很多人也遇到了一样的问题,
通过结合网上的案例,我做了一些修改,
原理,通过ActivityManager获取运行的进程,然后经过过滤获得优先级高处于栈顶的进程,然后通过该进程的uid获得该进程的包名
public static String getCurrentPkgName(Context context) {
    ActivityManager.RunningAppProcessInfo currentInfo = null;
    Field field = null;
    int START_TASK_TO_FRONT = 2;
    String pkgName = null;
    try {
        field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
    } catch (Exception e) {
        e.printStackTrace();
    }
    PackageManager packageManager = context.getPackageManager();
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> appList = am.getRunningAppProcesses();
    for (ActivityManager.RunningAppProcessInfo app : appList) {
        if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && app.importanceReasonCode == ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN) {
            Integer state = null;
            try {
                state = field.getInt(app);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (state != null && state == START_TASK_TO_FRONT) {
                currentInfo = app;
                break;
            }
        }
    }
    String packename = null;
    if (currentInfo != null) {
        packename = packageManager.getNameForUid(currentInfo.uid);
    }
    return packename;
}

你可能感兴趣的:(android,topStack)