-退出-
function exit_1:
Intent intent = new Intent(MainAct.this,StartAct.class);//跳转到root activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清除root activity之上的所有activity
intent.putExtra(StartAct.FLAG, StartAct.FLAG_EXIT);//带过去一个标志,在root activity中接收到这个标志时,就finish掉root activity
startActivity(intent);
function exit_2:
moveTaskToBack(boolean nonRoot);//当nonRoot=flase时,如果当前activity不是root activity,则无任何效果
function exit_3:
finishAndRemoveTask();//从SDK21才有这个方法。
两者异同:
都可以保留进程。
exit_1,Task中没有activity了,在recent task中会显示黑屏截图,再次启动应用会从root activity开始启动。
exit_2,Task中保留activity,在recent task中会显示栈顶activity截图,再次启动应用会把Task移到前台。
从体验上来说,exit_2更好一点,再次启动速度更快。但也意味着占用更多资源。不过支付宝、QQ什么的貌似都这么做。
-启动-
这里主要涉及到“初始化操作放在哪里”、“如何保存全局变量”、“APP在后台被回收后再次启动”三个问题。
function launch_1:
初始化操作放在自定义Application的onCreate方法中。
这样做带来的问题是,随着项目增长,引入的第三方库越来越多,一般第三方库都会要求在Application的onCreate方法中初始化,当初始化操作比较耗时的时候,每次启动都会黑屏一段时间,这实际上是Application的onCreate方法正在执行,root activity的onReusme还未执行造成的。
为了减少黑屏时间,尝试function launch_2:
放在root activity的onCreate方法中,所谓启动页。一般来说,全局变量都由初始化操作赋值。全局变量保存在Application中,而初始化操作在root activity的onCreate方法中。当用户按HOME键或采用exit_2退出时,Task会移动到后台。当Task因内存紧张而被系统回收时,全局变量也被回收且没有默认的保存方法。
当再次启动APP时,注意这里有一个天坑!!!
如果在Manifests文件中设置application标签
android:theme="@android:style/Theme.Translucent.XXXX"
那么会恢复重建原来所有的Activity,重建次序是从栈顶数第二个Activity到root activity,最后是栈顶的Activity。
如果设置
android:theme="@android:style/Theme.Black.XXXX"
那么会只重建原来栈顶的Activity,当按下Back键,从栈顶数第二个Activity被推到栈顶,这个Activity才会重建。
也就是说,为了给全局变量重新赋值(不然就NullPoint了),必须设置成Translucent。
然后换一种思路,尝试function launch_3:
当Task在后台被回收后,再次启动==重启APP。
为了达到这一目的,需要这样做:
设置一个标志代表全局变量的状态,如果全局变量是未经过初始化的,那么除了root activity外所有activity都不应该被建立,如果系统想恢复它们,我们就主动finish掉。最后Task中只剩root activity没有被finish,正常执行完onCreate后跳转到新建的main activity。看起来就像重启一样。
这样做的问题是,finish只有等onCreate方法执行完才会起作用,所以如果在onCreate方法中调用finish之后读取全局变量,仍然会报NullPoint。另外,如果有用到Fragment,事情就变得异常复杂了。
尝试持久化处理,function launch_4:
对全局变量持久化处理,或者在new的时候赋初始值。
这样做的问题是:持久化处理会留下脏数据;初始值不是异步更新的最新数据。
-额外的-
一些APP会通过设置Theme来提升体验。
设置android:theme="@android:style/Theme.Translucent.NoTitleBar",原来的黑屏变为透明;
设置android:theme="@android:style/Theme.Light.NoTitleBar",原来的黑屏变为白屏;
他们的区别在初次启动时最容易观察到,比如优酷初次启动会在桌面卡2秒,就是第一种;知乎初次启动会白屏2秒,就是第二种;联通客户端初次启动会黑屏2秒,就是默认的黑屏。
如果进程中有一些服务,那么服务启动的时候会执行Application的onCreate。
//To do ……
alwaysRetainTaskState = true或flase没有区别
网上说在root activity设置为false,被系统杀死后只保留root activity;设置为true,则保留全部activity。但是我试了试,在这方面没有任何区别。
-Log- function launch_2 Translucent
----正常启动
Application--onCreate
root activity--onCreate
root activity--onStart
main activity--onCreate
main activity--onStart
secondary activity--onCreate
secondary activity--onStart
----Home键大约10s后
root activity--onStop
main activity--onStop
secondary activity--onStop
----360一键清理,或内存不足而被回收
Process--DEAD
查询Task信息,root activity、main activity、secondary activity都为DETROYED
----有守护进程,自动重启
Application--onCreate
查询Task信息,root activity、main activity、secondary activity仍为DETROYED
----再次启动APP
main activity--onCreate
main activity--onStart
root activity--onCreate
root activity--onStart
secondary activity--onCreate
secondary activity--onStart
secondary activity--onStop
secondary activity--onDestroy
为了secondary activity不destroy,可以在root activity加判断:如果saveInstanceState != null则不跳转到main activity。