我有一个应用程序,入口点是让我们说“登录/扑通” Activity
,在这里我需要从服务器预加载新的数据。 这SplashActivity
声明为:
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
我在AndroidManifest.xml
,加载数据后,我一直在我的自定义的一些数据Application
类,我继续我的MainActivity
。
我期待,我后Application
由操作系统或用户停止(使用强制停止),再后来是由用户重新开始,我的应用程序的入口点是SplashActivity
再次但是系统跳过SplashActivity
并显示MainActivity
。
问:这是预期的行为? 如果整个过程停止,应该不是我的应用程序与启动SplashActivity
? 这能实现呢?
其实,有由这个问题,一些答案给它解决了几个问题:
要回答你原来的问题,“是的,这是预期的行为”。
的Android考虑每个活动是一个单独的自包含的实体。 安卓记得在任务堆栈中的活动状态,它有没有问题,杀死你的过程(包含所有的活动),只要它想,因为它“知道”它总是可以重建你的活动时,它需要。 这个概念,当然,坏了,当你有一个复杂的应用,你有活动之间的依赖关系和/或你有你在一个存储全局数据Application
类(或类似的静态/单位)。
当Android的杀死你的过程中它会记住任务最上面的活动,当用户返回到任务它重新创建过程,然后在任务再现只有最上面的活动。 在你的情况, MainActivity
。
举个例子,如果你的任务堆栈看起来是这样的:
StartActivity -> ActivityB -> ActivityC -> ActivityD
你的任务转到后台和Android杀死过程中,当用户返回到任务只ActivityD
将被重新创建。 一旦ActivityD
完成后,Android将重新创建ActivityC
。 一旦ActivityC
完成后,Android将重新ActivityB
,等等,总之,完整的堆栈不会重新创建当用户恢复任务。
没有舱单设置或意图的标志,将让你你想要的行为组合。 这将是很好,如果Android的提供类似的东西,但目前没有。
您可以确定,如果你的过程已经在应用程序中的派生类使用静态(类)布尔变量重启(或任何其他类)。 这个变量将始终具有价值false
重启进程时,然后你可以从任何地方和重新初始化(重新加载你的数据),如果有必要检查变量的状态。 然后,你的变量设置为true
。 它仍将是true
,直到进程被终止并重新创建,即使所有的活动结束。 这样在需要的时候,你只能初始化。
您也可以使用此为指标,重新从您的应用程序SplashScreen
。 因此,在所有的活动中onCreate()
您可以检查这个布尔变量的状态,如果该应用程序已重新启动,你可以简单地重定向到SplashScreen
是这样的:
Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
这将完成任务中的所有活动,并重新启动SplashScreen
在任务的根源。
接下来,如果你想防止不必每次下载数据的用户返回到应用程序(当它是在后台,后经AndroidOS杀害),你应该存储你的私人缓存区,可使用下载数据当应用程序重新启动。 这防止有,如果你的进程被终止并重新启动反复下载数据。
处理这个问题的另一种方法是先装载在一个服务数据。 如果你有一个Service
于你的过程中运行,那么Android是不太可能杀死你的进程。 你只需要确保您关闭Service
,当用户与应用程序完成。
我知道这个答案是啰嗦。 希望你能得到的东西出来。
这是可以做到这样的:
1. SplashActivity
每次都会启动无疑。
2.下载数据并保存表示装填完成previously.You可以使用支票(布尔) SharedPreferences 。
3.检查条件下一次,开始你的MainActivity
立即。