如何完成特定的活动而不是所有活动

11

在我的安卓应用中有几个活动(activities), 如果使用intent(意图),我可以像这样跳转到其他活动:

[Activity A]->[activity B]->[Activity C]->[Activity-D]->[Activity N]

现在,当我在活动N时,按下按钮后,我想要去到Activity B并销毁Activity C和Activity D,但是Activity A不应该被销毁。我已经在各种文章中搜索过,但没有找到完全相同的解决方案。 任何帮助将不胜感激。


当你转到另一个活动时,结束该活动。例如,如果您不想结束活动A和活动B,则结束活动C和活动D。 - Damini Mehra
@DaminiMehra 我不想通过意图完成活动B和C。 - user121190
为什么你不想完成? - Damini Mehra
7个回答

21

ActivityN 中返回到 ActivityB,使用以下代码:

Intent intent = new Intent(this, ActivityB.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

使用标志 CLEAR_TOP 将结束堆栈中位于 ActivityB 之上的所有活动。在您给出的示例中,这将结束 ActivityNActivityDActivityC。使用标志 SINGLE_TOP 将确保将控制返回到现有的 ActivityB 实例(即:它不会创建一个新的 ActivityB 实例)。


4
在您的活动C中,按照以下步骤操作
public static ActivityC instance = null;
public class ActivityC extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instance = this;
    }
}

在您的Activity D中,请按照以下步骤进行

public static ActivityD instance = null;
public class ActivityD extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instance = this;
    }
}

在您的Activity N中,最后请像这样做:
public class ActivityN extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button yourButton= (Button) findViewById(R.id.yourButton);
         yourButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ActivityC.instance.finish();
                Activityd.instance.finish();
                finish();  
            }
        });
    }
}

1
我不倾向于使用静态变量。 - Janki Gadhiya
有时候奇怪的需求会迫使我们使用静态 @janki gadhiya - Masum
这个解决方案还可以,但如果我们有15-20个活动,那么我们必须创建所有活动实例并一起完成。 - user121190
是的。你应该这样做。 - Masum
2
这是一个可怕的解决方案 :-( Android提供了“ Intent”标志来实现OP所需的功能。您的解决方案会在应用程序中创建内存泄漏,因为存储在静态变量中的“Activity”实例永远无法被垃圾回收。不仅如此,这个解决方案很难理解和维护。没有理由使用这样的黑客技术。 - David Wasser

2
这是我的方法。
从“Activity A”开始不要直接启动“Activity B”,而是使用“startActivityForResult()”方法调用。对于所有后续的调用都这样做。
现在,当你从“Activity N”按下按钮时,为一个自定义值设置“result ”并调用“finish()”方法结束“Activity N”。现在你应该在你的“Activity D”的“onActivityResult”方法中遇到问题。现在你可以检查结果是否是你按下按钮。根据你的结果,继续设置结果并随后在每个“Activity”上调用“finish()”。
这在技术上应该有效。

1

编辑:使用startActivityForResult()而不是startActivity()

因此,根据结果您可以更改行为

例如,当您想要转到ActivityB时,只需在INTENT中返回一些标志。当它在Activity D和C中被捕获并在onActivityResult()中完成它们,最终您将到达B


我的Activity N中有许多视图,我不想使用意图跳转到Activity B,因为有许多情况,例如如果我按返回键,我想要去Activity D而不是B,所以在这种情况下,finish方法无法起作用。 - user121190
感谢这个解决方案,以及 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志也解决了我的问题。 - user121190
请参考以下链接中的完整概念:http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP - user121190

1

1
尝试这段代码:

//Activity A

Intent i = new Intent(getApplicationContext,ActvityB.class);
startActivity(i);

//活动 B

Intent i = new Intent(getApplicationContext,ActvityC.class);
startActivity(i);

//活动 C
Intent i = new Intent(getApplicationContext,ActvityC.class);
startActivity(i);
finish();  
// finish here actvity which you want to finish

//尝试第二种方法:

在你的第一个活动中,像这样声明一个Activity对象,

public static Activity fa;
onCreate()
{
 fa = this;
}

现在在另一个活动中使用该对象来完成第一个活动,如下所示:
onCreate()
{
 FirstActivity.fa.finish();
}

使用返回键,我想从启动意图的上一个活动返回,所以,在特殊情况下,我想要进入B活动,这就是为什么我不想使用finish方法的原因。 - user121190
1
这是一个可怕的解决方案 :-( Android提供了Intent标志来实现OP想要的功能。你的解决方案会在应用程序中创建内存泄漏,因为存储在静态变量中的Activity实例永远无法被垃圾回收。不仅如此,这个解决方案很难理解和维护。没有理由使用这样的hack。 - David Wasser

0

您可以使用相同的请求码传递给startForResult(requestCode),启动ActivityCActivityDActivityN

然后在ActivityN中,使用finishActivity(int requestCode)

finishActivity(int requestCode)的文档说明

Force finish another activity that you had previously started with startActivityForResult.
Params:
requestCode – The request code of the activity that you had given to startActivityForResult().
If there are multiple activities started with this request code, they will all be finished.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接