Android后台服务判断前台应用

标签 android service foreground

我正在开发一个可以全天监控手机使用情况的应用程序。为此,我有一个后台服务,它在设备启动时启动并不断轮询以找出当前的前台应用程序是什么。当我只是单击一个应用程序然后退出并单击另一个应用程序时,以下代码有效。现在假设我打开浏览器并转到另一个网页,它将停止将浏览器注册为前台应用程序。或者例如,我打开 google talk,它会将其注册为当前 Activity ,但是当我发送消息时,它将不再将其注册为前台应用程序。关于此错误的可能原因的任何想法或想法?如果需要,我会提供任何其他信息,请告诉我。 也许答案就在这篇文章中,我只是找不到... Determining the current foreground application from a background task or service

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;
}

最佳答案

下面的代码适合我。列表中的第一个任务是我需要确定前台应用程序名称。

ActivityManager activityManager = (ActivityManager) getSystemService(UpdateService.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> appProcesses = activityManager.getRunningTasks(1);

Log.i("MyApp", "Foreground Package: " + appProcesses.get(0).topActivity.getPackageName());

关于Android后台服务判断前台应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6363207/

相关文章:

android - Intent 的 ANR 广播 { act=android.intent.action.SCREEN_ON flg=0x50200010(有额外内容)}

android - 唤醒锁是静态的吗?如果是,我如何在一个应用程序中管理多个服务/唤醒锁?

winapi - 以无密码的用户身份启动服务

android - 奥利奥 - 在前台启动服务

wpf - 在 ControlTemplate 中更改 WPF TextBox 前景色

java - 如何从 fragment 开始向 Activity 添加 fragment ?

android - Gradle 组装特定 flavor 并构建

android - Android-Room 可以自动创建迁移吗?

java - 我可以从 osgi 控制台获取有关捆绑服务的哪些信息?

java - 如何使按钮的前景属性在 API 23 以下工作?