在我的菜单中,我有一些项目。 Home是我希望成为我的应用程序的根目录的项目,每当用户点击它时,Android清除堆栈然后返回主屏幕。
这是我的代码:
menu.setOnItemClickedListener(new MenuClickedListener() {
public void eventOccured(int id) {
Intent intent = null;
switch(id) {
case 1: intent = new Intent(context, More.class); break;
case 2: intent = new Intent(context, FavoriteScreen.class); break;
case 3: intent = new Intent(context, VideoShowList.class); break;
case 4: intent = new Intent(context, ShoppingList.class); break;
case 5: intent = new Intent(context, MainScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
break;
}
if(intent != null)
context.startActivity(intent);
}
});
菜单工作正常,但似乎标志不起作用,因为从主屏幕,我去第二和第三屏幕然后我点击菜单的主页项目,并回到主屏幕。现在,当我点击后退按钮时,我会转到第三个屏幕,第二个屏幕和主屏幕。
我将此菜单设计为小部件,以便将其设置一次并在我的所有屏幕上重复使用。
任何建议将不胜感激。感谢。
答案 0 :(得分:20)
我试过 Intent.FLAG_ACTIVITY_CLEAR_TOP 但是没有得到合适的解决方案所以最终这对我有所帮助
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
清除所有堆栈并仅运行 LoginActivity
答案 1 :(得分:18)
阅读一次,你将永远不会遇到使用flag_activity_clear_top的问题
以下是关于 Flag_Activity_Clear_Top的使用的简单说明。
正确使用的一个班轮公式:
它总是清除调用活动和被调用活动之间的中间活动(如果有的话)。
这是一个活动流程:
活动A - >活动B - >活动C(使用标志活动清除顶部转到D) - >活动D
在上述序列中,如果我们按下则到达D,那么我们将得到活动C->活动B->活动A , ,因为活动C和活动D之间没有中间活动
这里的一些开发者的神话是 -
通过使用来自C的标记活动清除顶部达到活动D后,他们期望在按下来自D的后退键时将它们带到应用程序之外。将永远不会发生。
Flag_Activity_Clear_Top始终清除两个活动之间的中间活动
答案 2 :(得分:7)
尝试使用此intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
取代intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Intent intent = new Intent(getApplicationContext(),
yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
答案 3 :(得分:1)
如果要将Activity作为唯一存在的活动(即清除整个backstack ),请使用以下标志:
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
需要API级别> = 11.
答案 4 :(得分:1)
我遇到了同样的问题,我的问题是intent中的活动有launchMode =“singleInstance”。改为singleTask,代码工作正常。
答案 5 :(得分:-2)
也许这有效:
intent = new Intent(getApplicationContext(), MainScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);