在我的应用程序中,活动 A 是启动器活动,从 A 调用 B,从 B 调用 C,我有超过 5 个活动。在 C 中,当我按下主页按钮并再次打开我的应用程序时,它会打开 C,这在我的情况下很好。但是在C中按下主页按钮后,当它空闲一段时间并且应用程序被杀死后,当我打开我的应用程序时它会打开C。但我想在那个时候打开主启动器活动。我怎样才能做到这一点?
A > B > C > HOME 按钮 > 空闲一段时间 > 应用程序被终止 > 打开应用程序 > C.
在这种情况下,我想打开主要活动 A 而不是 C。
在我的应用程序中,活动 A 是启动器活动,从 A 调用 B,从 B 调用 C,我有超过 5 个活动。在 C 中,当我按下主页按钮并再次打开我的应用程序时,它会打开 C,这在我的情况下很好。但是在C中按下主页按钮后,当它空闲一段时间并且应用程序被杀死后,当我打开我的应用程序时它会打开C。但我想在那个时候打开主启动器活动。我怎样才能做到这一点?
A > B > C > HOME 按钮 > 空闲一段时间 > 应用程序被终止 > 打开应用程序 > C.
在这种情况下,我想打开主要活动 A 而不是 C。
您将需要检测 Android 已经杀死了您的进程,然后用户返回到应用程序(导致 Android 创建一个新进程)。我已经在许多答案中描述了如何做到这一点:
https://stackoverflow.com/a/29802601/769265
您可以android:clearTaskOnLaunch="true"为活动 A 放入清单,以使启动器始终进入该活动。
您是否尝试过在 onBackPressed 中启动一个线程并休眠一段特定时间,之后它会调用finish(),或者停止线程(从调用finish),并重新获得相同的活动。
我知道这是一篇旧帖子,正如大卫瓦瑟的上述回答是过去最好的解决方案......现在有一种更好的做事方式。
使用 来完成所有这些工作的更好方法ProcessLifecycleOwner,它就是为此而设计的。简而言之,来自 JavaDoc:
“为整个应用程序过程提供生命周期的类。”
如果您的应用程序被终止,应用程序生命周期 onDestroy 将被调用,这使您可以创造性地按照自己的意愿进行跟踪。它可以像设置一个 SharedPreference 标志一样简单,您可以在应用程序重新启动不正确时检查该标志。
请注意,您需要添加适当
android.arch的依赖项以利用新LifecycleObserver的 ,ProcessLifecycleOwner等。
下面是如何处理整个应用程序的每个 LifecycleEvent 的示例。
public class MyApplication extends Application implements LifecycleObserver {
@Override public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate(){
// ... Awesome stuff
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart(){
// ... Awesome stuff
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume(){
// ... Awesome stuff
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause(){
// ... Awesome stuff
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop(){
// ... Awesome stuff
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestory(){
// ... Awesome stuff
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onAny(){
// ... Awesome stuff
}
}
这是一篇不错的文章,我通过 Kotlin 示例了解了这一点,并在这篇文章之外提供了一些技巧:Background and Foreground events with Android Architecture Components
应用程序被杀死和活动被杀死是两件不同的事情。要测试您的活动是否被终止(不终止应用程序),请激活开发者模式并在离开时设置终止活动。
按下主页会将您从应用程序切换到主屏幕,同时让您的应用程序在后台运行。
除了当您的手机内存等资源不足时,它会开始关闭在后台运行的应用程序,以便您的手机有足够的资源来完成您现在尝试执行的操作。游戏通常是手机为了节省资源而“杀死”的第一批应用程序之一,因为它们通常比其他应用程序使用更多的内存和 CPU。这就是为什么有时您的游戏仍然处于暂停状态,而有时 Android 会为您关闭它。
if your app is killed by the system i dont think it will start from c. If you are killing it through an task killer app then its a mistake. Force stop it from the app settings and then check.However if killed by task killer app and then from C if you get back to B and it is crashing then check for result code. if resultcode != RESULT_OK then you can handle your code here and save app from crash. if you have not started you activity for result then finish B and A before launching B and c.
在按下主页时,你还没有完成活动它仍然存在于堆栈中。只有它会暂停所以使用它。
如果您从活动 A 中调用活动 B,从 B 中调用 C
A->B
使用来自 A 的 startactivityforresult
又是 B->C
使用 B 的 startactivityforresult
并且当您想从 C 退出然后 setResult(即 RESULT_OK) 并完成 C.and 在 B 中的 OnActivityResult() 中,检查 resultcode == RESULT_OK 然后再次完成 B 和 setresult(RESULT_OK) 为 A.same 过程将遵循完成一个。
这将使您退出应用程序。应用程序将从 A 而不是从 C 开始。