我正在开发一个应用程序,它将在一整天内监控手机的使用情况。为此,我有一个后台服务,在设备启动时启动,并不断轮询以查找当前前台应用程序。当我只是点击一个应用程序然后退出并点击另一个应用程序时,下面的代码可以正常工作。现在假设我打开浏览器并转到另一个网页,它将停止注册浏览器作为前台应用程序。或者例如,我打开谷歌聊天,它将注册它作为当前活动,但当我发送消息时,它将不再注册为前台应用程序。你认为这个 bug 的原因可能是什么?如果需要,我会提供任何额外的信息,请告诉我。
也许答案就在这篇帖子里,但我找不到... 从后台任务或服务确定当前前台应用程序
也许答案就在这篇帖子里,但我找不到... 从后台任务或服务确定当前前台应用程序
public static RunningAppProcessInfo getForegroundApp() throws NameNotFoundException{
RunningAppProcessInfo result = null, info = null;
String currApp = null;
am = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE);
Drawable icon = null;
List <RunningAppProcessInfo> l = am.getRunningAppProcesses();
Iterator <RunningAppProcessInfo> i = l.iterator();
PackageManager pm = context.getPackageManager();
while(i.hasNext()){
info = i.next();
if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && getActivityForApp(info)!=null ){
try {
currApp = getCurrentApplication(info);
System.out.println(currApp);
System.out.println(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
icon = pm.getApplicationIcon(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
System.out.println(getActivityForApp(info));
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
return result;
}
private static ComponentName getActivityForApp(RunningAppProcessInfo target){
ComponentName result=null;
ActivityManager.RunningTaskInfo info;
if(target==null)
return null;
if(am==null)
am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List <ActivityManager.RunningTaskInfo> l = am.getRunningTasks(9999);
Iterator <ActivityManager.RunningTaskInfo> i = l.iterator();
while(i.hasNext()){
info=i.next();
if(info.baseActivity.getPackageName().equals(target.processName)){
result=info.topActivity;
break;
}
}
return result;
}