Ovi*_*tcu 13 android android-intent
我有一个应用程序,其中的入口点是"登录/启动" Activity,我需要从服务器预加载新数据.这SplashActivity被声明为:
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
Run Code Online (Sandbox Code Playgroud)
在我的AndroidManifest.xml,加载数据后,我在我的自定义Application类上保留一些数据,然后继续我的 MainActivity.
我期待,在我Application被操作系统或用户(使用强制停止)停止后,然后由用户重新启动后,我的应用程序的入口点将SplashActivity再次出现但是系统会跳过SplashActivity并显示MainActivity.
问题:这是预期的行为吗?如果整个过程停止,我的应用程序不应该启动SplashActivity吗?这可以实现吗?
Dav*_*ser 27
实际上,这个问题及其中的一些答案可以解决几个问题:
要回答您的原始问题,"是的,这是预期的行为".
Android认为每个Activity都是一个独立的自包含实体.Android会记住任务堆栈中的活动状态,它可以随时杀死您的进程(包含您的所有活动),因为它"知道"它可以随时重建您的活动.当然,当您拥有一个复杂的应用程序时,这个概念会被破坏,在这个应用程序中,您在活动之间存在依赖关系,并且/或者您拥有存储在Application类(或类似的静态/单一位置)中的全局数据.
当Android终止你的进程时,它会记住任务中最顶层的活动,当用户返回任务时,它会重新创建进程,然后只重新创建任务中最顶层的活动.在你的情况下,MainActivity.
例如,如果您的任务堆栈如下所示:
StartActivity -> ActivityB -> ActivityC -> ActivityD
Run Code Online (Sandbox Code Playgroud)
并且你的任务进入后台并且Android杀死进程,当用户返回任务时,只会ActivityD重新创建.一旦ActivityD完成后,Android将重新创建ActivityC.一旦ActivityC完成,Android将重新创建ActivityB,等等.简而言之,当用户恢复任务时,不会重新创建完整的堆栈.
没有清单设置或Intent标志的组合可以获得您想要的行为.如果Android提供类似的东西会很好,但目前它没有.
您可以通过在Application派生类(或任何其他类)中使用静态(类)布尔变量来确定您的进程是否已重新启动.false重新启动进程时,此变量将始终具有该值,然后您可以从任何位置检查变量的状态,并在必要时重新初始化(重新加载数据).然后将变量设置为true.它将一直保留true到该进程被终止并重新创建,即使您的所有活动都已完成.这样,您只能在需要时进行初始化.
您还可以使用它作为指示器从中重新启动您的应用程序SplashScreen.因此,在您的所有活动中onCreate(),您可以检查此布尔变量的状态,如果应用程序已重新启动,您只需重定向到SplashScreen以下内容:
Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这将完成任务中的所有活动,并重新启动任务SplashScreen的根目录.
接下来,如果您想要防止每次用户返回应用程序时都要下载数据(当它在后台并随后被AndroidOS杀死时),您应该将您下载的数据存储在私有缓存区域中并使用该数据重新启动应用程序时.这可以防止在您的进程被终止并重新启动时不得不重复下载数据.
处理此问题的另一种方法是在服务中加载数据.如果您Service的流程正在运行,则Android不太可能会终止您的流程.您只需要确保Service在用户完成应用程序时关闭您的应用程序.
我意识到这个答案是啰嗦的.希望你能从中得到一些东西.
| 归档时间: |
|
| 查看次数: |
4431 次 |
| 最近记录: |