Łuk*_*mek 5 crash session android activity-lifecycle back-stack
我想知道现代Android开发世界中有关Back Stack管理的常见做法或模式,特别是处理应用程序被杀或崩溃的情况,以及系统尝试重新创建其活动,因为应用程序创建的任务仍然存在.
以下是在示例应用上演示上述行为的视频:https://www.dropbox.com/s/pkm88dvdpzsw9lm/IMG_2334-480.mov?dl = 0
这里是源代码 - 基本上只是一个使用Android Studio向导创建的简单应用程序:ssh://git@github.com:lukaszs-appdate/crashingtask.git
假设该应用程序在开始时显示登录活动.然后当用户登录时从服务器下载数据并允许用户操作数据,启动其他活动,操纵应用程序的状态等.重要的假设是当用户例如切换到不同的应用程序并返回到我们的应用程序时,他们看到最后一个活动,而不是回到登录.因此,我认为文档https://developer.android.com/guide/components/activities/tasks-and-back-stack.html中的标记组合不足以解决问题.
问题是,当:a)应用程序崩溃并重新启动,或b)使用Android中的任务切换按钮将应用程序移至后台,然后在Android Studio中手动终止并通过点击任务图标然后返回Android尝试从任务中重新创建活动.我想让它在这些事件的情况下从头开始启动应用程序并显示登录屏幕.
我看到的唯一解决方案是除了登录之外的所有活动的一些丑陋的父类,我们将检查是否设置了一些伪会话变量,如果不是,则假设应用程序已重新启动并替换整个任务堆栈登录活动,或者做一些finish()调用或其他类似臭的东西.
还有其他想法吗?当有问题的应用程序被杀死时,Android是否只能删除应用程序创建的任务?
一个干净的解决方案是使用某种会话管理,允许任何活动有效地恢复应用程序的业务状态,使用户能够从任何活动中正确地恢复应用程序,即使它已被杀死.但这是另一个讨论.
我用 Kotlin 编写了这段代码,帮助我识别返回的活动。我意识到返回的活动不会调用onCreate(Bundle)(据我所知)。所以如果你有一个BaseActivity,你可以这样做。
class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
startedWithLauncher = startedWithLauncher || intent.action == Intent.ACTION_MAIN
super.onCreate(savedInstanceState)
}
override fun onResume() {
super.onResume()
if (!didStartWithLauncher()) {
// Do something
}
}
fun didStartWithLauncher(): Boolean {
return startedWithLauncher;
}
companion object {
/**
* Situation:
* You have a Stack with Activity (A - Main Launcher, B, C). C crashes, when you click in "Open app again",
* I don't know why but it opens the Activity B, recreating the stack, but this might not be
* what you want.
* We're setting this variable to ask if it started from the launcher.
* We need to write this variable before super.onCreate(savedInstanceState).
*/
private var startedWithLauncher = false
}
}
Run Code Online (Sandbox Code Playgroud)
注意力!
Service如果您从(例如推送通知)启动一个活动。您必须进行设置startedWithLauncher = true,否则看起来应用程序没有通过启动器活动启动!
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |