【问题标题】:How to find the currently running applications programmatically in Android?如何在 Android 中以编程方式查找当前正在运行的应用程序?
【发布时间】:2011-11-11 08:22:06
【问题描述】:

我对 Android 很陌生。我正在开发必须获取有关当前在前台运行的应用程序的信息的应用程序。

这意味着如果用户启动任何应用程序,我的应用程序应该在我的应用程序不中断启动的应用程序之前捕获启动的应用程序信息。

示例:如果用户启动浏览器应用程序,我的应用程序应在日志中打印浏览器应用程序信息。

我该怎么做?

【问题讨论】:

标签: java android android-service


【解决方案1】:
ActivityManager activity_manager = (ActivityManager) context
                .getSystemService(Activity.ACTIVITY_SERVICE);

ActivityManager 有方法getRunningTasks(int)ActivityManager 似乎是您正在寻找的解决方案。

final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final List<RunningTaskInfo> recentTasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

for (int i = 0; i < recentTasks.size(); i++) 
{
    Log.d("Executed app", "Application executed : " +recentTasks.get(i).baseActivity.toShortString()+ "\t\t ID: "+recentTasks.get(i).id+"");         
}

另外,看看以下线程: See Android recent task executed by the user

【讨论】:

  • 方法getRunningTasks(int maxNum), was deprecated in the API level 21(LOLLIPOP),出于安全考虑,有可能将个人信息泄露给第三方应用程序。 (如果您使用此方法请注意,以后的 Android 版本将不支持此方法)。
  • 有人找到了一种真正适用于做与 getRunningTasks(int maxNum) 相同的事情的解决方法吗?非常感谢!
  • 我必须把上面的代码放在哪里?我尝试将代码放在 onCreate 上,即使我尝试打开其他应用程序,它也只会显示 MainActivity。即使我将代码放在服务类的 run() 方法上,它也只显示 MainActivity
【解决方案2】:

你可以使用类似这样的东西:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

for (int i = 0; i < tasks.size(); i++) {
    Log.d("Running task", "Running task: " + tasks.get(i).baseActivity.toShortString() + "\t\t ID: " + tasks.get(i).id);
}

【讨论】:

  • 感谢大家的重播。从上面的代码中,当我打开我的应用程序时,我可以获得当前正在运行的应用程序信息。如何在不中断其他应用程序的情况下,我的应用程序应该获得当前正在运行的信息和它应该在 logcat 中显示它。如果有人知道请帮助我努力做到这一点。
  • 如何找到当前正在运行的应用程序的图标?
【解决方案3】:

此代码将提供当前活动 logcat

Process logcatProc;
List <String> progs = new ArrayList <String>();

progs.add("logcat");
progs.add("-v");
progs.add(mFormat.getValue());
if (mBuffer != Buffer.MAIN) {
        progs.add("-b");
        progs.add(mBuffer.getValue());
}
progs.add("*:" + mLevel);

logcatProc = Runtime.getRuntime()
                .exec(progs.toArray(new String[0]));

mReader = new BufferedReader(new InputStreamReader(
                logcatProc.getInputStream()), 1024);

String line;
while (mRunning && (line = mReader.readLine()) != null) {
    if (!mRunning) {
            break;
    }
    if (line.length() == 0) {
            continue;
    }
    if (mIsFilterPattern) {
        if (mFilterPattern != null && !mFilterPattern.matcher(line).find()) {
            continue;
        }
    } else {
        if (mFilter != null && !line.toLowerCase().contains(mFilter.toLowerCase())) {
            continue;
        }
    }
    synchronized (mLogCache) {
            mLogCache.add(line);
    }
}

【讨论】:

    【解决方案4】:

    出于安全原因,ActivityManager.getRunningTasks(int) 自 API 21 起已被弃用。您可以使用ActivityManager.RunningTaskInfo() 至少获取正在运行此活动的当前任务的任务信息(尽管 API 29 不推荐使用 RunningTaskInfo() 的某些字段,但不是整个方法)。

    有关 RunningTaskInfo() 的更多信息,请参阅 Google's docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多