我是Android应用开发的初学者。我开发了一个有5个活动的应用程序:(即活动 - MainActivity, B, C, D, E
)。
当用户打开应用时,MainActivity
将激活并接收用户的输入。点击按钮后,用户将转到Activity B
。
Activity B
中有3个按钮,用户可以进行3种不同的活动:
(即button-1 - > Activity C
,button-2 - > Activity D
,Button-3 - > Activity E
)。
进入这3个活动中的任何一个(即C
,D
,E
)后,按下后退按钮,用户将被带回活动B.并以任何活动为准用户来自的C
,D
,E
将完成。
如果在这3个活动中显示任何“警告”对话框,则在单击对话框中的"OK"
后,将直接将用户带回MainActivity
以获取用户的新输入。并且循环再次继续。如果用户在Activity B
处于活动状态时按下按钮,则用户将被带到MainActivity
。
当用户在MainActivity
中按下后退按钮时,会出现一个对话框,询问用户是否要退出该应用。点击"是"应用程序应完成所有活动并关闭应用程序。
但是当用户点击"yes"
MainActivity正在完成但Activity B
再次出现在最佳状态时,会发生什么。因为它在堆栈中,并且在Activity B
上按下后退按钮会将用户带到MainActivity
。用户多次通过Activity B
向后导航,当用户点击对话框中的"Yes"
时,活动B会多次出现。
我不知道如何通过完成活动来关闭应用程序而不影响活动之间的导航,因为这些活动之间也存在数据流(主要是Activity B
)。我已尝试使用Intent.FLAG_ACTIVITY_CLEAR_TASK
,Intent.FLAG_ACTIVITY_CLEAR_TOP
,但它没有用。活动B仍在进行中。
请在不中断导航或数据流的情况下帮助我解决此问题。
提前感谢。
编辑:
@Override public void onBackPressed() {
new AlertDialog.Builder(this).setMessage("Are you sure, you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
})
.setNegativeButton("No", null)
.show();
}
答案 0 :(得分:1)
当你点击活动C,D,E中的OK
,这意味着在跳过main activity
时带你到Activity B
,那么你应该指定标志
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
我认为这应该有用。
如果这实际上不起作用(我会感到惊讶),可能的替代方法是在活动startActivityForResult()
中使用B
,您要为其编写结果处理
Intent intent = new Intent(this, ActivityC.class);
startActivityForResult(intent, 1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1 && resultCode == 1) {
this.finish();
}
}
在活动C中,单击“确定”按钮;
this.setResult(1);
finish();
答案 1 :(得分:0)
您可以使用:
Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP
。
(例如)
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
清除所有先前的活动并开始新的活动。
并检查当前的exit=true
finish()
。
您还可以在Manifest.xml中的活动标记中使用 android:noHistory="true"
注意:这将保留历史记录,这意味着在您打开另一个活动后,前一个活动将被杀死。
答案 2 :(得分:0)
如果要清除所有活动,可以使用finishAffinity()
如果你的目标是16和16+。低于16个标志
Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP
可以使用。
无论任务堆栈中有多少活动,finishAffinity()
都将完成所有活动。
如果你不希望Activity
可见,如果你从另一个Activity
回来,你可以在你开始另一个时完成它。