【问题标题】:Call new activity and destroy current one调用新活动并销毁当前活动
【发布时间】:2017-09-06 11:37:46
【问题描述】:

我有三个活动:A、B 和 C。

A 是 B 的意图,B 是 C 的意图,

当我在 C 中完成操作后,我想销毁 C 并返回 A,而不是 B。

我试过了:

finish();
B b = new B();
b.finish();

在 C 中,不起作用;还有

finish();
B b = new B();
b.onDestroy();

在 C 中,它会生成 NullPointerException

我如何做到这一点?

【问题讨论】:

  • 在活动中不要调用finish()

标签: android android-activity android-lifecycle


【解决方案1】:
Intent i = new Intent(MainActivity.this,SecondActivity.class);
startActivity(i);
finish();

【讨论】:

    【解决方案2】:

    使用这个:

    Intent i = new Intent(FromActivity.this,ToActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    

    来自关于Intent的文档:

    FLAG_ACTIVITY_NEW_TASK如果设置,此活动将成为此历史堆栈上新任务的开始

    FLAG_ACTIVITY_CLEAR_TASK如果在传递给 Context.startActivity() 的 Intent 中设置,此标志将导致在启动 Activity 之前清除与该 Activity 关联的任何现有任务。

    【讨论】:

    • 在哪里使用它?你的意思是 setFlags 方法?好的,我会检查一下
    • 我用另一种方式解决了这个问题,无论如何谢谢
    【解决方案3】:

    在完成您的操作后,您可以调用一个意图让您进入您想要的活动,如下所示:

    Intent intent = new Intent(ActivityC.this, ActivityA.class);
    startActivity(intent);
    

    【讨论】:

    • 他不想重新创建Activity,他想直接去A,他只需要不完成A Activity
    【解决方案4】:

    有几种方法可以做到这一点:

    首先:将 android:noHistory 属性添加到清单中的 B 活动中,如下所示:

    <activity android:name=".A"/>
    <activity android:name=".B" android:noHistory="true"/> <!-- This attribute will prevent adding activity to activity stack-->
    <activity android:name=".C"/>
    

    第二:在你开始新的活动之后调用finish

    // Put this code in your B activity
    Intent intent = new Intent(this, C.class);
    startActivity(intent);
    finish() // This will finish current activity (activity B in your case) and activity stack will only contain A activity
    

    第三:将标志 FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK 放入您的 C 活动意图中

    // Put this code in your B activity
    Intent intent = new Intent(this, C.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // This will exclude current activity (activity B in your case) from activity stack
    startActivity(intent);
    

    【讨论】:

      【解决方案5】:

      Intent 调用活动,然后调用finish()

      startActivity(new Intent(C.this, A.class));
      finish();
      

      finish() 将从后台堆栈中删除活动,新活动将通过startActivity() 方法启动。

      【讨论】:

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