关于安卓应用后台运行后,重新进入,应用闪退问题

        现象:安卓应用后台运行后,在系统内存紧张下,应用会被kill掉,当用户点击应用图标重新进入的时候,就会闪退,大部分报错信息,都是空指针的错误。

        为什么会造成这种情况?首先,应用进程被kill掉(application被Kill,相关变量被清空),这个是可以确定的,但是,正常情况下(魔改过的rom不纳入考虑范围),应用的任务栈没有被清空,系统还是保留了原来应用的任务栈,当用户重新进入activity的时候,当用到某些已经被清空的变量时,就会NullPointerException报错。

        下面先说一下安卓activity的启动模式,分别为:Standard,SingleTop,SingleTask,SingleInstance。

        Standard:标准模式。默认的activity启动模式,也是我们最常用的模式。该模式下,activity启动会生成一个实例,然后进入我们调用的任务栈,假如原本的任务栈是:A-B-C,且当前显示的是C Activity,那么,C启动D,就会变成A-B-C-D,且D显示,D启动D,就会变成A-B-C-D-D,D显示,以上为Activity调用的情况。对于Application调用,需要加上new task标识,细心的读者,此时发现,生成的Activity是以singletask模式启动的。

        SingleTop:单一顶部模式,使用该模式的Activity,在启动的时候,会检查启动栈内的栈顶是否已经存在实例,若存在,则不会新建一个实例,会执行onNewIntent函数,注意onCreate(),onStart()方法不会执行。否则创建一个新的实例并入栈。例子:(1)当前任务栈为A-B-C,A为SingleTop模式,这个时候,C启动A,任务栈会变成A-B-C-A。(2)当前任务栈为A-B-C-A,A为SingleTop模式,这个时候,A启动A,任务栈还是A-B-C-A。

        SingleTask:栈内复用模式,使用该模式的Activity,在启动的时候,会检查启动栈内的栈顶是否已经存在实例,若存在,则不会新建一个实例,会清空其栈以上的Activity,使其成为栈顶Activity。并执行onNewIntent函数。若不存在,则新建一个任务栈,并且把Activity放入该任务栈中。

        SingleInstance:单实例模式,具有SingleTask的所有属性,并且启动该模式的Activity时,该Activity只能单独存在一个任务栈中。加入B启动了具有SingleInstance特性的A Activity,系统就会创建一个新的任务栈,并把A放入,后续启动A,都不会创建A的实例,除非A所在的任务栈被销毁。


        本次实战,MainActivity的启动模式为SingleTask,其余Activity的启动模式均为Standard。

        首先我们需要模拟应用进入后台,并且被系统Kill的情况。(这个有多种方法实现,作者使用的是手机开发者模式里面的不允许后台任务模式)

        情况1:应用打开了首页,退回后台,被系统kill后,重新进入应用,应用闪退,报空指针错。

        情况2:应用打开了二级页面,退回后台,被系统kill后,重新进入应用,应用闪退,同样报空指针错。

        思考:空指针报错,就是之前提及的系统Kill应用后,变量被释放造成的。那么我们如何处理?首先,被kill后的应用,用户再次点击进入,应用就会根据旧的任务栈信息进行复原Activity。由于Activity已经被销毁,所以Activity需要走重新创建的流程,重点就是,某些变量值,已经被释放了,这个时候,我选择的方法,就是在Activity的onCreate()方法里面,进行判断,如果是已经被销毁后,重新创建的Activity,这种情况下,我们直接启动MainActivity,然后在MainActivity的onNewInstance()方法里面判断,最后确定是否需要重新启动应用。

        再次提醒,上述使用情况,MainActivity的启动模式为SingleTask,其余Activity的启动模式均为Standard。其余的情况,其实也是大同小异,需要注意的是,各个Activity的启动模式,然后在对应的函数里面进行判断。

        返回代码,首先,我们定义一个类,用来记录Activity的启动:


启动标识记录类
启动标识判断类

当我们应用启动的时候,或者是在欢迎页面的时候,通过调用AppStatusManager,把mAppStatus的值设置为AppStatus类里面的正常态,如下图:


设置正常态

然后,在Activity的基类里面,onCreate方法中,加一个是否被后台Kill的判断(对于后台kill,变量值都会恢复到默认值),若是,则打开MainActivity,否则正常启动。(有人会问,为什么要打开MainActivity,而不是直接重启应用,这个是因为SingleTask的特别性,所以要特别处理)BaseActivity的onCreate处理逻辑如下图:


BaseActivity onCreate方法处理

走完上述的步骤,由于SingleTask的特别性,所以任务栈里面就剩一个MainActivity了。这个时候,我们要着手处理MainActivity的函数onNewIntent(),如下图:


MainActivity onNewIntent

这个情况进入,我建议是app进行finish掉MainActivity后,重启走一次启动流程的,这样更加符合规范。所以这里直接启动了欢迎页面,然后finish当前的MainActivity了。


至此,问题修复完成,若有不正之处,请指出,定更正。

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