25

应用程序看起来像这样:MainActivity -> UserActivity -> DetailsActivity。(活动的大致顺序)。

我想在 DetailsActivity(行中的第三个活动)中单击后退按钮时关闭应用程序。

想知道这样做是否是一种好习惯以及最好的方法是什么?

4

14 回答 14

35

如果我理解正确,即使堆栈不为空,您也想关闭活动,这意味着堆栈中有超过 1 个活动?

好吧,如果只有一个......只是:

finish();

否则诀窍是:

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

在同一活动中onCreate

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

因此,您清除堆栈,然后杀死剩下的一个……您可以在任何活动中执行此操作,当然还可以在onBackPressed:)中使用它

于 2013-10-01T06:40:12.820 回答
20

您可以通过覆盖后退按钮事件以在特定条件下不添加特定活动的历史记录来实现这一点。

@Override
public void onBackPressed()
{
    if ( ! getIntent().getExtras().getBoolean(FROM_SETTINGS_KEY))
        moveTaskToBack(true); // exist app
    else
        finish();
}

在我的示例中,它检查我启动活动的位置的标志,如果从设置启动则正常运行,否则将其置于顶部并在后按时退出应用程序

于 2013-10-01T06:43:35.640 回答
7

试试这个。

 quitBtn.setOnClickListener(new View.OnClickListener() {         
    @Override
    public void onClick(View paramView) 
  {
        finish();          
        moveTaskToBack(true);
    }
});
于 2014-09-06T10:00:34.647 回答
6

试试这个,noHistory在你的 mainifest 文件中添加每一个活动。

android:noHistory="true"
于 2013-10-01T06:37:51.467 回答
4

当您从 MainActivity 启动 UserActivity 时,将 finish() 放在 startActivity() 之后。启动 DetailsActivity 时在 UserActivity 中执行相同操作

于 2013-10-01T06:41:49.507 回答
4

在您当前的活动中:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        Intent intent = new Intent(CurrentActivity.this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("EXIT", true);
        startActivity(intent);
    }
    return super.onKeyDown(keyCode, event);
}

MainActivity OnCreate 内部:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
    return;
}
于 2014-02-20T19:47:14.903 回答
2

这对我有用:

public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
于 2015-10-29T21:27:11.513 回答
1

1) 在项目中创建一个名为 Constants.java 的文件

2)将此代码添加到该文件

    public static void killAll() {

    for (Activity act : Constants.activity_stack) {
        act.finish();
    }
    Constants.activity_stack.clear();

}

3)现在,当您在 onCreate() 的主要活动中添加以下代码段

        // add to stack
    Constants.activity_stack.add(this);

4)类似的将用户活动添加到堆栈中

5) 在 onBackPressed() 的 Delivery Details 中使用下面的代码片段

Constants.killAll();//will kill all the activities and bring you out of the application.
于 2013-10-01T06:43:18.680 回答
1

这是一个完整的类,它显示了当第一个活动中的按钮被按下时如何调用另一个活动。

public class FirstActivity extends Activity implements View.OnClickListener {

    Button goToSecondActivityButton;

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

        setContentView(R.layout.first_activity);

        ((TextView) findViewById(R.id.textRecommendationMessage)).setText("This is the first activity");

        goToSecondActivityButton= (Button) findViewById(R.id.button_go_to_second_activity);
        goToSecondActivityButton.setOnClickListener(this);
    }

     @Override
     public void onClick(View view) {

         goToSecondActivity();
    }

    private void goToSecondActivity() {

        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
        finish();
    }
}
于 2014-04-23T07:10:56.317 回答
1

如果您从 MainActivity 调用 UserActivity,则在 startActivity() 之后调用 finish()。下面是代码:

Intent userActivity = new Intent(MainActivity.this, UserActivity.class);
       userActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
       MainActivity.this.startActivity(userActivity );
       finish();
于 2017-10-05T11:03:10.977 回答
0

关于你的活动

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

public void onBackPressed(){
    Intent a = new Intent(Qeydiyyat.this,Login.class);
    a.addCategory(Intent.CATEGORY_HOME);
    a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(a);
于 2019-04-13T17:37:35.380 回答
0
   public void onBackPressed() {
    moveTaskToBack(true);

}
于 2020-08-06T06:32:35.683 回答
0

可能有更多的方法可以实现这一点,但这里有两种对我有用的方法。一种方法是将任务移回堆栈。

    override fun onBackPressed() {
        moveTaskToBack(true);
    }

另一种方法是:

    override fun onBackPressed() {
        val activityToMove = Intent(Intent.ACTION_MAIN)
        activityToMove.addCategory(Intent.CATEGORY_HOME) //Indicate the next activity
        activityToMove.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        startActivity(activityToMove)
    }
于 2021-09-12T03:44:34.903 回答
0

在DetailedActivity中使用onBackPressed()方法

  override fun onBackPressed(){ //trigger when user press back button
      super.onBackPressed()
      finishAffinity()  //This will close all acitivities
    }
于 2021-09-12T04:15:15.823 回答