打开特定应用程序时启动/停止计时器

时间:2013-12-28 21:45:40

标签: android timer

我想知道是否有任何方法可以用来找出所选应用程序何时打开/关闭。例如,当此应用程序在后台运行时,如果打开Facebook,则会将其返回给应用程序并启动计时器。任何帮助将不胜感激!

1 个答案:

答案 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) {

               }
            } 
        }
   }