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