首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从后台任务或服务确定当前前台应用

从后台任务或服务确定当前前台应用
EN

Stack Overflow用户
提问于 2010-01-30 13:24:05
回答 14查看 110.2K关注 0票数 115

我希望有一个在后台运行的应用程序,它知道何时任何内置的应用程序(消息,联系人等)正在运行。

所以我的问题是:

我应该如何在background.

  • How中运行我的应用程序后台应用程序可以知道当前在前台运行的应用程序是什么。

有经验的人会非常感谢你的回复。

EN

回答 14

Stack Overflow用户

发布于 2012-10-01 22:34:28

关于"2.我的后台应用程序如何知道当前在前台运行的应用程序是什么“。

不要使用getRunningAppProcesses()方法,因为这会从我的经验中返回各种系统垃圾,并且您会得到多个具有RunningAppProcessInfo.IMPORTANCE_FOREGROUND的结果。请改用getRunningTasks()

这是我在我的服务中用来识别当前前台应用程序的代码,它非常简单:

代码语言:javascript
运行
复制
ActivityManager am = (ActivityManager) AppService.this.getSystemService(ACTIVITY_SERVICE);
// The first in the list of RunningTasks is always the foreground task.
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);

就这样,你就可以轻松地访问前台应用程序/活动的详细信息了:

代码语言:javascript
运行
复制
String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
PackageManager pm = AppService.this.getPackageManager();
PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();

这需要activity menifest中的额外权限,并且可以完美地工作。

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.GET_TASKS" />
票数 105
EN

Stack Overflow用户

发布于 2011-04-03 16:17:38

我不得不通过艰难的方式找到正确的解决方案。下面的代码是cyanogenmod7 (平板电脑调整)的一部分,并在Android2.3.3/ gingerbread上进行了测试。

方法:

  • getForegroundApp -返回前台应用程序。
  • getActivityForApp -返回找到的应用程序的活动。
  • isStillActive -确定之前找到的应用程序是否仍为活动应用程序- getForegroundApp

的辅助函数

这有望在所有方面回答这个问题(:

代码语言:javascript
运行
复制
private RunningAppProcessInfo getForegroundApp() {
    RunningAppProcessInfo result=null, info=null;

    if(mActivityManager==null)
        mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List <RunningAppProcessInfo> l = mActivityManager.getRunningAppProcesses();
    Iterator <RunningAppProcessInfo> i = l.iterator();
    while(i.hasNext()){
        info = i.next();
        if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                && !isRunningService(info.processName)){
            result=info;
            break;
        }
    }
    return result;
}

private ComponentName getActivityForApp(RunningAppProcessInfo target){
    ComponentName result=null;
    ActivityManager.RunningTaskInfo info;

    if(target==null)
        return null;

    if(mActivityManager==null)
        mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List <ActivityManager.RunningTaskInfo> l = mActivityManager.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;
}

private boolean isStillActive(RunningAppProcessInfo process, ComponentName activity)
{
    // activity can be null in cases, where one app starts another. for example, astro
    // starting rock player when a move file was clicked. we dont have an activity then,
    // but the package exits as soon as back is hit. so we can ignore the activity
    // in this case
    if(process==null)
        return false;

    RunningAppProcessInfo currentFg=getForegroundApp();
    ComponentName currentActivity=getActivityForApp(currentFg);

    if(currentFg!=null && currentFg.processName.equals(process.processName) &&
            (activity==null || currentActivity.compareTo(activity)==0))
        return true;

    Slog.i(TAG, "isStillActive returns false - CallerProcess: " + process.processName + " CurrentProcess: "
            + (currentFg==null ? "null" : currentFg.processName) + " CallerActivity:" + (activity==null ? "null" : activity.toString())
            + " CurrentActivity: " + (currentActivity==null ? "null" : currentActivity.toString()));
    return false;
}

private boolean isRunningService(String processname){
    if(processname==null || processname.isEmpty())
        return false;

    RunningServiceInfo service;

    if(mActivityManager==null)
        mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List <RunningServiceInfo> l = mActivityManager.getRunningServices(9999);
    Iterator <RunningServiceInfo> i = l.iterator();
    while(i.hasNext()){
        service = i.next();
        if(service.process.equals(processname))
            return true;
    }

    return false;
}
票数 38
EN

Stack Overflow用户

发布于 2010-12-28 13:55:17

尝试以下代码:

代码语言:javascript
运行
复制
ActivityManager activityManager = (ActivityManager) newContext.getSystemService( Context.ACTIVITY_SERVICE );
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for(RunningAppProcessInfo appProcess : appProcesses){
    if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
        Log.i("Foreground App", appProcess.processName);
    }
}

进程名是前台运行的应用的包名。将其与应用程序的包名进行比较。如果它是相同的,那么你的应用程序在前台运行。

我希望这能回答你的问题。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2166961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档