【问题标题】:Finish parent and current activity in Android在 Android 中完成父活动和当前活动
【发布时间】:2010-08-04 22:17:03
【问题描述】:

我有 3 个活动。活动 A 导致活动 B,而活动 B 又可以返回活动 A 或启动活动 C。但是,如果我在活动 C 中按下返回,则应用程序应该关闭。

总结一下:

  • 活动 A 开始活动 B
  • 在活动 B 上按 Back 应该会导致 A
  • 活动 B 开始活动 C
  • 在活动 C 上按 Back 应该会关闭应用程序

我应该如何从活动 B 转到 C?这段代码目前在最后一行给了我一个 NullPointerException:

Intent intent=new Intent(ActivityB.this, ActivityC.class);
startActivity(intent);
ActivityB.this.finish();
ActivityB.this.getParent().finish();

如果我切换最后两行,我也会得到一个空指针。

【问题讨论】:

  • 我想指出的是,当您不在应用程序的第一页时点击返回按钮后关闭应用程序真的很烦人。我不确定您在做什么,但请注意用户不要期望后退按钮会转到上一个活动

标签: android android-activity


【解决方案1】:

我不知道这是否可行,但你可以试试:

  • 从活动 A,使用 startActivityForResult() 启动活动 B 以获取结果

  • 在Activity B中,当用户触发Activity C时,启动Activity C。

startActivity() 立即返回,所以

  • 设置一个结果,通知 A 也完成,

  • 在 B 中致电 finish()

  • 当 A 收到 B 的结果时,A 也会对自己调用 finish()

如果做不到这一点,您可以将 Activity C 变成它自己的应用程序,然后在启动第二个应用程序后关闭第一个应用程序(带有 A 和 B)。

附:在您前进时考虑 Falmarri 的评论!
祝你好运。

【讨论】:

    【解决方案2】:

    如果您想从子活动完成父活动,

    在父activity中,在触发子activity的同时,使用如下命令:-

    startActivityForResult(intent_name,any_integer_variable);
    

    并以以下方式覆盖 onActivityResult 方法:-

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode==2){
            finish();
        }
    }
    

    现在,在子活动中,以下列方式覆盖 onStop 和 onDestroy:-

    protected void onStop() {
        setResult(2);
        super.onStop();
    }
    @Override
    protected void onDestroy() {
        setResult(2);
        super.onDestroy();
    }
    

    请注意,我已在子活动中将值设置为 2,并在父活动中检查它。如果该值与我设置的值相同,则父活动也将完成。 然后,您可以使用递归方法进行进一步的活动。

    【讨论】:

    • 我做的完全一样,但是无论我使用setResult()在子活动中设置什么值,父活动总是收到0
    • 我发现onActivityResultonStoponDestroy之前被调用,你需要在setResult之前调用。
    • any_integer_variable 怎么用?
    【解决方案3】:

    你应该在你的父Activity中使用onActivityResult方法

    假设活动 A 是活动 B 的父项。 如果你想点击Activity B中的返回按钮退出Application(也退出Activity A)

    在您的活动 B 中,onStop()onDestroy()

    你打电话

    setResult(0); //any int number is fine
    

    这会将结果代码传递给其父活动。

    您的父级 Activity A,侦听结果代码 您将需要使用onActivityResult 方法 在你可以调用的方法里面

    if(resultCode == 0) //matches the result code passed from B
    {
        ActivityA.this.finish()
    }
    

    它对我有用:)

    【讨论】:

    • 不错的解决方案。使用来自子活动的代码的 setResult 并在父活动上接收 resultCode。现在我可以处理父活动也会在子活动中单击特定按钮时销毁。
    【解决方案4】:

    这些都不适合我。所以我找到了一个解决方案。帮助清楚地列出了 Intent.FLAG_ACTIVITY_CLEAR_TASK 必须与 Intent.FLAG_ACTIVITY_NEW_TASK 一起使用。所以这是一个对我有用的代码。

    Intent intent=new Intent(ActivityB.this, ActivityC.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    

    【讨论】:

      【解决方案5】:

      我没有做任何这些。这就是我修改你的代码的方式。

      你用来输入另一个意图的代码:

      Intent whatEverIntentName = new Intent("Path.to.next.Intent");
      startActivity(whatEverIntentName);
      finish();
      

      这样,您在按下返回时总是会退出。可是等等!你可以改变你想要的 返回键按下时做出反应。

      这样做:

      @Override
      public void onBackPressed() {
          super.onBackPressed();
          Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it");
          startActivity(whatEverIntentName);
      // Don't add finish here. 
      //This is necessary because you finished your last activity with finish();
      }
      

      【讨论】:

        【解决方案6】:

        您可以使用finishAffinity() ,它将关闭当前活动的当前和所有父活动。

        注意:但是从子活动到父活动的任何结果都不会被处理。

        希望对你有帮助!!

        【讨论】:

          【解决方案7】:

          试试这个

            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);                
          

          【讨论】:

          • 使用相同的..有什么缺点吗?请告诉我。
          【解决方案8】:

          如果您在活动 A 上并开始了另一个名为活动 B 的活动。 活动 A --> 活动 B

          现在想关闭这两个活动。

          然后在活动 B 中使用以下代码。

          B.this.finish();
          

          并在活动 A 中使用此代码:

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

          一旦活动 B 结束,活动 A 也将结束。

          有一个缺点,我不知道你是否想要这个。

          缺点是如果用户在 Activity B 上并且她/他按下返回按钮以在 Activity A 上移动。那么,在这种情况下,Activity A 也将完成。

          【讨论】:

            【解决方案9】:

            这是完美的工作:

            btn_back.setOnClickListener(new View.OnClickListener()
            {
            public void onClick(View v) {
            
            Player.this.finish();
                }
            });
            

            【讨论】:

              【解决方案10】:
              Intent intent=new Intent(ActivityB.this, ActivityC.class);
              intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
              startActivity(intent);
              

              您的活动 C 将成为根活动,按下后将完成应用程序。

              【讨论】:

                【解决方案11】:

                从屏幕(B) 开始屏幕(C) 没有后屏幕,只需 启动此屏幕 (C):

                screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
                    | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(screenC);
                finish();
                

                screenC 中的 back 将退出应用程序。

                【讨论】:

                  【解决方案12】:

                  从 Activity A,使用 startActivityForResult(intent,19) 为结果启动 Activity B

                  在Activity B中,当用户触发Activity C时,启动Activity C。

                  startActivity() 立即返回,所以

                  设置一个结果,通知 A 也完成,

                  在 B 中调用 finish()。 并在您的 Child Activity 中的 finish() 方法之前调用 setResult() 方法 在父活动覆盖 onActivtyResult(....) 方法。 当 A 收到 B 的结果时,A 也会对自己调用 finish()。

                  enter code here
                       @Override
                  protected void onActivityResult(int arg0, int arg1, Intent arg2) {
                      //Added by Ashish to close parent activity
                        if(arg1==19){
                        finish();
                          }
                      super.onActivityResult(arg0, arg1, arg2);
                  }
                  

                  【讨论】:

                    【解决方案13】:

                    创建 ActivityB 的实例。

                    关于 ActivityB.java

                    public static ActivityB instanceOfActivityB;
                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        instanceOfActivityB = this;
                    }
                    

                    关于 ActivityC.java

                    void onClose() {
                       ActivityB.instanceOfActivityB.finish();
                       finish();
                    }
                    

                    希望对你有帮助!

                    【讨论】:

                      【解决方案14】:

                      让每个 Activity 监听下一个 Activity 的结果,如果发生,则自行完成。

                      您可以使用特殊的结果代码来表明您希望活动完成。

                      【讨论】:

                        【解决方案15】:

                        你可以直接覆盖back key behavior:

                        活动 A 开始活动 B
                        在活动 B 上按返回应该会导致 A
                        活动 B 开始活动 C
                        在活动 C 上按返回应该关闭应用程序

                        请注意,我不会从 onBackPressed 调用 super。 这还允许您覆盖 Android 的浏览堆栈机制,我发现这是一个很大的优势,因为目前似乎没有一种方法可以以简单的方式从浏览堆栈中清除单个最旧的项目。

                        public class B extends Activity
                        {
                            ...
                            @Override
                            public void onBackPressed()
                            {
                                // Start activity A
                                Intent aIntent = new Intent(this, A);
                                startActivity(bIntent);
                            }
                            ...
                        }
                        
                        public class C extends Activity
                        {
                            ...
                            @Override
                            public void onBackPressed()
                            {
                                // Close
                                finish();
                            }
                            ...
                        }
                        

                        如果需要,你也可以专门完成父activity,但是使用这种方法,你不必担心。

                        【讨论】:

                          【解决方案16】:

                          以下代码应该可以为您完成。几乎在所有其他方法中,您的应用程序都将保留在最近的应用程序中。 Javadoc 可以在 https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask()

                          找到
                                      ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
                                      if(am != null) {
                                          List<ActivityManager.AppTask> tasks = am.getAppTasks();
                                          if (tasks != null) {
                                              tasks.get(0).finishAndRemoveTask();
                                          }
                                      }
                          

                          【讨论】:

                            猜你喜欢
                            • 2011-06-27
                            • 1970-01-01
                            • 2021-09-23
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2014-10-21
                            • 1970-01-01
                            相关资源
                            最近更新 更多