我们有
Splash extends Activity
,这是我们应用程序的启动活动。我们还有 CustomApplication extends Application
类,在调用应用程序进程时会调用该类。
现在我们有以下需求。 每当应用程序/进程启动时,调用
Utils.doSomeDBWork()
函数。
为此,我们将此函数调用放在
onCreate()
和 Splash
类的 CustomApplication
中。我们将此调用放在 CustomApplication
中的原因是,我们的应用程序可以通过 deeplinks/notifications
启动,其中 Splash
不会被调用。 但问题是,如果应用程序被杀死并通过Splash
启动,那么同一个函数将被调用两次。一个来自 CustomApplication
,另一个通过 Splash
。
所以基本上我的问题是,如果该函数已经从
CustomApplication
调用,那么不要从 Splash
调用此函数。我可以考虑通过使用一些静态变量或共享首选项来做到这一点。但不要认为这是一种干净的方式。有没有其他方法可以实现此目的,例如通过 Intents
等传递一些信息?
如何知道
类在Application
启动之前被调用?Activity
简而言之,每当 Android“收到请求”启动任何应用程序组件(Activity、Service、BroadcastReceiver)并且您的应用程序尚未运行时,它都会分叉
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()
。
为什么不只从应用程序的类 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;
}
}
您可以在应用层使用ActivityLifeCycleCallbacks进行一些控制。如果在splashActivity中使用它是您的解决方案,请跟踪您的活动并在回调中进行调用。我希望它能提供一个想法。