清除活动历史堆栈

时间:2013-01-05 07:27:50

标签: android android-activity

我正在尝试清除活动历史记录堆栈,当用户点击logout button时,甚至尝试使用IntentFlag Intent.FLAG_ACTIVITY_NO_HISTORY但没有运气。看看我下面提到的场景。

1)登录界面(致电完成)

2)第一个屏幕(不叫完成)

3)第二个屏幕(不叫完成)

4)第三个屏幕(不叫完成)

5)退出屏幕(它将打开登录屏幕,并完成)

使用以下代码实现我的目标,

登录屏幕

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,FirstActivity.class);
                startActivity(intent);
                finish();

            }
        });

登录回事件

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        if (getIntent().getBooleanExtra("EXIT", false)) {
            this.finish();
        }else{
            this.finish();
        }
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

第一个屏幕

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);

            }
        });

第二个屏幕

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
                startActivity(intent);

            }
        });

第三个屏幕

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent=new Intent(ThirdActivity.this,MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("EXIT", true);
                startActivity(intent);
                finish();

            }
        });

问题是,当我点击退出时,它会进入登录活动,当我点击后退按钮时,它会转到第二个活动。

为什么它没有完成活动以及为什么它会转到second activity如果它保持堆栈然后它应该转到first activity而不是第二个当我从login screen点击回来时,不要我知道我错过了什么样的东西。

更新

如果我在登录屏幕上调用intent时删除finish(),一切正常,但我不想保留在堆栈登录屏幕中。

你的建议很有意义。

4 个答案:

答案 0 :(得分:4)

你可以为这个问题做一个技巧。我已经使用它并且可以和我一起使用。

在您的ThirdActivity内部编写代码行

btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent=new Intent(ThirdActivity.this,FirstActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("GO", false);
            startActivity(intent);
            finish();

        }
    });

OnCreate of FirstActivity Class中写下以下代码之后:

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

        // Getting the Value of GO
        GO = getIntent().getExtras().getBoolean("GO");

             if(GO){
        setContentView(R.layout.form_data);
            ...
            // Here your Code for this Activity 
            ...
            }else{
            Intent intent=new Intent(FirstActivity.this,MainActivity.class);
            startActivity(intent);
           finish();
           }
}

同时从MainActivity调用FirstActivity时将GO的额外值设为true

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,FirstActivity.class);
                 intent.putExtra("GO", true);
                startActivity(intent);
                finish();

            }
        });

希望它能解决你的问题。

答案 1 :(得分:3)

将意图展平intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);更改为intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);并尝试。我希望它能起作用并帮助你。

Clear Top仅在您调用的Activity位于BackStack中时才有效。由于LoginActivity不在BackStack中,因此不会清除活动。

android:noHistory="true"中为LoginActivity添加AndroidManifest.xml并尝试。在看到更新后的问题后,我会提供此更新。

答案 2 :(得分:0)

Third screen

btn.setOnClickListener(new OnClickListener()
   {

        @Override
        public void onClick(View v) 
        {
            Intent intent=new Intent(ThirdActivity.this,MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_TASK_ON_HOME);          
            intent.putExtra("EXIT", true);
            startActivity(intent);
            finish();

        }
    });

答案 3 :(得分:-1)

最后我得到了一个解决方案,无论如何!它实现了我的目标,在自己的活动中创建活动的静态对象,并且在所有活动注销object.finish()时,它工作正常。

以下是实现目标的诀窍

在第一个活动中声明public static FirstActivity first;并在onCreatefirst=this;同意我为其他活动做的事情,同时注销,就像下面这样。

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent intent = new Intent(ThirdActivity.this,
                        MainActivity.class);
                FirstActivity.first.finish();
                SecondActivity.second.finish();

                startActivity(intent);
                finish();

            }
        });