Android应用开始和结束事件

Kas*_*sma 10 android android-activity

我有一个应用程序跟踪应用程序上的用户活动,包括时间等,现在,如果用户已打开应用程序,它将启动一个会话,直到该应用程序中的用户,他的会话将继续,他可以切换到多个活动.现在他同时切换到另一个应用程序,他的会话日志记录应该停止并写入文件

我尝试了什么

我创建了一个基本活动和On resume事件,如果计数器为零,我启动会话并递增计数器和On stop事件,我减少计数器,如果计数器为零,我停止会话

但这不会计算跟踪的实际问题,因为当用户切换到另一个应用程序时,android不会停止活动.

那么有没有办法实现这样的事情.

额外:

如果我们可以在屏幕上查看应用活动是否处于活动状态,那么可以使用事件来开始或结束会话.

And*_*res 5

我可以想到两种方法:

选项1:

您可以创建一个服务,在前台扫描当前应用程序并查看它是否是您的活动.这是你可以使用的一些代码,我从另一个答案中得到了它:

有一种从ActivityManager服务获取正在运行的任务列表的简单方法.您可以请求在手机上运行的最大任务数,默认情况下,首先返回当前活动的任务.

完成后,您可以通过从列表中请求topActivity来获取ComponentName对象.

这是一个例子.

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);

     // get the info from the currently running task
     List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1); 

     Log.d("topActivity", "CURRENT Activity ::"
             + taskInfo.get(0).topActivity.getClassName());

     ComponentName componentInfo = taskInfo.get(0).topActivity;
   componentInfo.getPackageName();
Run Code Online (Sandbox Code Playgroud)

您的清单上需要以下权限:

<uses-permission android:name="android.permission.GET_TASKS"/>
Run Code Online (Sandbox Code Playgroud)

链接答案:Android:如何获取当前前台活动(来自服务)?

您可以每隔一秒或更短时间调用此方法来检测您的应用是否仍处于活动状态.根据官方文档,请注意它已被弃用,不建议用于此类事物:

getRunningTasks()

注意:此方法仅用于调试和呈现任务管理用户界面.这绝不应该用于应用程序中的核心逻辑,例如根据此处的信息在不同的行为之间进行决策.不支持此类用途,并且将来可能会破坏.例如,如果多个应用程序可以同时主动运行,则出于控制流程的目的而对此处的数据含义进行的假设将是不正确的.


选项2:

第二个选项是创建一个topActivity使用标志扩展的类,例如Application,如果您的应用程序位于前台,则为true或false:

public class MyAppContext extends Application {

   public boolean isAppRunning = true;

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

   public boolean isAppRunning(){
      return isAppRunning;
   }

}
Run Code Online (Sandbox Code Playgroud)

然后,您isAppRunning必须添加此类,以便在应用程序启动时使用它.只需添加AndroidManifest.xml应用程序标记:

<application
        android:name=".MyAppContext"
Run Code Online (Sandbox Code Playgroud)

现在,在您拥有的每个活动中,您应该覆盖android:name=".MyAppContext"并将onResume()标志设置为相应的值:

class BaseActivity extends Activity {


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

    @Override
    protected void onPause() {
        ((MyAppContext)getApplication()).setIsAppRunning(false);
        super.onPause();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,每次启动一个Activity时,onPause()in 的值isAppRunning都是MyAppContext,当你退出true时它将是,Activity但是如果另一个Activity打开(例如,如果按下后退按钮,那么你将返回上一个活动),那么该值将是马上false又来了.

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

所以恢复,如果ActivityisAppRunning您的应用程序在前台(启动会话跟踪),否则就不见了(停止会话跟踪).您可以trueTimer类中创建一个MyAppContext定期检查值,因此它将是:

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 () { ... };

}
Run Code Online (Sandbox Code Playgroud)

您应该isAppRunning根据要在会话跟踪中获得的精度进行修改.


Jam*_*Ltd 1

您需要研究 Android 上的 Activity 生命周期。

您需要的是- 请参阅此处的onPause文档

我还要提到,即使在多个活动之间切换时也会触发 onPause,因此您需要跟踪它何时暂停以转到另一个屏幕。