31

我用谷歌搜索它,但即使我在下面运行这段代码,它也没有完成其他活动。

ButtonClick.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            LoginManager.getInstance().ctrl = false;
            UserManager.getInstance().loginControl();
            OrderManager.getInstance().orderCtrl = false;
            Intent intent = new Intent(OrderComplete.this,
                    MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            startActivity(intent);
            finish();
        }
    });
}
4

9 回答 9

29

要从堆栈中清除顶部活动,请使用以下代码

Intent intents = new Intent(A.this, B.class);
intents.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TOP
            | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intents);
finish();

它将从堆栈中删除所有活动,无论是异步任务运行还是未在应用程序中运行。

它工作正常,也是一个很好的方法

于 2014-08-06T11:28:18.180 回答
10

当您从一项活动转到另一项活动时调用完成();

这样做

public void onClick(View v) {
  Intent i = new Intent(A.this,B.class);

  i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  startActivity(i);
  finish(); // to end the current activity
 }

在 startactivity(...) 之后调用 finish(),以便将 A 活动从堆栈中删除。当您按下后退按钮时,堆栈中将不存在活动。

于 2013-08-26T10:54:06.960 回答
8

更新请参考其他答案,我无法删除答案,因为它被标记为已接受

根据我们在评论中的讨论

您的给定代码很好!

Q1。为什么它没有完成所有的活动?

答。我想All Activities Are Finished Except Activities谁已经Thread or AysncTask在后台运行或尚未完成!

Q2。我怎样才能完成它们?

答。确保你的线程应该完成!或You can Try Timeout etc


额外的

Pass String with Your Intent 

为此添加代码

intent.putExtra("finishingallact", "yes");

内部第一个活动(未完成)

尝试 Object of Remaining Activities完成它们!

所以试试代码

if(getIntent().getStringExtra("finishingallact")!=null)
{
 if(getIntent().getStringExtra("finishingallact").toLowerCase().equals("yes"))
  {
    yourRemainingAct act1=new yourRemainingAct();
    act1.finish();
    // Try Same For ALl Remaining Activities 
  }
}
于 2013-08-26T11:45:13.500 回答
6

只需从堆栈中删除除第一个活动外的所有活动

youractivity.this.finish();

或者您可以使用 Activity Single 顶部。为此,您可以使用:

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
于 2013-08-26T11:10:21.530 回答
6

试试这个它对我很好

// clear whole activity stack

    Intent intent = new Intent("clearStackActivity");
    intent.setType("text/plain");
    sendBroadcast(intent);

// start your new activity
Intent intent = new Intent(OrderComplete.this,
                    MainActivity.class);
startActivity(intent);

更新

对不起,我忘了给这些台词。将这些行放在所有活动的 onCreate() 方法中,或者如果你有任何基本活动,你可以把它放在那里,那么不需要放入所有活动。

private KillReceiver clearActivityStack;
clearActivityStack = new KillReceiver();
        registerReceiver(clearActivityStack, IntentFilter.create("clearStackActivity", "text/plain"));

更新

很抱歉忘记了另外一件事,把这门课放在你的基础活动中

private final class KillReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    }
于 2013-08-26T10:58:51.247 回答
4

要在打开新活动时删除所有活动,请执行以下操作

  Intent intent = new Intent(getApplicationContext(), NewAcivity.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);
于 2016-11-15T09:59:55.140 回答
3

我们可以用 :

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  startActivity(i);
于 2014-11-29T10:30:08.233 回答
0

1.如果我们的类中没有异步任务类或线程,那么只需

i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

编写此代码,可以轻松从堆栈中删除所有活动

2.这也可以通过将启动器活动作为单个任务 来完成,这可以通过更改清单文件来完成。作为

android:launchMode="singleTask" 

3.但是如果我们的应用程序中有异步任务并且还使用线程,那么上述两种方法都会失败..

为此,我们必须一一完成活动

例如。我们有四个活动 A、B、C、D,每个类都有异步任务

我们必须从 A -> B-> C-> D

从 D 我们又回到了* “A”,按下设备的返回按钮后,应用程序应该完成或者可以说退出*

为此,我们必须为所有类的活动制作静态对象。喜欢

 **In class A**
     public static Avtivity mactivity;
     @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_third);
            mactivity=this;
             }

在所有 B、C 类中执行此操作

然后在 D

通过按下按钮完成所有类的对象 Like

**mButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) 
        {
            B mB=new B();
            mB.mactivity.finish();
                   //////do this for all class which are present in stack of activities
                            finish();
                            ////this will finish the D class and we reach at A class
                    }
                  });**

那就是解决...

我知道这不是一种好方法,但也不是坏方法……主要是它的工作原理:)

于 2014-02-01T06:43:13.283 回答
0

从清单中删除 android:lanchMode="singleTop" 并使用 setFlagintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

于 2013-08-26T10:53:40.957 回答