【问题标题】:Application not open main activity when it was killed after pressing home button in android在android中按下主页按钮后应用程序未打开主要活动
【发布时间】:2012-09-11 05:40:59
【问题描述】:

在我的应用程序中,活动 A 是启动器活动,从 A 调用 B,从 B 调用 C,我有超过 5 个活动。在 C 中,当我按下主页按钮并再次打开我的应用程序时,它会打开 C,这在我的情况下很好。但是在C中按下主页按钮后,当它空闲一段时间并且应用程序被杀死后,当我打开我的应用程序时它会打开C。但我想在那个时候打开主启动器活动。我该怎么做?

A > B > C > HOME 键 > 闲置一段时间 > 应用被杀 > 打开应用 > C.

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

【问题讨论】:

  • 你如何假设应用程序被杀死?它不会仅仅因为您的应用程序空闲了一段时间而发生。如果它是从 C 开始的,则意味着它从未被杀死。仅当设备处于负载和内存不足时,设备才会自动终止应用程序
  • 在 ddms logcat 中,显示进程 已死亡。
  • @MihirShah 你找到解决办法了吗?
  • @VickyKapadia Android 可以并且会随时终止后台进程。尤其是在低端设备和电池电量不足的设备上,即使不需要内存,Android 也会积极杀死后台进程。
  • 您需要检测 Android 已经杀死了您的进程。为此,请在此处查看我的答案:stackoverflow.com/a/29802601/769265

标签: android


【解决方案1】:

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

https://stackoverflow.com/a/29802601/769265

https://stackoverflow.com/a/27276077/769265

https://stackoverflow.com/a/11249090/769265

【讨论】:

  • 大卫,在第一个答案中,您建议在第一个活动的onCreate() 中初始化一个布尔值。好的。 Android杀死进程。用户再次启动应用程序。之前在 backstack 中的所有活动都将被创建并再次放入 backstack,这意味着 FirstActivityonCreate() 也将被调用,这将导致布尔值变为 true。因此,每当您检查该布尔值时,它将始终为true。我错过了什么吗?
  • 不,在用户再次启动应用程序后,只有上次打开的 Activity 被放入堆栈(在 OP 的情况下为 Activity C)并调用其onCreate()。然后用户导航回 B -> 调用 B 的 onCreate(),依此类推。我在我的应用程序中使用了大卫的解决方案,它有效!绝妙的解决方案,谢谢!
  • @azizbekian 正如@Damnum 所说,当Android 创建一个新的操作系统进程时,它只会从堆栈中创建最顶层的Activity。在用户返回之前不会重新创建其他活动。
【解决方案2】:

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

【讨论】:

  • 我知道,但我只想在应用程序被杀死时打开A,而不是在按下主页按钮后总是打开A。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我知道这是一篇旧帖子,因为上面的 David Wasser's answer 是过去最好的解决方案......现在有更好的做事方式。

    使用ProcessLifecycleOwner 来完成所有这些工作的更好方法,它就是为此而设计的。简而言之,来自 JavaDoc:

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

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

    请注意,您需要添加适当的android.arch 依赖项才能利用新的LifecycleObserverProcessLifecycleOwner 等。

    以下是如何处理整个应用程序的每个 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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        按下主屏幕会将您从应用程序切换到主屏幕,同时 让您的应用在后台运行。

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

        【讨论】:

        • 这实际上并没有回答所提出的问题。这应该是评论,而不是答案。
        【解决方案7】:

        在按下 home 时,你还没有完成活动它仍然存在于堆栈中。只是它会暂停所以使用这个。

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

        A->B

        使用 A 的 startactivityforresult

        又是 B->C

        使用 B 的 startactivityforresult

        当你想从 C 中退出时 setResult(ie RESULT_OK) 并完成 C.and 在 B 中的 OnActivityResult() 中,检查 resultcode == RESULT_OK 然后再次完成 B 和 setresult(RESULT_OK) 为 A.same 过程将跟随完成A。

        这将使您退出应用程序。应用程序将从 A 而不是从 C 开始。

        【讨论】:

        • 这实际上并没有解决 OP 的问题。如果Android杀死了他的进程,当用户返回应用程序时,它仍然会启动一个新进程并显示C,这不是OP想要的。
        【解决方案8】:

        如果您的应用程序被系统杀死,我认为它不会从 c 开始。如果您通过任务杀手应用程序杀死它,那么这是一个错误。强制从应用程序设置中停止它,然后检查。但是,如果被任务杀手应用程序杀死,然后从 C 杀死,如果你回到 B 并且它正在崩溃,然后检查结果代码。如果 resultcode != RESULT_OK 那么您可以在此处处理您的代码并避免应用程序崩溃。如果您还没有开始活动以获得结果,那么在启动 B 和 c 之前完成 B 和 A。

        【讨论】:

        • 这是错误的。如果 Android 杀死一个后台进程,它会记住任务堆栈的状态以及打开了哪些活动。当用户返回该任务时,Android 会创建一个新的 OS 进程并恢复 栈顶Activity 的状态。在 OP 的情况下,它将创建一个 C 的新实例,因为这是当用户将任务置于后台时堆栈中的顶部 Activity
        猜你喜欢
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多