我正在尝试清除活动历史记录堆栈,当用户点击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()
,一切正常,但我不想保留在堆栈登录屏幕中。
你的建议很有意义。
答案 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;
并在onCreate
内first=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();
}
});