有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图在安卓中退出。堆栈未正确清除

我花了好几个小时想清楚为什么栈顶还没有清理干净

我尝试了以下方法:

    Intent intent = new Intent(ActionBarActivity.this, MainActivity.class);

    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    startActivity(intent);

这让我想到了MainActivity。然后,当我试图按下后退按钮时,程序不会退出,而是将我转到ActionBarActivity的第一页

让我更具体地说:

MainActivity中,我调用ActionBarActivity。在ActionBarActivity中,我有一个搜索栏,我在那里输入一个查询,然后只打印查询的值

如果您认为它将如何工作,请参阅以下内容:

MainActivity->ActionBarActivity1->ActionBarActivity2->ActionBarActivity3->

在这个{}中,我还有一个选项,它让我回到{}

所以,正如我在以上述方式运行应用程序时所说的,它将把我带到MainActivity

到目前为止还不错,但当我按下后退按钮时,我希望它会退出,但它会转到ActionBarActivity1。我怀疑堆栈没有被正确擦除

在这种情况下我该怎么办。谢谢


共 (2) 个答案

  1. # 1 楼答案

    我假设你看过这篇帖子:Android: Clear the back stack这不是你想要的

    标志_ACTIVITY_NEW_TASK正在创建一个新的任务堆栈。当你点击“back”时,这是该堆栈中唯一的活动,所以Android会转到上一个任务,其中调用活动位于顶部

    如果删除该标志,则MainActivity已在任务堆栈中,并被置于顶部。“后退”会将其移除,并将您带回通话活动。到目前为止,这是Android的预期行为

    编辑:既然您评论说您只有两个活动,那么一个选项是在启动MainActivity之后执行“finish()”ActionBarActivity,如下所示:

    startActivity(intentMainActivity);
    finish();            
    

    要在许多活动中或仅在某些情况下获得所需的行为,需要使用SET_RESULT并在点击按钮转到MainActivity时完成堆栈中的活动。换句话说,安卓系统假设你想要保持活动,即使新的活动开始了。但在这种情况下,你没有,所以你必须告诉这个活动去摧毁它自己

    也就是说,调用setResult(完成),然后使用startActivityForResult,并在onActivityResult方法中检查“完成”标志

    然后这个:

        MainActivity -> ActionBarActivity1 -> ActionBarActivity2 -> ActionBarActivity3 
    -> MainActivity
    

    变成:

        MainActivity -> ActionBarActivity1 -> ActionBarActivity2 -> ActionBarActivity3 
    -> call "Done"
        Destroy ActionBarActivity3
        Destroy ActionBarActivity2
        Destroy ActionBarActivity1
        MainActivity remains
    

    例如,在ActionBarActivity2中:

    startActivityForResult(intentActionBarActivity3, ActionBarActivity2_ID);            
    

    然后在ActionBarActivity3中:

    public void exitButton(View view) {
        setResult(MY_DONE_FLAG);
        finish();
    }
    

    回到ActionBarActivity2:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == ActionBarActivity2_ID && resultCode == MY_DONE_FLAG) {
            setResult(MY_DONE_FLAG, data);
            finish();
        }
    }
    

    等等,当按下按钮时,所有你想“关闭”的活动

  2. # 2 楼答案

    试试看

                      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    
                      finish();
    

    插入

                      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    

    你也应该把它用在每一个让你行动起来的意图上。 我的意思是,如果你要从ActionBarActivity 1回到ActionBarActivity,那么你会有目的地使用它。 然后在所谓的ActionBarActivity中为MainActivity创建意图

    Intent intent = new Intent(ActionBarActivity.this, MainActivity.class);
    
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    
    startActivity(intent);
    
    finish();
    

    祝你好运