如何知道在Activity启动之前是否调用了Application类?

时间:2017-09-14 06:43:46

标签: android android-activity android-lifecycle

我们有 def error(exception): return {some json error data with the message 'exception'} 这是我们应用程序的开始活动。我们还有Splash extends Activity类,在调用应用程序进程时调用它。

现在我们有以下要求。 每当启动应用/流程时,请致电CustomApplication extends Application功能。

为此,我们将此函数调用放在Utils.doSomeDBWork()onCreate()类的Splash中。我们将此调用置于CustomApplication内的原因是我们的应用程序可以通过CustomApplication启动,deeplinks/notifications不会被调用。 但问题是如果应用程序被杀死并通过Splash启动,那么同一个函数将被调用两次。一个来自Splash,另一个来自CustomApplication

基本上我的问题是,如果已经从Splash调用了该函数,则不要从CustomApplication调用此函数。我可以通过使用一些静态变量或共享首选项来考虑这样做。但不要以为这是一种干净的方式。有没有其他方法可以实现这一点,比如通过Splash等传递一些信息?

4 个答案:

答案 0 :(得分:1)

  

如何知道在Application启动之前调用了Activity类?

简而言之,每当 Android “获取请求”启动任何应用组件时(活动服务 > BroadcastReceiver )并且您的应用尚未运行,它会分叉app_process(又名zygote),将其名称更改为 AndroidManifest.xml中定义的your.package.name ,初始化 Application 实例,调用其onCreate()方法,然后实例化所请求的组件并调用其生命周期方法( Activity 的{{1 },服务onCreate() BroadcastReceiver onCreate())。

  

为此,我们将此函数调用放在了onReceive()的splash和onCreate()类中。

这是多余的。仅从 Application CustomApplication调用它就足够了,onCreate()是应用程序的最早“入口点”,保证在任何其他组件的生命周期方法之前被调用。可能只有Application类的单个实例,直到应用程序进程终止。

您可以通过记录每个生命周期方法轻松测试它。在那之后你不会有任何疑虑。

编辑 w.r.t OP的评论:

  

如果应用程序进程正在运行且用户返回并退出,然后再次启动应用程序,则不会调用CustomApplication类。

这只是部分正确。 CustomApplication onCreate()将不会被调用,除非系统在后台处理应用程序进程时停止( simulate,例如,通过刷你的来自最近的应用)。

  

但是我们的要求是在这种情况下应该调用CustomApplication类。

这超出了开发人员的范围。只有系统控制

话虽如此,如果 Android 在后台杀死应用,将会调用 CustomApplication onCreate()。如果没有,则实现此要求的一种简单方法是在 CustomApplication 中添加boolean标志,以指示是否调用了Utils.doSomeDBWork()

答案 1 :(得分:0)

我认为共享偏好是这种情况的坏方法,但你可以使用静态变量或使用单例设计模式来实现这一点。

事件总线也是一个不错的选择...你可以看到事件总线的文档。

https://github.com/greenrobot/EventBus

答案 2 :(得分:0)

你为什么不从applcation的课堂onCreate打电话? 当从深层链接/通知或Splash启动App时,将始终首先创建Applcation。

您也可以从静态变量中检查。 如下。

class Utils{
    public static boolean doneWork = false; // this static variable will be false when app process is killed.

    public doSomeDBWork(){
          if(!doneWork){
              //alreay done..
              return;
          }
          :
          :
          doneWork = true; 
    }

}

答案 3 :(得分:0)

您可以在应用层上使用ActivityLifeCycleCallbacks进行一些控制。如果在splashActivity中使用它是一个解决方案,跟踪您的活动并在回调中拨打电话。我希望它能给出一个想法。