首先在这里提一下,该问题的重现步骤:从应用市场下载好app包->点击包,开始安装->安装成功后,会有一个弹出对话框,其有两个按钮:完成和打开。
接下来用户可能的操作有3种:
第一种,点击“打开”按钮(大部分用户安装完之后就会立即选择打开应用),此种方式打开应用的Intent的flag为Intent.FLAG_ACTIVITY_NEW_TASK;假设应用的主入口Activity为LoginActivity,如果此时用户通过点击事件(一般情况下是)或者其他方式(无所谓)进入到MainActivity(第二个界面,或者随便哪个界面),此时点击“home”键,让应用程序回到Launcher界面;再通过点击Launcher界面上面的应用Icon打开应用(此时打开应用的Intent的Flag有三个:Intent.FLAG_ACTIVITY_NEW_TASK,Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,Intent.FLAG_ACTIVITY
_BROUGHT_TO_FRONT),按照咱们的期望,此时显示的界面应该是MainActivity,但事实上不是这样的,此时显示的是LoginActivity。出现这种问题的原因就是上面标红部分,也就是说,通过不同方式打开应用,系统所发出的打开该应用的Intent的flag也是不一样的。特别注意,这里再次强调一下复现步骤:Android Installer安装完成应用,并点击“打开”->进入LoginActivity(你程序的主入口)->MainActivity(主入口之后的界面)->点击Home键->在Launcher界面点击应用icon启动应用,大家可以注意到,这一些列操作中自始至终没有退出应用的操作(如果退出过应用,你就复现不出来了)。这里介绍一下不同方式启动应用对应的Intent的flag:
安装成功后首次打开应用: 启动应用的intent的flag为Intent.FLAG_ACTIVITY_NEW_TASK
从Launcer界面非首次启动应用:启动应用的intent的flag为Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,这是一个组合的Flag(亲测的!)
所以针对此种问题,监测 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT即可,可以这样做:
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
//把该代码放在程序主入口的onCreate中
finish();
return;
}
第二种,点击“完成”,此种方式打开应用的Intent的flag为Intent.FLAG_ACTIVITY_NEW_TASK
第三种,点击home键,从Launcher启动应用此种方式打开应用的Intent的flag为Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
相关文章:http://stackoverflow.com/questions/29875772/unknown-intent-flag-on-launcher-activity
http://stackoverflow.com/questions/6356467/activity-stack-ordering-problem-when-launching-application-from-android-app-inst