无法使用CLEAR_TOP标志启动市场活动



考虑一下提示用户对市场上的应用程序进行评级的代码片段:

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.

如果有人能解释为什么最初的方法不起作用,或者提供更好的解决方案,我会在一两天内接受这个答案,如果不能,我会接受我的答案。

最新更新