我想知道是否有任何方法可以用来找出所选应用程序何时打开/关闭。例如,当此应用程序在后台运行时,如果打开Facebook,则会将其返回给应用程序并启动计时器。任何帮助将不胜感激!
答案 0 :(得分:2)
解决此问题的一种方法是验证正在运行的进程列表,并通过使用RunningAppProcessInfo#importance检查其重要性级别,该级别可以是从前台进程到空进程的任何位置。
您感兴趣的是前台流程。 引用documentation:
前景过程
用户所需的流程 正在做。如果过程被认为是前景 满足以下任何条件:
它托管一个活动 用户正在与之交互(Activity的onResume()方法具有 被称为。)
它托管一个绑定到该活动的服务 用户正在与之互动。它托管一个正在运行的服务 前景“ - 该服务已调用startForeground()。
它主持一个 正在执行其生命周期回调之一的服务(onCreate(), onStart()或onDestroy())。
它主持一个BroadcastReceiver 执行onReceive()方法。
一般来说,只有少数前景 过程存在于任何给定的时间。他们只是作为最后一个被杀死 度假 - 如果内存太低,他们不能继续运行。 通常,此时,设备已达到内存分页 状态,因此需要杀死一些前台进程来保持 用户界面响应。
问题在于,如果它属于最后两个类别之一(服务或 BroadcastReceiver ),则可能存在一些误报。但我相信,这就越接近你。您可以通过另外检查the importanceReasonCode field来消除这些误报。
另一个挑战是知道何时检查此信息。轮询是一个坏主意,因为你将消耗大量电池,但如果你只是在短时间/特定时间范围内进行轮询,在此期间您将定期轮询以估计应用程序的时间长度,这是一个坏主意。一直在运行。
<强> [编辑] 强>
一个片段,显示如何遍历正在运行的进程并确定重要性级别,以及获取与这些进程相关的包。
public void findRunningApps() {
ActivityManager activityManager = (ActivityManager)
context.getSystemService(Activity.ACTIVITY_SERVICE);
for (RunningAppProcessInfo processInfo : activityManager.getRunningAppProcesses()) {
if(processInfo.importance == IMPORTANCE_FOREGROUND) {
for (String packageName : processInfo.pkgList) {
}
}
}
}