【问题标题】:Switching between activities in android?在android中的活动之间切换?
【发布时间】:2012-03-30 04:43:34
【问题描述】:

在我的 android 应用程序中,我有以下要求。

活动 A --> 活动 B(转到 A 选项)--> 活动 C(转到 A 选项,转到 B 选项)

1) 从活动 B 转到活动 A,我使用了 onBackPressed() 方法。

2) 从活动 C 转到活动 B 我再次使用了onBackPressed()方法。

这些都很好。

3) 现在我想从 Activity C 转到 Activity A(没有 Intent 调用)。

我该怎么做?

编辑 1:

活动 A 是我的主要活动,我不想使用 Intent 重新启动活动。我想从活动 c 恢复活动 A。(就像我使用 onBackPressed 从活动 B 所做的那样)。

已编辑 2(有答案):

好的,伙计们。感谢大家对我的问题的帮助。最后我找到了一个类似于@Paresh Mayani 的简单答案。

答案:

        Intent a = new Intent(getApplicationContext(),ActivityA.class);
        a.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(a);

我通过使用这个解决了我的问题的link 得到了这个很好的解决方案。再次感谢大家,我真的很感激。

【问题讨论】:

  • 你使用intent有什么问题?
  • 活动 A 是我的主要活动,我不想使用 Intent 重新启动活动。我想从活动 c 恢复活动 A。(就像我使用 onBackPressed 从活动 B 所做的那样)清除??

标签: android android-activity


【解决方案1】:

我假设您不想使用 Intent,因为每当您使用 Intent 移动到活动 A 时,按 Back 键将移动到上一个活动(活动 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 标志,它会在不清除任何活动的情况下移动到活动 A。

更多信息,请查看this

【讨论】:

  • 我猜有人不喜欢它,人们不欣赏其他人花时间提供帮助。
  • 投反对票的请写出真实的理由!!
  • @sandy aah 我说的是我的答案。
  • @PareshMayani 这不起作用,因为用户不想重新创建活动,而 FLAG_ACTIVITY_CLEAR_TOP 只会重新创建它。
【解决方案2】:

有两种方法可以实现这一点:通过应用 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 中:

  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);

【讨论】:

  • 谢谢终于有人来了,这让我的回答有些关注
  • 是的,为什么不这样做,但是使用 FLAG_ACTIVITY_CLEAR_TOP 将不起作用,因为用户不希望重新创建活动 A,而使用 FLAG_ACTIVITY_CLEAR_TOP 它将重新创建。而 startActivityForResult 是一个不错的选择。
【解决方案3】:

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

您使用StartActivityForResult() 开始活动

并根据您在活动中设置 ResultCodes 的条件.. 像这样..

GO_TO_ACT_A=1; GO_TO_ACT_B=2;

在所有 Activity onActivityResultMethod 检查结果代码..

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

【讨论】:

  • 嘿,我的回答没有解决相同的解决方案吗?
  • @jitendrasharma .. 可能是.. 但我真的没看到.. 和我很久以前给出的相同答案.. 我不记得那是哪个.. 多数民众赞成在为什么我告诉他谷歌它..
【解决方案4】:

如果你想重新创建你的活动,那么你可以使用FLAG_ACTIVITY_SINGLE_TOP

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

通过这样做,您的 Activity A 将不会被重新创建,而是您必须覆盖将在您的 Activity A 中调用的onNewIntent()

更新:

这是使用Intent,但由于您的要求是不使用Intent,所以在这种情况下,更好的方法是使用startActivityForResult,因为上面已经有几个答案,我没有详细说明。

【讨论】:

  • @Mayank 啊!!真的是复制粘贴吗?
【解决方案5】:

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

((Activity) bContext).finish();

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

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

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

【讨论】:

  • 如果之前的Activity已经被OS完成了怎么办...异常...?...只是出于好奇...
  • @sandy 好点,如果前一个活动被操作系统关闭,那么上下文将为空,所以正如你所说的会有一个异常,NPE。
  • 我的意思是关于异常。如果是这种情况,有什么办法可以避免这种情况吗?
  • 是的,捕获异常并进入下一步,即自己调用完成。
【解决方案6】:

为什么不能用,

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

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

我想这就是你想要的。有了这个,您可以使用活动 C 中的Intent。是的,然后它转到onCreate 方法,但是您正在检查是否有任何已保存的实例。如果有任何已保存的实例,则无需加载其余的 onCreate 项目。它将加快您的应用程序。

【讨论】:

    【解决方案7】:

    你可以这样做:

    后按选项:

    1. onBackPressed(){ @覆盖 公共无效 onBackPressed() {

      // TODO Auto-generated method stub
          super.onBackPressed();
      //Your method intent
          Intent intent = new Intent(A.this, C.class);
          startActivity(intent);
      

      }

    使用按钮:

    1. button.setOnClickListener(new View.OnClickListener() {

           public void onClick(View v)
      
           {
      
                   Intent intent = new Intent(A.this, C.class);
               startActivity(intent);
            // finish(); // may use finish if do not want endless loop
      }});
      

    【讨论】:

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