应用程序在android中按下home按钮后被终止时未打开主活动

应用程序在android中按下home按钮后被终止时未打开主活动,android,Android,在我的应用程序中,活动A是启动器活动,从A它称为B,从B它称为C,我有5个以上的活动。在C中,当我按下home按钮,然后再次打开我的应用程序时,它会打开C,这在我的情况下很好。但在按下C中的home(主页)按钮后,当它空闲一段时间并且应用程序被终止,之后当我打开我的应用程序时,它会打开C。但我想在那个时候打开主启动器活动。我该怎么做 A>B>C>主页按钮>空闲一段时间>应用程序终止>打开应用程序>C. 在这种情况下,我想打开主活动A而不是C。 按下Home(主页)可将您从应用程序切换到主页屏幕,

在我的应用程序中,活动A是启动器活动,从A它称为B,从B它称为C,我有5个以上的活动。在C中,当我按下home按钮,然后再次打开我的应用程序时,它会打开C,这在我的情况下很好。但在按下C中的home(主页)按钮后,当它空闲一段时间并且应用程序被终止,之后当我打开我的应用程序时,它会打开C。但我想在那个时候打开主启动器活动。我该怎么做

A>B>C>主页按钮>空闲一段时间>应用程序终止>打开应用程序>C.

在这种情况下,我想打开主活动A而不是C。

按下Home(主页)可将您从应用程序切换到主页屏幕,同时 让应用程序在后台运行

除了当你的手机内存等资源不足时 将开始关闭在后台运行的应用程序,以便 你的手机有足够的资源来完成你现在要做的事情。 游戏通常是手机为了保存而“杀死”的首批应用之一 资源,因为它们通常比其他应用程序使用更多的内存和CPU。 这就是为什么有时候你的游戏还在暂停,有时候 Android已经为你关闭了它


按home键时,u尚未完成活动,它仍然存在于堆栈中。只有它会暂停,所以使用此选项

如果您从活动A调用活动B,从B调用活动C

A->B

使用来自

再一次B->C

使用来自B的startactivityforresult

当您要退出C时,然后设置结果(即结果_确定)并完成C。在B中的OnActivityResult()中,检查resultcode==RESULT_确定,然后再次完成B并设置结果(结果_确定)以完成A。同样的过程将遵循完成A


这将使您退出应用程序。应用程序将从A启动,而不是从C启动。

您可以将活动A的清单中的android:clearTaskOnLaunch=“true”放入活动A,以使启动器始终转到该活动。

如果您的应用程序被系统杀死,我认为它不会从C启动。如果你是通过任务杀手应用程序杀死它,那么这是一个错误。从应用程序设置中强制停止它,然后检查。但是,如果被任务杀手应用程序杀死,然后从C中停止,如果你回到B并且它正在崩溃,则检查结果代码。如果结果代码!=结果_确定,然后您可以在此处处理代码并将应用程序从崩溃中保存。如果您尚未启动结果活动,请在启动B和c之前完成B和A。

您需要检测Android是否已终止您的进程,然后用户返回应用程序(导致Android创建新进程)。我已经在许多答案中描述了如何做到这一点:


您是否尝试过在onBackPressed中启动一个线程,并在特定时间内休眠,然后调用finish(),或者停止该线程(从调用finish开始),然后重新获得相同的活动。

我知道这是一篇老文章,如上所述,是过去最好的解决方案。。。现在有了更好的做事方式

使用专门为此设计的
ProcessLifecycleOwner
是实现所有这些的更好方法。简而言之,JavaDoc:

“为整个应用程序进程提供生命周期的类。”

如果您的应用程序被终止,将调用应用程序生命周期onDestroy,这允许您按照自己的意愿创造性地跟踪它。它可以像设置SharedReference标志一样简单,您可以在应用程序错误重新启动时检查该标志

请注意,您需要添加适当的
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的例子和其他一些技巧:

应用程序被杀死和活动被杀死是两件不同的事情。要测试您的活动是否被终止(不终止应用程序),请激活devOper模式并在离开时设置终止活动。

我知道,但我只想在应用程序终止时打开,不想在按下home按钮后始终打开。您如何假设应用程序被终止?它不会仅仅因为你的应用程序闲置了一段时间而发生。如果它是从C开始的,则表示它从未被杀死。只有当设备处于加载状态且内存不足时,应用程序才会被设备自动终止。在ddms logcat中,它显示进程已终止。@Mihirsah您找到解决方案了吗?@VickyKapadia Android可以并且将随时终止后台进程。尤其是在低端设备和电池电量不足的设备上,Android会主动关闭后台进程,即使它不需要内存。你需要检测到Android已经关闭了你的进程。要做到这一点,请看我的答案:这是错误的。如果Android杀死后台进程,它会记住任务堆栈的状态以及打开了哪些活动。当用户返回到该任务时,Android会创建一个新的操作系统进程,并恢复堆栈中顶部
活动的状态。在OP的例子中,它将创建一个新的
C
实例,因为当用户将任务放在后台时,这是堆栈中最上面的
活动。这实际上并没有回答所问的问题。这应该是一个评论,而不是一个答案。这实际上并没有解决OP的问题。如果Android终止了他的进程,当用户返回应用程序时,它仍然会启动一个新进程并显示
C
,这不是OP想要的。David,在第一个答案中,您建议在第一个活动的
onCreate()
中初始化一个布尔值。好啊Android杀死了进程。用户再次启动应用程序。所有活动