如何获得前台应用程序和/或活动?

时间:2019-06-01 08:03:52

标签: java android

我正在研究用于Android TV设备和Smartthings Hub之间集成的遥控器。我希望能够查看哪个应用程序处于活动状态(前景,显示给用户)。

我的应用是软键盘,因此作为服务(输入法服务)运行

我找到了以下代码并进行了尝试:

ActivityManager.RunningAppProcessInfo result=null;
String pname="process: ";
ActivityManager activityManager = (ActivityManager) ctx.getSystemService( Context.ACTIVITY_SERVICE );
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();

Iterator <ActivityManager.RunningAppProcessInfo> i = appProcesses.iterator();

while(i.hasNext()){
    ActivityManager.RunningAppProcessInfo info = i.next();
    Log.d("LOG : " , info.processName);

    if(info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
    {
         result=info;
         break;
    }
}

但是它不会释放任何应用程序。如果我删除条件

"info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND"

然后将我的应用(键盘)显示为正在运行的应用。

因此,这似乎仅显示属于我的应用程序的应用程序或活动。如何获得整个Android系统的信息? 需要权限吗?

如果这对于普通应用程序而言是不可能的,并且仅在具有某些附加权限或可访问性功能的情况下才有可能实现,所以我愿意使用它,因为该应用程序不是商业应用程序,如果有其他任何Smartthings也不会分发用户不需要。 我只是不能使用植根设备。除此之外,我什么都可以尝试。

2 个答案:

答案 0 :(得分:1)

尝试一下:

public static boolean isAppStatus(Context context) {
    boolean isAppStatus = true;
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (String activeProcess : processInfo.pkgList) {
                    if (activeProcess.equals(context.getPackageName())) {
                        isAppStatus = false;
                    }
                }
            }
        }
    } else {
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(context.getPackageName())) {
            isAppStatus = false;
        }
    }
    return isAppStatus;
}

答案 1 :(得分:0)

这似乎是不可能的,因为Google仅将此功能限制为系统应用程序。 关于这个问题有许多误导性的答案。不幸的是,大多数答案都假设我们只想检查我们的应用程序是否在前台。但是,正如问题中所述,问题是试图获取活动应用程序(而非我们的应用程序)的名称。