重新启动应用程序 - 活动入口点(Application restart - Activity En

2019-06-25 21:10发布

我有一个应用程序,入口点是让我们说“登录/扑通” 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 ? 这能实现呢?

Answer 1:

其实,有由这个问题,一些答案给它解决了几个问题:


要回答你原来的问题,“是的,这是预期的行为”。

的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 ,当用户与应用程序完成。


我知道这个答案是啰嗦。 希望你能得到的东西出来。



Answer 2:

这是可以做到这样的:

1. SplashActivity每次都会启动无疑。

2.下载数据并保存表示装填完成previously.You可以使用支票(布尔) SharedPreferences 。

3.检查条件下一次,开始你的MainActivity立即。



文章来源: Application restart - Activity Entry Point