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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,350评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 今天读约书亚记15-17章。 我看到神是充满恩典与祝福的神。 迦勒的产业 在约书亚记第14章里,通过迦勒和约书亚的...
    尤加利阅读 5,413评论 0 0
  • 《输赢心理学》一书,从人的心理角度去分析了输赢问题。主要观点有3个。 一是势均力敌时,竞争才会有激励作用。儿子班级...
    阿中2016阅读 786评论 0 1