首页 > 解决方案 > 如何跟踪应用程序启动

问题描述

如何跟踪用户启动的应用程序,我发现使用accessibilityService可以做到这一点,但我不喜欢这种方法。我在 Play Market 中看到应用程序会使用 PIN 码阻止其他应用程序,它们会以某种方式跟踪应用程序的启动,而我只允许他们查看应用程序统计信息

标签: javaandroidkotlin

解决方案


尝试这个

第二个选项是创建一个使用标志扩展 Application 的类,例如 isAppRunning,根据您的应用程序是否在前台,该标志将是 true 或 false:

   public class MyAppContext extends Application {

   public boolean isAppRunning = true;

   public void setIsAppRunning(boolean v){
      isAppRunning = v;
   }

   public boolean isAppRunning(){
      return isAppRunning;
   }

}

然后在您的 AndroidManifest.xml 上,您必须添加此类,以便在您的应用程序启动时使用它。只需在 application 标签下添加 android:name=".MyAppContext" :

<application
        android:name=".MyAppContext"

现在,在您拥有的每个活动中,您应该覆盖 onResume() 和 onPause() 并将标志设置为相应的值:

class BaseActivity extends Activity {
    @Override
    protected void onResume() {
        super.onResume();
        ((MyAppContext)getApplication()).setIsAppRunning(true);
    }

    @Override
    protected void onPause() {
        ((MyAppContext)getApplication()).setIsAppRunning(false);
        super.onPause();
    }
}

这样,每次启动 Activity 时,MyAppContext 中 isAppRunning 的值为 true,当您退出 Activity 时,它将为 false,但如果打开另一个 Activity(例如,如果您按下后退按钮,那么您将返回到上一个活动) 该值将立即再次为真。

当您最终完成所有活动时,将不会调用任何 onResume() 方法,并且将调用所有 onPause() 方法,因此 isAppRunning 将为 false 并且您知道您的 Activity 不再处于前台。

所以恢复,如果 isAppRunning 为真,你的应用程序就在前台(启动会话跟踪),否则它就消失了(停止会话跟踪)。您可以在 MyAppContext 类中创建一个 Timer 来定期检查 isAppRunning 的值,因此它将是:

public class MyAppContext extends Application {

   public boolean isAppRunning = true;
   public final int timerRate = 500;    // Execute timer task every 500mS

   public void setIsAppRunning(boolean v){
      isAppRunning = v;
   }

   public boolean isAppRunning(){
      return isAppRunning;
   }

   @Override
   public void onCreate() {
      super.onCreate();
      Timer mTimer = new Timer();

      mTimer.scheduleAtFixedRate(new TimerTask() {
         @Override
         public void run() {
            if(isAppRunning) startSesionTracking();
            else stopSesionTracking();
         }
      }, 0, REFRESH_TIME);
   }

   private void startSesionTracking () { ... };
   private void stopSesionTracking () { ... };

}

推荐阅读