APP启动与退出实验

-退出-

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,765评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,633评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,473评论 19 139
  • 《输赢心理学》一书,从人的心理角度去分析了输赢问题。主要观点有3个。 一是势均力敌时,竞争才会有激励作用。儿子班级...
    阿中2016阅读 4,294评论 0 1
  • 【0528今日话题】 五月目标完成得怎么样了? 五月目标:五月份继续按四月份计划进行。1.坚持早起2.坚持学英语3...
    梓毓爸阅读 799评论 0 0