App进程被杀所引发的问题及其处理方案

开始先假设有这样一个简单的情景:当前应用中有3个Activity AAcitity BActivity CActivity在当前的Activity栈中处于栈顶的为C。接着按下home键此时3个activity都处于"stoped"状态。但这种情景下应有有可能会被杀掉。

stack.png

一 被杀的原因

在官方文档中关于Activity生命周期的部分可以看到这样的描述:

If an activity is paused or stopped, the system can drop the activity from memory by either asking it to finish, or simply killing its process. When it is displayed again to the user, it must be completely restarted and restored to its previous state.

大概的意思是当内存不足的时候应用是可能被"杀"掉的。通过下面文档的表格可以看出,当activity处于stoped、destroyed以及paused(3.0版本以前)的状态时所在进程都有可能被杀掉(当然这里的activity的状态是对应activity栈顶的状态)。

killabel.png

二 被杀后所产生的现象

  • 可能有人会有这样的疑问:当应用被强杀掉,所有在当前Activity栈中的Activity(此时处于stopped状态)进程被杀掉的时候会像调用finish那样结束掉自己吗?通过测试可以得出答案:不会(你可以通过ddms模拟系统杀掉你的进程进行测试就可以得出这样的结论)。在开头描述的情景下杀掉进程的话,所有Activity都不会走onStop和onDestroy方法。所以这种情况下关闭数据库、文件之类的操作最好考虑放到onPause中进行了。

  • 如果你有在onSaveInstanceState(Bundle)做数据保存的话,这时候就应该要注意了,通过测试你会知道应用被强杀后activity不会调用到onSaveInstanceState(Bundle)(或许这时候你可以考虑提前在onPause()中作相应的处理)。

  • 当应有被杀掉后,你再重新打开应用的话是打开最近可见的activity对应于情景的CActivity,这时候如果你再返回按钮会发现会回到BActivity,当然再按一次就回到AActivity。可见Activity栈并没有因为应用被杀掉而清空。但这里有一点要注意的是,这种情况下栈中Activity重新实例化,因为之前栈中的Activity其实已经被销毁了。这一点可以通过打印应用被杀前后的Activity对象的hash值得到验证。

Paste_Image.png

三 被杀后重新打开可能发生的问题

根据二中提到的现象因为应用被强杀而数据得不到恢复的话可能就会出现问题,例如BActivity启动通过bundle携带数据到CActivity中,但当重新打开应用时数据因为BActivity还没有实例化,CActivty中就获取不到正确的数据了。另外一种可能出现的问题是假设CActivty中使用了BActivity中的静态引用reference,而该引用是随BActivity的实例化而实例化的,所以CActivity中使用的只是一个指向空的引用这样使用就会报空指针了。当然实际开发中在各种情形下因为强杀后再启动应用也会引起其他问题。

四 被杀后的处理

当然最好的处理方法是让数据重新的恢复并且避免三中提及到的以及可能出现的各种问题。但这就要根据具体的项目去做处理了。这里主要介绍另一种方案就是 当重启应用时清空Activity栈并且重新从AActvity开始launcher应用。这样就绕开了数据恢复的问题。但这里注意的一点是假设你在CActivity中根据你所设置的标志判断到应用需要重走流程starActivity的时候,需要将intent的flags设置为

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

这样做才能把先前的栈清空。

参考文章: http://www.jianshu.com/p/bce1164b83d8

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

推荐阅读更多精彩内容