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

问题描述 投票:0回答:3

我们有

Splash extends Activity
,这是我们应用程序的启动活动。我们还有
CustomApplication extends Application
类,在调用应用程序进程时会调用该类。

现在我们有以下需求。 每当应用程序/进程启动时,调用

Utils.doSomeDBWork()
函数。

为此,我们将此函数调用放在

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

所以基本上我的问题是,如果该函数已经从

CustomApplication
调用,那么不要从
Splash
调用此函数。我可以考虑通过使用一些静态变量或共享首选项来做到这一点。但不要认为这是一种干净的方式。有没有其他方法可以实现此目的,例如通过
Intents
等传递一些信息?

android android-activity process android-lifecycle
3个回答
3
投票

如何知道

Application
类在
Activity
启动之前被调用?

简而言之,每当 Android“收到请求”启动任何应用程序组件(ActivityServiceBroadcastReceiver)并且您的应用程序尚未运行时,它都会分叉

app_process
(又名
zygote
),将其名称更改为
AndroidManifest.xml
中定义的 your.package.name,初始化 Application 实例,调用其
onCreate()
方法,然后实例化请求的组件并调用其生命周期方法(Activity)的
onCreate()
Service
onCreate()
BroadcastReceiver
onReceive()
)。

为此,我们将此函数调用放入splash 的

onCreate()
CustomApplication
类中。

这是多余的。仅从 Application

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

您可以通过记录每个生命周期方法来轻松测试它。之后你就不会再有任何疑问了。

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

如果应用程序进程正在运行并且用户按下并退出,然后再次启动应用程序,则不会调用

CustomApplication
类。

这只是部分正确。 CustomApplication

onCreate()
不会被调用,除非系统在后台杀死应用程序进程(模拟这种情况,例如,从最近的应用程序中滑动您的应用程序)。

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

CustomApplication
类。

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

话虽这么说,如果 Android 在后台杀死应用程序,则会调用

CustomApplication
onCreate()。如果没有,实现该要求的一个简单方法是在
CustomApplication
中有一个 boolean 标志,该标志将指示是否调用了
Utils.doSomeDBWork()


0
投票

为什么不只从应用程序的类 onCreate 调用? 当从深层链接/通知或 Splash 启动应用程序时,始终会首先创建应用程序。

您也可以从静态变量中进行检查。 像下面这样。

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; 
    }

}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.