【问题标题】:Replace current activity替换当前活动
【发布时间】:2010-01-22 09:14:07
【问题描述】:

我需要用新的活动替换当前活动。也就是说,我想启动一个新的活动,并从任务堆栈中删除当前的活动。

根据文档,似乎最好的方法是像往常一样使用Activity.startActivity 启动活动,然后立即调用Activity.finish 以关闭当前活动。

这是对这些 API 的有效用法还是我应该做其他事情?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    是的。这种方式使用api很好。

    【讨论】:

    • 这是否适用于 startActivityForResult?如果是这样,结果会在哪里发布?
    • 对于想知道@nmr 问题的人来说,我一直在做的是为结果启动新活动,然后根据需要在onActivityResult 中调用finish()。
    • 您能解释一下不使用intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME) 的区别吗,如@Jeremie D 的回答所示?
    【解决方案2】:

    实现这一点的正确方法是使用以下方法:

    Intent intent = new Intent(this,MyActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
    startActivity(intent);
    this.finish();
    

    代码假定您在一个活动中,否则如果您使用片段,请使用 getActivity()

    这样,活动就启动了,您正确设置了后退按钮的层次结构,并且还销毁了相应的活动。

    【讨论】:

    • 你能解释一下有什么区别吗?如果你不使用setFlags设置这些标志会发生什么?
    【解决方案3】:

    尝试在意图标志中使用FLAG_ACTIVITY_TASK_ON_HOMEFLAG_ACTIVITY_NEW_TASK

    【讨论】:

      【解决方案4】:

      你可以在你的activity中添加android:launchMode="singleInstance",然后重写onNewIntent方法来更新日期

      参考 PlayerActivity in ExoPlayer Demo

      【讨论】:

      • 如果您有一个逻辑/功能性“主页”并且您使用大量导航(如抽屉式导航),这将是一件非常有用的事情
      【解决方案5】:

      您可以在开始活动时使用 FLAG_ACTIVITY_CLEAR_TASK。我还在清单中将我的活动的启动模式定义为 singleTask,但那是因为我想要新活动的行为。我认为,只要您将标志 FLAG_ACTIVITY_CLEAR_TASK 传递给 startActivity,无论您在新活动中使用何种启动模式,您都可以获得关于清除先前活动的内容。

      【讨论】:

        猜你喜欢
        • 2021-03-14
        • 2017-12-03
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多