Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取前台应用程序和/或活动?_Java_Android - Fatal编程技术网

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

Java 如何获取前台应用程序和/或活动?,java,android,Java,Android,我正在研制一个用于Android电视设备和Smartthings Hub之间集成的遥控器。我希望能够看到哪个应用程序处于活动状态(前台,向用户显示) 我的应用程序是一个软键盘,因此它是作为服务运行的(输入法服务) 我找到了以下代码并进行了尝试: ActivityManager.RunningAppProcessInfo result=null; String pname="process: "; ActivityManager activityManager = (ActivityManager

我正在研制一个用于Android电视设备和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;
    }
}
然后,它将我的应用程序(键盘)显示为正在运行的应用程序

因此,这似乎只显示属于我应用程序一部分的应用程序或活动。我如何获取整个Android系统的这些信息? 需要许可吗

如果这在普通应用程序中不可行,并且只有在一些附加权限或可访问性功能的情况下才可能实现,我愿意使用它,因为该应用程序不是商业应用程序,如果任何其他Smartthings用户不要求它,它将不会被分发。 我就是不能使用根设备。除此之外,我什么都可以试试。

试试这个:

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;
}
公共静态布尔isAppStatus(上下文){
布尔值isAppStatus=true;
ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_服务);
if(Build.VERSION.SDK\u INT>Build.VERSION\u code.KITKAT\u WATCH){
List runningprocesss=am.getrunningappprocesss();
对于(ActivityManager.RunningAppProcessInfo processInfo:RunningProcesss){
if(processInfo.importance==ActivityManager.RunningAppProcessInfo.importance\u前台){
for(字符串activeProcess:processInfo.pkgList){
if(activeProcess.equals(context.getPackageName())){
isAppStatus=假;
}
}
}
}
}否则{
List taskInfo=am.getRunningTasks(1);
ComponentName componentInfo=taskInfo.get(0).topActivity;
if(componentInfo.getPackageName().equals(context.getPackageName())){
isAppStatus=假;
}
}
返回isAppStatus;
}

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

这是为了检查我的进程是否为活动进程,但是,我正在尝试获取当前活动进程。无论如何,我修改了它,使它将“for”循环中的“activeProcess”写入日志。但它没有显示任何东西。事实上,这是预期的结果,因为在这个问题上,您的代码与我的示例没有太大不同。我不明白为什么它不起作用。我从服务中调用它,上下文在onCreate中定义为“context=this;”。这样行吗?
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;
}