了解Android ActivityLifeCyleCallbacks

时间:2017-07-19 07:11:51

标签: android cordova android-lifecycle

此课程的Android documentation有些令人困惑。据我所知,到目前为止,我已经得出结论

  • 当活动开始/停止可供用户进行互动时,会发生OnResume/OnPause对事件。
  • 当活动开始/停止可见时,会发生OnStart/OnStop个事件对。 Visible != Foreground因为后者意味着互动性。

如果这种理解是正确的,那么我觉得事件名称非常缺乏。 OnStart/OnStop被称为OnVisible/OnInVisible会更好。 OnResume/OnPause被称为OnInteractive/OnPassive会更好。

这如何与Cordova应用程序中可用的Window.OnPause / OnResume方法相关联?我的假设是他们映射到相应的Android活动生命周期事件。

基于这种理解,我假设

  • 广播接收器
  • 地理位置前景/后台模式切换最好从活动生命周期OnStart / OnStop事件而不是OnResume / OnPause事件
  • 完成
  • 内存中保存的数据应存放在OnPause上的文件/写入数据库等,以减少应用程序的内存占用,因为如果应用程序不是交互式的,那么这些数据不太可能被使用。

我使用这种理解来创建以下类作为我的自定义Cordova插件的一部分

import android.app.Activity;
import android.app.Application.ActivityLifecycleCallbacks;
import android.os.Bundle;

public class StateMonitor implements ActivityLifecycleCallbacks 
{
 public static int isVisible = 0;
 public static int isInFG = 0;

 public static boolean isAppInForeground()
 {Feedback.postBackInfo("In FG:" + isInFG);return isInFG > 0;}

 public static boolean isAppVisible(){return isVisible > 0;}

 public void onActivityCreated(Activity activity,Bundle bundle){}

 public void onActivityDestroyed(Activity activity){}

 public void onActivityResumed(Activity activity)
 {
  isInFG++;
  Feedback.postBackInfo("Resumed:" + isInFG);
 }

 public void onActivityPaused(Activity activity)
 {
  isInFG--;
  Feedback.postBackInfo("Paused");
 }

 public void onActivitySaveInstanceState(Activity activity,Bundle outState)
 {}

 public void onActivityStarted(Activity activity)
 {Feedback.postBackInfo("started");isVisible++;}

 public void onActivityStopped(Activity activity){isVisible--;}
}

我通过发布

开始监控活动生命周期事件
cordova.getActivity().getApplication().
registerActivityLifecycleCallbacks(new StateMonitor());

其中Feedback是我在插件内部使用的帮助程序类,用于将消息回发到我的服务器以便在我的Web浏览器中实时记录和显示。

来自

public void initialize(CordovaInterface cordova, CordovaWebView webView) 

插件的方法。这立即引发了一个问题:

  • 首次启动应用程序时,这些事件不会开始触发
  • 我的猜测她是registerActivityLifecycleCallbacks打电话的时间太短了#34;监控最初的OnStart / OnResume事件,从那时起进行调用 - 来自Plugin.initialize - 这些事件已经发生"已经发生"。

对于之前来过这里的任何人,我都非常感激,他们可以发表评论并提供解决方案。

1 个答案:

答案 0 :(得分:0)

我发现可以使其工作的唯一方法是在Cordova app中的MainActivity中添加此类。它会在你的插件之外。 没有其他工作。