21

我正在开发应用程序,我想在单击按钮时关闭整个应用程序。我知道在 android 中我们不应该考虑关闭应用程序,因为 android 会自动执行此操作退出应用程序是否令人不悦?. 但我想关闭我的应用程序。

所以我要关闭应用程序是我正在使用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是在完成活动后打开的。

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

感谢和问候

4

10 回答 10

35

试试这个。这应该清除您的活动堆栈。

Intent i = new Intent(this,MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
于 2013-01-08T06:15:00.050 回答
27

这终于在 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();
于 2016-02-11T00:12:31.157 回答
20

用这个 -

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

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

只是举个例子......根据您的项目需要做它 -

我正在参加三个ActivityA、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();
}
}

希望它能解决您的问题..干杯!

于 2013-01-08T06:10:57.210 回答
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;
}

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

于 2013-01-08T06:09:53.760 回答
3

setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TOP);

除了在xml中的FinishActivity定义中将launchMode设置为“singleTop”,覆盖onNewIntent方法,您可以传递一些附加信息作为intent的一部分,在onCreate中完成您的活动,根据调用的一些信号在onNewIntent方法中完成它活动或根据您的需要简单地完成它。您的其他活动可能有不同的启动模式,这就是它们没有完成的原因。

于 2013-01-08T06:26:05.593 回答
1

由于其他答案有以下应该工作。

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

对于 API 级别 < 11,Intent.FLAG_ACTIVITY_CLEAR_TASK不可用。相反,我IntentCompat.FLAG_ACTIVITY_CLEAR_TASK从支持库中使用。

IntentCompat

可能会帮助绊倒的人。

于 2017-05-23T11:11:38.100 回答
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();
于 2013-01-08T06:06:42.540 回答
0

试试这个:

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
于 2013-01-08T06:11:40.533 回答
0

这对我有用:

Intent intent = new Intent(Activity3.this, FinishActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
于 2015-11-17T19:35:40.407 回答
-1

您也可以在最后一个活动中使用finishAffinity()功能,例如:

finishAffinity()
startHomeActivity()

希望它会有用。

于 2018-11-22T16:45:09.280 回答