在安卓系统中如何切换活动页面?

8
在我的Android应用程序中,我有以下需求。
Activity A -> Activity B(转到A选项)-> Activity C(转到A选项,转到B选项)
1)要从Activity B转到Activity A,我使用了onBackPressed()方法。
2)要从Activity C转到Activity B,我再次使用了onBackPressed()方法。
这些都很好用。
3)现在我想从Activity C转到Activity A(不使用Intent调用)。
我该怎么做?
编辑1:
Activity A是我的主活动,我不想使用Intent重新启动活动。我想从Activity C恢复Activity A。(就像我通过使用onBackPressed从Activity B恢复一样)。
编辑2(带答案):
好的,谢谢大家对我的问题给予帮助。最终,我发现了一个简单的答案,类似于@Paresh Mayani的答案。
答案:
        Intent a = new Intent(getApplicationContext(),ActivityA.class);
        a.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(a);

我通过使用这个链接找到了一个很好的解决方案,解决了我的问题。再次感谢大家,我真的非常感激。


2
你对使用意图有什么问题吗? - COD3BOY
1
Activity A是我的主要活动,我不想使用Intent重新启动该活动。我想从活动C恢复Activity A。(就像我通过使用onBackPressed从活动B恢复一样)清楚吗? - Dinesh Anuruddha
7个回答

7

我假设你不想使用Intent,因为每当你使用Intent去跳转到活动A时,按下返回键会回到上一个活动(活动C)。在这种情况下,我建议你加入FLAG_ACTIVITY_CLEAR_TOP标志。它将销毁所有先前的活动,并让你移动到活动A。

 Intent a = new Intent(this,A.class);
 a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 startActivity(a);

或者,您可以尝试使用FLAG_ACTIVITY_REORDER_TO_FRONT标志,它将移动到Activity A而不清除任何Activity。

更多信息,请查看此处


2
我猜有人不喜欢它,人们不太欣赏别人花费时间来帮助他们。 - Mayank
那些给负评的人,请写下实际的原因 - Paresh Mayani
@sandy 啊,我在谈论我的答案。 - Lalit Poptani
@PareshMayani 这样做行不通,因为用户不想重新创建 Activity,而 FLAG_ACTIVITY_CLEAR_TOP 只会重新创建它。 - Lalit Poptani

5

您可以通过两种方式实现这个目标:第一种是使用Intent Filter Clear top stack来启动Intent,但根据您的问题,您似乎不感兴趣。第二种方法是通过StartActivityForResult启动活动。

通过使用意图标志:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

通过使用startActivityForResult实现的第二种方式:

在B Activity中:

  Intent intent=new Intent(B.this, C.class);
  intent.startActivityForResult(intent);

onActivityResult 方法:

 protected void onActivityResult(int reqCode, int resultCode, Intent data) {
     if (resultCode == Activity.RESULT_OK ) {
         String res = data.getExtras().getString("result");
         if (res.equals("A")) {
             String msg = "RESULT: " + res;
             Toast.makeText(Login2.this, msg, Toast.LENGTH_SHORT).show();
             finish();
         }
     }
 }

在C活动中
 Intent intent = new Intent();
 intent.putString("result", "Hello, World");
 setResult(RESULT_OK, intent);

谢谢,终于有人注意到我的回答了。 - jeet
是的,为什么不呢?但使用FLAG_ACTIVITY_CLEAR_TOP不起作用,因为用户不希望重新创建Activity A,并且使用FLAG_ACTIVITY_CLEAR_TOP会重新创建它。相反,startActivityForResult是一个不错的选择。 - Lalit Poptani

3

一个可靠的解决方案是...

您可以使用 StartActivityForResult() 来启动活动。

根据条件,您可以在活动中设置 ResultCodes。例如:

GO_TO_ACT_A=1; GO_TO_ACT_B=2;

在所有活动中,使用 onActivityResultMethod 检查结果代码。

if(resultCode==GO_TO_ACT_A){
    finish(); //Assuming curently you are in Activity C and wanna go to Activity A
}

1
嘿,我的回答是否没有涉及相同的解决方案? - jeet
@jitendrasharma.. 可能吧.. 但我真的没看到过.. 我很久以前就给了同样的答案.. 我不记得那是哪个了.. 所以我告诉他去谷歌一下.. - ngesh

1

如果您想重新创建您的Activity,那么您可以使用FLAG_ACTIVITY_SINGLE_TOP

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

通过这样做,您的 Activity A 将不会被重新创建,而是您将需要重写 onNewIntent() 方法,该方法将在您的 Activity A 中被调用。

更新:

这是使用了 Intent,但由于您的要求是不使用 Intent,因此在这种情况下更好的方法是使用 startActivityForResult。由于已经有几个答案在上面,我不再赘述。


@Mayank 啊!!真的是复制粘贴吗? - Lalit Poptani

0
你可以这样做:
在返回按钮选项上:
  1. onBackPressed(){ @Override public void onBackPressed() {

    // TODO 自动生成的方法存根
        super.onBackPressed();
    //你的方法意图
        Intent intent = new Intent(A.this, C.class);
        startActivity(intent);
    

    }

使用按钮:


0

你可以将 Activity B 的上下文传递给 Activity C,然后在 Activity C 中调用。

((Activity) bContext).finish();

这将关闭B活动,然后您可以调用

((Activity)getContext()).finish();

这将导致 Activity C 关闭并返回到 Activity A,因为 Activity B 已经关闭。


2
如果之前的Activity已经被操作系统完成了,会发生什么异常呢?只是出于好奇。 - ngesh
2
@sandy 说得好。如果前一个 Activity 被操作系统关闭,那么上下文将为空。就像你所说的,这会导致一个异常,即 NPE。 - Mayank
我指的是关于异常。如果是这种情况,有没有什么方法可以避免它? - Dinesh Anuruddha
是的,捕获异常并继续下一步,即在自身上调用完成。 - Mayank

0

为什么不能使用,

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //Save your current instance
}

"...此方法在活动可能被杀死之前调用,以便当它在未来的某个时候回来时,可以恢复其状态。例如,如果活动B在活动A前面启动,并且在某个时刻活动A被杀死以回收资源,活动A将有机会通过此方法保存其用户界面的当前状态,以便当用户返回到活动A时,用户界面的状态可以通过onCreate(Bundle)或onRestoreInstanceState(Bundle)进行恢复..."

我认为这就是你想要的。使用这种方法,您可以从Activity C中使用Intent。是的,然后它进入onCreate方法,但是在那里您正在检查是否有任何已保存的实例。如果有任何已保存的实例,则无需加载其余的onCreate项。这将加速您的应用程序。


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