我们有
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
等传递一些信息?
答案 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)
我认为共享偏好是这种情况的坏方法,但你可以使用静态变量或使用单例设计模式来实现这一点。
事件总线也是一个不错的选择...你可以看到事件总线的文档。
答案 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中使用它是一个解决方案,跟踪您的活动并在回调中拨打电话。我希望它能给出一个想法。