Android应用开始和结束事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用开始和结束事件相关的知识,希望对你有一定的参考价值。

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

我尝试了什么

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

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

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

额外:

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

答案

我可以想到两种方法:

选项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();

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

<uses-permission android:name="android.permission.GET_TASKS"/>

链接到答案:Android: How can I get the current foreground activity (from a service)?

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

getRunningTasks()

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


选项2:

第二个选项是创建一个使用标志扩展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上你必须添加这个类,以便在你的应用程序启动时使用它。只需在应用程序标记下添加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();
    }
}

这样每次你开始一个活动时,isAppRunningMyAppContext的值将是true,当你退出Activity时它将是false但是如果另一个Activity打开(例如,如果你按下后退按钮,那么你将返回上一个活动)价值将立即再次true

当你最终完成所有的活动时,将不会调用任何onResume()方法,并且所有onPause()方法都将被调用,因此isAppRunning将是false,你知道你的Activity不再是前景。

所以恢复,如果isAppRunningtrue你的应用程序在前台(开始会话跟踪)否则它已经消失(停止会话跟踪)。您可以在Timer类中创建MyAppContext以定期检查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 () { ... };

}

您应该根据要在会话跟踪中获得的精度修改timerRate

另一答案

从BaseActivity扩展您的所有活动,如下所示。这是您的最佳选择,因为只要您的活动显示或离开电话屏幕,就可以保证调用onPause和onResume方法。

class BaseActivity extends Activity {


    @Override
    protected void onResume() {
        super.onResume();
        // Start Logging
    }

    @Override
    protected void onPause() {
        super.onPause();
        // End Logging
    }
}
另一答案

您需要在Android上查看活动生命周期。

你需要的是onPause - 请参阅文档here

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

另一答案

1.创建一个名为AppLifecycleTracker的类并粘贴它。

private class AppLifecycleTracker implements ActivityLifecycleCallbacks {
            private int numStarted = 0;
            private String TAG = "AppLifecycleTracker";


            private int numOfCreated = 0;

            @Override`enter code here`
            public void onActivityCreated(Activity activity, Bundle bundle) {
                if (numOfCreated == 0) {
                    Log.d(TAG, "onActivityCreated: app started");
                }
                numOfCreated++;
                Log.d(TAG, "onActivityCreated: " + numOfCreated);
            }

            @Override
            public void onActivityStarted(Activity activity) {
                if (numStarted == 0) {
                    // app went to foreground
                    Log.d(TAG, "onActivityStarted: foreground");

                }
                numStarted++;


            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                numStarted--;
                if (numStarted == 0) {
                    // app went to background
                    Log.d(TAG, "onActivityStarted: background");

                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                numOfCreated--;
                Log.d(TAG, "onActivityDestroyed: " + numOfCreated);
            }
        }

*在onActivityCreate中,如果numOfCreated = 0,那么你可以说app已经开始了。 *在onActivityDestroyed中,如果numOfCreated = 0,则可以说app已关闭。

  1. 创建一个扩展Application的类,在onCreate中添加此行 registerActivityLifecycleCallbacks(new AppLifecycleTracker());
  2. 将应用程序名称设置为manifest.xml中的Application类

而已。你已准备好出发。

以上是关于Android应用开始和结束事件的主要内容,如果未能解决你的问题,请参考以下文章

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

Android:将片段和弹出窗口的点击事件中生成的变量传递给活动的方法

什么控制事件开始和结束突出显示UIButton的状态

Android - 如何录制简单的声音片段?

在android中获取离子应用程序的开始和结束时间

Html 视频结束事件不适用于元素中的开始和结束时间声明