【问题标题】:How to close activity and go back to previous activity in android如何关闭活动并返回到android中的上一个活动
【发布时间】:2013-03-01 21:28:13
【问题描述】:

我有一个主要活动,当我单击一个按钮时,开始一个新活动,我使用以下代码来执行此操作:

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

以上代码是从主活动中运行的。

现在在我的主要活动调用的新活动中,我有一个后退按钮。 当我点击这个后退按钮时,我希望我的新活动关闭,它必须回到原来的主要活动。

我曾尝试调用super.finish()finish()(来自新活动),但这会关闭我的整个应用程序(包括我的主要活动)。

如何关闭当前焦点所在的 Activity,然后返回主 Activity?

已编辑

我手机的后退按钮也关闭了我的整个应用程序,这让我认为我错误地启动了第二个活动?


好的,我一直在寻找,

我创建了一个设置活动,它使用相同的清单代码和相同的代码来启动活动。

对于设置Activity,当我按下后退按钮时,它会返回到Main Activity。

使用上面提到的主要问题中的活动,它只会退出我的整个应用程序。

所以问题似乎不在于完成活动的代码,而是活动本身。

【问题讨论】:

  • 你甚至不需要返回键,只要让用户使用手机返回键,你就不需要做任何事情。
  • 电话后退按钮关闭条目应用程序,而不仅仅是我的次要活动。我不想关闭主要活动。
  • “后退”按钮不应该那样做——你能显示更多你的代码吗?
  • 响应您的编辑,从您发布的内容来看,次要活动看起来不错。我认为 TGMCians 可能有正确的答案,你调查你的清单。
  • 看到这个answer我想这会对你有所帮助

标签: android android-activity


【解决方案1】:

我认为您在启动SettingsActivity 之前在MainActivity 中调用finish() 方法。

您所描述的场景将通过以下两种方式发生:

任何一个

您已在 AndroidManifest.xml 中将 MainActivity 设置为 android:noHistory = "true",这会在按下返回键时自动将 MainActivity 设置为 finish

在切换到“SettingsActivity”之前,您已经在 MainActivity 中调用了 finish(),这会杀死它。当您按下返回按钮时,由于堆栈中没有预设其他要弹出的活动,它会返回到主屏幕。

【讨论】:

  • 这可以解释为什么手机的“后退”按钮也会关闭主要活动。
  • 调试的时候发现finish()之后继续执行,所以最好加上return。
  • 这个答案中的第三个原因不是只是第一个的重复吗?
【解决方案2】:

您只需在您所在的活动中调用 finish() 即可返回上一个活动。请注意,finish() 调用之后的任何代码都将运行 - 您可以在调用 finish() 之后执行 return 来解决此问题。

如果您想将结果返回到活动一,那么在开始活动二时您需要:

startActivityForResults(myIntent, MY_REQUEST_CODE);

在您调用的活动中,您可以从 onCreate() 参数获取 Intent 或使用

getIntent();

要设置返回结果给活动一,然后在活动二中做

setResult(Activity.RESULT_OK, MyIntentToReturn);

如果你不打算回来,那就说吧

setResult(Activity.RESULT_OK);

如果活动的结果不好,您可以使用 Activity.RESULT_CANCELED(默认情况下使用此选项)。然后在活动一中进行

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

要完成活动,两个使用与上述相同的方法完成(),您的结果已经设置。

【讨论】:

  • "请注意,finish() 调用之后的任何代码都将运行 - 您可以在调用 finish() 后返回来解决此问题" 我认为 'fix' 在这里是一个错误的选择。这更像是您避免执行以下行(不修复)。
【解决方案3】:

如果你使用片段,你应该使用

getActivity().onBackPressed();

如果你使用单一活动,你可以使用

finish();

【讨论】:

    【解决方案4】:

    当你点击你的按钮时,你可以让它调用:

    super.onBackPressed();
    

    【讨论】:

      【解决方案5】:

      我相信您的第二个活动可能与您作为子活动的主要活动没有关联。检查您的AndroidManifest.xml 文件并查看您的子活动的<activity> 条目是否包含android:parentActivityName 属性。它应该看起来像这样:

      <?xml ...?>
      ...
      <activity
          android:name=".MainActivity"
          ...>
      </activity>
      <activity
          android:name=".ChildActivity"
          android:parentActivityName=".MainActivity"
          ...>
      </activity>
      ...
      

      【讨论】:

        【解决方案6】:

        试试这个代码而不是finish:

        onBackPressed();

        【讨论】:

        • 适用于从 ActivityB 回到 ActivityA。对于片段和单个活动可以使用@Osama Ibrahim 的答案。
        【解决方案7】:
        Button edit = (Button) view.findViewById(R.id.yourButton);
        edit.setOnClickListener(new OnClickListener() {
        
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(this, YourMainActivity.class);
                startActivity(intent);
                finish();
            }
        });
        

        【讨论】:

          【解决方案8】:

          这会关闭整个应用程序:

          this.finish();
          

          【讨论】:

          • 这会关闭问题中所述的整个应用程序,而不仅仅是当前活动,手机后退按钮也是如此吗?
          • 我如何从相机活动中获得以前的活动。
          • 不,它没有。它只关闭当前活动。见:developer.android.com/reference/android/app/…
          【解决方案9】:

          你太难了。如果我理解您要正确执行的操作,内置的“后退”按钮和 Android 本身将为您完成所有工作:http://developer.android.com/guide/components/tasks-and-back-stack.html

          此外,实现自定义“后退”按钮违反核心应用质量指南 UX-N1:http://developer.android.com/distribute/googleplay/quality/core.html

          【讨论】:

            【解决方案10】:

            我不知道这是否有用,但我正在努力解决同样的问题,我找到了一个非常简单的方法,只有一个全局布尔变量和 onResume() 操作。就我而言,我的 Activity C 如果单击特定按钮,它应该触发 Activity B 的 finish()!

            Activity_A -> Activity_B -> Activity_C

            Activity_A(正常打开Activity_B)

            Activity_B(点击某个按钮会打开 Activity_C):

            // Global:
            boolean its_detail = false;
            // -------
            SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
            boolean v = prefs.getBoolean("select_client", false);
            
            its_detail = v;
            
            startActivity(C);
            
            @Override
            public void onResume(){
                 super.onResume();
                 if(its_detail == true){
                    finish();
                 }
            }
            

            所以,每当我点击 Activity C 上的按钮时,它都会执行 Activity B 的“onResume()”函数并返回到 Activity A。

            【讨论】:

              【解决方案11】:
               @Override
                  public boolean onOptionsItemSelected(MenuItem item) {
                      int id = item.getItemId();
              
                      if ( id == android.R.id.home ) {
                          finish();
                          return true;
                      }
              
                      return super.onOptionsItemSelected(item);
                  }
              

              试试这个,它在工具栏后退按钮上都可以作为硬件后退按钮

              【讨论】:

              • 这个对我有用。我还有一个 MainActivity 和一个带有android:parentActivityName=".MainActivity"SettingsActivity 用于第二个。此代码处理工具栏中的 Home/Back 按钮,并刚刚完成当前活动,返回到堆栈中的前一个活动。谢谢。
              【解决方案12】:

              Finish 关闭了整个应用程序,这是我在 Android 开发中讨厌的东西,没有完成这很好,但他们没有跟上他们拥有的 ok 语法

              startActivity(intent)
              

              为什么不

              closeActivity(意图) ?

              【讨论】:

              • 这能回答问题吗?或者这只是一个可以尝试的建议?在这两种情况下,咆哮都是不必要的,并且可能在 SO 上不受欢迎
              【解决方案13】:

              我们遇到了非常相似的情况。

              活动一(开场)->活动二(预览)->活动三(详细)

              不正确的“后按”响应

              • 在 Activity 3 上的设备后按也会关闭 Activity 2。

              我已经检查了上面发布的所有答案,但没有一个有效。 Activity 2 和 Activity 3 之间的转换的 Java 语法经过审查是正确的。

              刚开始编写第 3 方应用程序。通过一个活动。我们决定从配置角度进行调查 - 最终使我们能够确定问题的根本原因。

              范围:Activity 2(调用者)的配置。

              根本原因

              android:launchMode="singleInstance"
              

              解决方案

              android:launchMode="singleTask"
              

              显然,在这个“背压”问题上,singleInstance 考虑在一个实例中调用的活动与调用活动,而 singleTask 将允许调用的活动有足够的自己的身份使预期的背压能够正常工作。

              【讨论】:

                【解决方案14】:

                关于活动的 onCreate 方法 编写以下代码。

                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setDisplayShowHomeEnabled(true);
                

                然后覆盖你的活动的 onOptionsItem 选择方法,如下所示

                @Override
                public boolean onOptionsItemSelected(MenuItem item) {
                    switch (item.getItemId()){
                        case android.R.id.home:
                            finish();
                    }
                    return super.onOptionsItemSelected(item);
                }
                

                你可以走了。

                【讨论】:

                  【解决方案15】:

                  只是不要在您的MainActivity 上调用finish(),这样就无需在您的SecondActivity 中覆盖您的onBackPressed(),除非您在该函数中执行其他操作。如果您觉得“需要”这个后退按钮,那么您只需在SecondActivity 上拨打finish(),只要您没有拨打过finish(),它就会将您带到您的MainActivity

                  【讨论】:

                  • 我试过这条路线,但我有大约 10 个屏幕依次使用高分辨率 PNG。问题是,在屏幕 7 左右,由于后台堆栈中的所有活动,设备内存不足。我决定在每个活动上调用完成,这通过允许垃圾收集解决了这个问题,但是现在需要手动编码后退行为,因为后退堆栈现在是空的。您是否遇到过这个问题或知道 Android 中有什么机制可以解决这个问题?
                  • 你想让后退按钮做什么?回到以前的Activity 还是总是回到MainActivity?此外,如果您使用Bitmaps 的内存不足,那么您应该阅读This part of Docs。它帮助了我
                  • @Lo-Tan 如果您想回到上一个活动,那么我认为您需要弄清楚图像的内存管理而不是完成活动(也许使用我提供的链接)。否则,您将不得不重新创建 Activity 的新实例并尝试找出返回到哪个实例
                  • 我希望后退按钮只是转到上一个屏幕。基本上,这是一系列教程屏幕,用户可以前进/后退。每个屏幕都经过设计并使用大量 png - 有时 png 占据了大部分屏幕(不仅仅是小缩略图),因此每个屏幕都占用了大量内存。
                  • @Lo-Tan 我想你想覆盖 onBackPressed() 方法,然后手动创建你想去的活动。然后,您可以结束您正在使用的一个并启动前一个。
                  【解决方案16】:

                  您可能正在调用finish();在单击按钮事件中,因此主活动在您单击按钮后立即关闭,当您从下一个活动返回时,应用程序退出,因为主活动已经关闭并且没有活动活动。

                  【讨论】:

                    【解决方案17】:

                    你必须在你的 MainActivity 中使用它

                     Intent intent = new Intent(context , yourActivity);
                    
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                                context.startActivity(intent);
                    

                    该标志将启动多个任务,这些任务将保留您的 MainActivity,当您调用完成时,它将杀死其他活动并让您回到 MainActivity

                    【讨论】:

                      【解决方案18】:

                      如果以上答案都没有帮助,我认为这可能会对某人有所帮助。

                      我在按下内置后退按钮或自定义后退按钮时也遇到了同样的问题,应用程序关闭而不返回到上一个活动。

                      我正在从第一个活动的工具栏中调用第二个活动。

                      但在启动活动中我称之为:

                      case android.R.id.home:
                                  if (isActionMode) {
                                      clearSelectingToolbar();
                                      adapter.notifyDataSetChanged();
                                  } else {
                                      onBackPressed(); // This was making the activity to finish 
                                  }
                                  break;
                      

                      这个代码开始活动

                       case R.id.settings:
                                  context.startActivity(new Intent(ShowAllDirectoriesActivity.this, SettingsActivity.class));
                      

                      删除“case android.R.id.home”部分后,我的活动能够以正常流程执行,即返回上一个活动。

                      所以检查一下你是否也在使用同样的东西!

                      【讨论】:

                        【解决方案19】:
                        { getApplicationContext.finish();   }
                        

                        试试这个方法..

                        【讨论】:

                        • 虽然这个代码块可能会回答这个问题,但最好能稍微解释一下为什么会这样。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-05-01
                        • 2020-03-04
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多