完成Android中的父级和当前活动

时间:2010-08-04 22:17:03

标签: android android-activity

我有3项活动。活动A导致活动B,活动B又可以返回活动A或开始活动C.但是,如果我在活动C中按回应用程序应该关闭。

总结一下:

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

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

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

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

16 个答案:

答案 0 :(得分:54)

我不知道这是否有效,但您可以尝试一下:

  • 从活动A开始,使用startActivityForResult()

  • 为结果启动活动B.
  • 在活动B中,当用户触发活动C时,启动活动C.

startActivity()立即返回,所以

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

  • 在B

  • 中拨打finish()
  • 当A从B收到结果时,A也会自行调用finish()

如果做不到这一点,您可以将活动C放入自己的应用程序中,然后在第二个应用程序启动后关闭第一个应用程序(使用A& B)。

P.S。在你前进的过程中考虑Falmarri的评论!
祝你好运。

答案 1 :(得分:34)

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

在父活动中,在触发子活动时,使用以下命令: -

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,并在父活动中检查它。如果值与我设置的值相同,那么父活动也将完成。 然后,您可以使用递归方法进行进一步的活动。

答案 2 :(得分:12)

您应在父活动

中使用 onActivityResult 方法

假设活动A是活动B的父项。 如果要单击活动B中的后退按钮退出应用程序(也退出活动A)

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

你打电话

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

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

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

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

它对我有用:)

答案 3 :(得分:4)

我没有这样做。这就是我修改代码的方式。

用于输入其他意图的代码:

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

答案 4 :(得分:3)

这些都不适合我。所以我找到了解决方案。帮助清楚地列出了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 :(得分:2)

试试这个

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

答案 6 :(得分:2)

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

现在想关闭这两项活动。

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

B.this.finish();

在活动A中使用此代码:

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

一旦活动B完成,活动A也将完成。

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

缺点是,如果用户在活动B上,他/她按回按钮移动活动A.然后,在这种情况下,活动A也将完成。

答案 7 :(得分:1)

这完美地运作:

btn_back.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {

Player.this.finish();
    }
});

答案 8 :(得分:1)

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

您的活动C将是根活动,然后按下将完成应用。

答案 9 :(得分:1)

从屏幕(B)开始,您想要在没有后屏幕的情况下启动屏幕(C) 使用以下命令启动此屏幕(C):

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

屏幕C中的后面将退出应用程序。

答案 10 :(得分:1)

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

在活动B中,当用户触发活动C时,启动活动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);
}

答案 11 :(得分:1)

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

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

希望,它有所帮助!!

答案 12 :(得分:1)

创建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();
}

希望有帮助!

答案 13 :(得分:0)

让每个活动都听取下一个活动的结果,并在发生这种情况时自行完成。

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

答案 14 :(得分:0)

您可以覆盖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();
    }
    ...
}

如果需要,您也可以专门完成父活动,但使用此方法,您不必担心它。

答案 15 :(得分:0)

以下代码应该为您完成。几乎在所有其他方法中,您的应用将保留在最近的应用中。 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();
                }
            }