【问题标题】:Previous Activity still present以前的活动仍然存在
【发布时间】:2018-07-24 13:29:00
【问题描述】:

有没有办法完全删除以前的活动?

说明:

我有一个 SplashScreen 活动,我正在加载数据等,然后当它完成时,我将导航到 MainActivity,如下所示:

startActivity(Intent(applicationContext, MainActivity::class.java))
finish()

我的MainActivity 出现在前台,在这里没问题,但是当我是listening to Lifecycle EventProcessLifeCycleOwner library 时,在这种特殊情况下:

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun appWillEnterBackground() {
    Log.e("INACTIVE", "BECOME INACTIVE")
}

当我使用MainActivity 时,我的两个活动都使用这种方法。我的SplashScreenActivity应该不能进入这个方法,因为我finish()吧。

我尝试在finish() 之后返回,我在Manifest.xml 中尝试了"noHistory=true",但都没有成功。

有什么建议吗?

【问题讨论】:

  • 谁是生命周期观察者?你的活动?你可能会泄露你的启动活动
  • 你在完成你的启动画面时做过这样的事情吗:myLifecycleOwner.getLifecycle().removeObserver(this);
  • 不,我没有做这样的事情,但我找到了一种方法。在我的 Splashscreen onDestroy() 方法上,我将布尔值设置为 false,然后在任何我想要的地方使用它,以跳过使用 SplashScreen 活动“销毁”的步骤
  • 这不是好的解决方案,你必须找到问题的根源。您可能会泄漏启动画面,这可能会导致以后出现问题
  • 我的 Splashscreen 调用 webservice 并从 Firebase 获取一些数据。当我通过回调得到所有东西时,当过程完成时,我只需调用 start MainActivity

标签: android kotlin background android-lifecycle foreground


【解决方案1】:

你可以试试finishAffinity()方法。

finishAffinity():完成这个活动以及它下面的所有活动 具有相同亲和力的当前任务。

【讨论】:

  • 不幸的是,它不起作用,在我的“appWillEnterBackground()”方法中,我检查了实际上下文并在其中输入了 2 次。第一次是 MainActivity,第二次是我的 SplashScreen Activity
  • 尝试在启动 MainActivity 之前完成 SplashActivity。结束(); startactivity(..);
  • 与下面相同的答案也不起作用
【解决方案2】:

首先调用完成方法,然后开始新的活动。

finish()
startActivity(Intent(applicationContext, MainActivity::class.java));

【讨论】:

    【解决方案3】:

    您可以为 MainActivity 使用 singletop 启动类型。

        <activity android:name=".SingleTaskActivity"
                  android:launchMode="singleTask">
    

    【讨论】:

      【解决方案4】:

      在要杀死的活动中创建广播接收器。使用“ACTION_KILL_THIS_ACTIVITY”之类的意图操作注册它。在此广播接收器的 onReceive 方法中添加 finish();线。当您的新活动开始时,您已准备好杀死另一个活动,因此从新活动的 onCreate() 方法中调用

      sendBroadcast(new Intent("ACTION_KILL_THIS_ACTIVITY"));
      

      【讨论】:

      • 并且不要忘记在被杀死的活动的 onDestroy() 方法中取消注册广播接收器,否则您可能会泄漏内存。
      • 如果你想让你杀死的活动不出现在最近打开的应用程序中,请在你的清单中添加这一行 android:excludeFromRecents="true"
      【解决方案5】:

      而不是传递applicationContext 传递SplashScreenActivity.this 作为参数,所以您的代码将如下所示:

      startActivity(Intent(SplashScreenActivity.this, MainActivity.class)); finish();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-07
        相关资源
        最近更新 更多