安卓开发中,release安装包安装后,打开app后再按home键,再次点击程序图标app再次重新启动的解决办法
在开发中我们一般都是直接AS上的安装(Run)按钮,直接安装到真机或模拟器上进行测试,但是当发布时就要先打包,再拷贝安装。如题目中的描述,这个问题在平时Debug的时候并不存在,只有发布正式版的时候才会出现,(尼玛,隐藏的挺深啊!可坑了我了!)
你还在为开发中频繁切换环境打包而烦恼吗?快来试试 Environment Switcher 吧!使用它可以在app运行时一键切换环境,而且还支持其他贴心小功能,有了它妈妈再也不用担心频繁环境切换了。https://github.com/CodeXiaoMai/EnvironmentSwitcher
开始发现这个问题,我以为是app被系统kill了,但是经过我多次调试与分析,发现当打开app后,再按home键回到桌面时,这时不点击app图标,而是启动任务列表,从任务列表中恢复app,就不会出现这个问题,所以排除了被系统kill的因素。
经过与同事讨论,与上网搜索,终于找到了问题的原因和解决办法。
原因分析:这篇文字分析的比较详细:http://www.cnblogs.com/net168/p/5722752.html
主要原因是:每次启动Intent导致新创建Task的时候,该Task会记录导致其创建的Intent;而如果后续需要有一个新的与创建Intent完全一致(完全一致定位为:启动类,action、category等等全部一样,不可多项也不可缺少),那么该Intent并不会触发Activity的新建启动,而只会将已经存在的对应Task移到前台;这也就是为什么桌面会在再次点击图标时将后台任务挪到前台而不是重新启动App的实现。
解决办法:
在启动页的Activity中的 onCreate()方法做处理
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 避免从桌面启动程序后,会重新实例化入口类的activity if (!this.isTaskRoot()) { // 判断当前activity是不是所在任务栈的根 Intent intent = getIntent(); if (intent != null) { String action = intent.getAction(); if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) { finish(); return; } } } }
如果启动页为SplashActivity,之后finish掉启动MainActivity,解决办法:将MainActivity的launchMode设置为“singleTask”
<activity android:name=".activity.StartActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activity.MainActivity" android:launchMode="singleTask" android:screenOrientation="portrait" />