考虑一下提示用户对市场上的应用程序进行评级的代码片段:
private void backToMainActivity() {
Intent i = new Intent(mActivity, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mActivity.startActivity(i);
mActivity.finish();
}
...
if (mRateToast.leftClicked(x, y)) {
setRate(true);
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + GameGlobals.PACKAGE_NAME));
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivity(i);
backToMainActivity();
} else if (mRateToast.rightClicked(x, y)) {
setRate(false);
backToMainActivity();
}
这样做的目的是检测按下了什么按钮(Rate或Later),相应地设置标志,并在需要时运行市场应用程序。无论按下哪个按钮,我都想返回主菜单(这是一个游戏活动,距离主菜单活动有1个活动)。
在Android 4.1上,这很好——市场会打开应用程序的页面,从市场返回后,我会出现在主菜单上。在android上<=2.3,市场没有开门,我只是直接回到主菜单。但是,如果我在backToMainActivity
方法中注释i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
,它确实会打开。不过,这会导致其他问题,例如后退按钮会返回到错误的活动,而不是退出应用程序,因此这不是一个解决方案。
我如何运行市场,返回主菜单并使主菜单活动位于活动堆栈的顶部?
注意:我还没有尝试过,但删除finish
也不是一个真正的选项。我的游戏活动也可以由外部应用程序直接启动,在这种情况下,如果我删除finish
调用,由于某种原因CLEAR_TOP
将不起作用,按下主菜单活动上的后退按钮将返回游戏活动,而不是退出应用程序。
尝试这个
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + GameGlobals.PACKAGE_NAME));
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivityForResult(i,1552);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1552){
backToMainActivity();
}
}
我通过删除Intent.FLAG_ACTIVITY_NEW_TASK
并使用startActivityForResult
解决了这个问题,正如MoshErsan在他的回答中所描述的那样。显然,作为一项新任务启动市场并不能很好地发挥CLEAR_TOP
在android中的作用<=2.3.
如果有人能解释为什么最初的方法不起作用,或者提供更好的解决方案,我会在一两天内接受这个答案,如果不能,我会接受我的答案。