Intent.FLAG_ACTIVITY_CLEAR_TOP不会删除活动堆栈

时间:2013-01-08 06:04:33

标签: android android-intent

我正在开发我希望在按钮点击时关闭整个应用程序的应用程序。我知道在android中我们不应该考虑关闭应用程序,因为android会自动从Is quitting an application frowned upon?执行此操作。但我想关闭我的申请。

所以我正在做什么来关闭应用程序是我使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志来删除活动堆栈。

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

FinishActivity.class的onCreate中,我正在调用this.finish(),但应用程序未关闭,之前的活动将重新打开。

FinishActivity.class

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    this.finish();
}

更新:

这是方案

MainActivity->Activity2->Activity3->FinishActivity

完成活动后,Activity2会在此处打开。

我如何实现这一目标?任何想法和建议将不胜感激。

谢谢&此致

10 个答案:

答案 0 :(得分:31)

试一试。这应该清除你的活动堆栈。

Intent i = new Intent(this,MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

答案 1 :(得分:19)

使用此 -

 Intent intent = new Intent(Activity3.this, FinishActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
 Intent.FLAG_ACTIVITY_NEW_TASK);
 intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
 startActivity(intent);
 finish();

已编辑 - 新答案,可以完美运作..

举一个例子......相应地做你的项目需要 -

我正在服用三个Activity A,B和C类。我在C类活动的视图上应用了一个关闭按钮。如果你想通过后退按钮然后你可以转到上一个活动,当你按下关闭按钮然后你将退出应用程序..看看 -

public class AActivity extends Activity {

  /** Called when the activity is first created. */
  @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent i = new Intent(this, B.class);
    startActivityForResult(i, 1);
}

@Override
protected void onActivityResult(final int requestCode,
        final int resultCode, final Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (resultCode == 5) {
        finish();
    }
}
}

参加下一堂课活动 -

   public class B extends Activity {
    /** Called when the activity is first created. */
   @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.b);

    Intent i = new Intent(this, C.class);
    startActivityForResult(i, 2);
}

@Override
protected void onActivityResult(final int requestCode,
        final int resultCode, final Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (resultCode == 5) {
        setResult(5);
        finish();
    }
}
}

参加上一次活动 -

    public class C extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.c);
}

    // close button..set by xml view..you can set it by button listener.
public void close(View v) {
    setResult(5);
    finish();
}
}

希望它可以解决你的问题......工人!

答案 2 :(得分:18)

这最终在100%的时间里对我有用。我独立尝试了所有标志,从未适用于所有代码实例。使用我想要这个功能的所有标志,大约5个不同的地方,现在它可以工作。

            Intent intent = new Intent(actvSignIn.this, actvNearbyPlaces.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();

答案 3 :(得分:4)

来自Intent.FLAG_ACTIVITY_CLEAR_TOP

的文档
  

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。

为了让它工作,你的FinishActivity必须是你的Activity堆栈中的第一个。在任何其他情况下,此解决方案不会给你任何东西。

您必须执行以下几个步骤来执行此操作:

1)将FinishActivity作为您的启动器活动。

2)不要为其提供任何视图,并直接从Activity回调中首先onCreate启动您的应用:

3)重新定义onRestart回调:

代码示例:

private boolean isNeedToContinue = true;

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
}

@Override
protected void onResume() {
    super.onResume();
    if (isNeedToContinue) {
                    startActivity(new Intent(this,FirstVisibleActivity.class));
                    isNeedToContinue = false;
    } else {
        finish();
    }
}

@Override
protected void onRestart() {
    super.onRestart();
    finish();
    isNeedToContinue = false;
}

我想这就是你所需要的。祝你好运!

答案 4 :(得分:3)

setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

除了在xml的FinishActivity定义中将launchMode设置为“singleTop”之外, 覆盖onNewIntent方法,你可以传递一些额外的信息作为意图的一部分,在onCreate中完成你的活动,根据来自调用活动的一些信号在onNewIntent活动方法中完成它,或者根据你的需要简单地完成它。 也许你的其他活动可能有不同的lauchmodes,这就是为什么他们没有完成。

答案 5 :(得分:1)

这对我有用:

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

答案 6 :(得分:1)

正如其他答案一样,以下内容应该有效。

<div ng-repeat="review in reviews">
    <h1>Review {{ review.title }}</h1>
    <div class="reviewRatings">
        <div ng-repeat="rating in review.rating">
            <p>{{ rating.property }} - {{ rating.value }}<p>
        </div>
    </div>
</div>

对于API级别&lt; 11,Intent intent = new Intent(Activity3.this, FinishActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 不可用。相反,我使用了支持库中的Intent.FLAG_ACTIVITY_CLEAR_TASK

请参阅IntentCompat

可能会帮助某人绊倒。

答案 7 :(得分:0)

尝试这样一来这对我有用:

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

代替你的代码

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

答案 8 :(得分:0)

试试这个:

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

答案 9 :(得分:0)

您还可以在上一个活动中使用finishAffinity()函数,例如:

finishAffinity()
startHomeActivity()

希望它会有用。