在Android中完成后退栈中的活动

5
在我的应用程序中,我有A、B、C、D和E等活动。第一个活动是A,然后打开B,然后是C和D。现在我的返回栈为A-B-C-D。当我从D移动到E时,我希望结束返回栈中的所有活动,现在E应该是堆栈中的第一个活动。
在我的情况下
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

或者

android:launchMode="singleTask"

这段代码无法正常工作,因为我没有重新打开已经打开的活动。在打开新的活动时,我需要关闭后退堆栈中的所有活动。

请帮我解决这个问题。


请查看我的回答,如果您有任何疑问,请随时向我提问。 - Satyaki Mukherjee
7个回答

1
设置以下标志:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TASK);

FLAG_ACTIVITY_CLEAR_TASK 从api 11开始提供。


谢谢!我的应用程序 android:minSdkVersion="4"。还有其他方法吗? - Sniper

0

使用下面的finish()。例如:如果你想从D而不是C移动到B,则使用finish()。对于其他情况,请保持原样或者你也可以在manifest中使用android:noHistory="true"

Intent i=new Intent(C.this,D.class);
startActivity(i);
finish(); 

如果你从D返回,C活动不会被替换。它会跳到B活动,除非你没有使用finish(); 如果你在B中声明了finish(),那么就会跳到A活动。同样的,你也可以这样做。或者你也可以使用android:noHistory="true"

在Android中启动活动并清除顶部


我的应用程序是这样设计的,用户可以编辑他在前四个页面A-B-C-D中提供的信息。因此,在打开下一个活动时,我不应该结束每个活动。一旦他在D活动中确认,我就必须关闭所有先前的活动。 - Sniper

0

ActivityE中使用以下代码... 不要使用Intent.FLAG_ACTIVITY_NEW_TASK

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

0

可以做到。

While moving from A -> B, finish() A, and move to B.
While moving from B -> C, finish() B, and move to C.
While moving from C -> D, finish() C, and move to D.
While moving from D -> E, just move to E. (dont finish activity D)

这样,D 将会是栈中第一个活动。


0

试试这个

 Intent i = new Intent(CurrentActivity.this,NextActivity.class);
    // Closing all the Activities
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
   // Add new Flag to start new Activity
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   // Staring NewActivity
    startActivity(i);
    finish();

在清单文件中使用 android:noHistory="true"

0

在跳转到活动 E 时不要结束你的活动 D。 这意味着删除你的标记行 Intent.FLAG_ACTIVITY_NEW_TASK

仅写入

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

并在您的清单文件中添加代码android:noHistory="true"


0

最终答案已编辑

ActivitA 重要

    import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;

import android.view.View;
import android.widget.Button;


public class ActivityA extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        if (getIntent().getBooleanExtra("EXIT", false)) {
            startActivity(new Intent(ActivityA.this,ActivityE.class));
            finish();
        }  

        setContentView(R.layout.alayout);

        Button play;

        play = (Button) findViewById(R.id.aId);     

        play.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            startActivity(new Intent(ActivityA.this,ActivityB.class));

        }

        });


    }

}

活动B

    import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;

import android.view.View;
import android.widget.Button;


public class ActivityB extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        if (getIntent().getBooleanExtra("EXIT", false)) {
            finish();
        }  

        setContentView(R.layout.blayout);

        Button play;

        play = (Button) findViewById(R.id.bId);     

        play.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            startActivity(new Intent(ActivityB.this,ActivityC.class));

        }

        });


    }

}

ActivityC

import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;

import android.view.View;
import android.widget.Button;


public class ActivityC extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        if (getIntent().getBooleanExtra("EXIT", false)) {
            finish();
        }  

        setContentView(R.layout.clayout);

        Button play;

        play = (Button) findViewById(R.id.cId);     

        play.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            startActivity(new Intent(ActivityC.this,ActivityD.class));

        }

        });


    }

}

ActivityD 重要

import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;

import android.view.View;
import android.widget.Button;


public class ActivityD extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        if (getIntent().getBooleanExtra("EXIT", false)) {
            finish();
        }  

        setContentView(R.layout.dlayout);

        Button play;

        play = (Button) findViewById(R.id.dId);     

        play.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            Intent intent = new Intent(getApplicationContext(),ActivityA.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
              intent.putExtra("EXIT", true);
               startActivity(intent);

               finish();

        }

        });


    }

}

ActivityE

import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;

import android.view.View;
import android.widget.Button;


public class ActivityE extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        if (getIntent().getBooleanExtra("EXIT", false)) {
            finish();
        }  

        setContentView(R.layout.elayout);

        Button play;

        play = (Button) findViewById(R.id.eId);     

        play.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            //startActivity(new Intent(ActivityE.this,ActivityE.class));

        }

        });


    }

}

只需这样做


让我们有一个活动堆栈A-B-C-D。现在我需要打开E并且还需要完成A、B、C、D。请告诉我应该把它们放在哪里。 - Sniper
你想先做A、B、C、D,然后再做E,对吗? - Satyaki Mukherjee
请尽快回复,因为我将在15分钟内注销登录。 - Satyaki Mukherjee
是的,我必须在进行 E 之前完成 A-B-C-D。 - Sniper
你是否需要在去E之前先从B到A或从D到C或从C到B?那么有一个最简单的解决方案:在去任何活动之前,先完成A的finish(),然后在去B到C之前完成B的finish(),以此类推......如果还有其他问题,请尽快让我知道。 - Satyaki Mukherjee
我的应用程序是这样设计的,用户可以编辑他在前四个页面A-B-C-D中提供的信息。因此,在打开下一个活动时,我不应该结束每个活动。一旦他在D活动中确认,我就必须关闭所有先前的活动。 - Sniper

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