何时发生

当我们的app被切到后台的时候,比如用户按下了home键或者切换到了别的应用,总之是我们的app不再和用户交互了,这个时候对于我们的app来说就是什么事情都可能发生的时候了,因为系统会认为你现在已经不是那么重要了,而和用户正在交互的app的优先级是最高的了,系统会想尽一切办法保证这些app的正常运行,如果这时这些app再申请更多的资源,如内存时,当目前的系统状况无法满足时,系统便会拿后台app开刀,也就是很粗鲁的杀掉整个app的进程,这时你也别指望onDestroy之类的callback会触发,你唯一能指望的就是在切后台的时候onPause、onStop和onSaveInstanceState之类的方法,如果你有状态需要保存那么应该在这些地方处理,不要寄希望于onDestroy,它会让你失望的,在这个地方用来释放资源还是ok的。由于系统要杀进程,那么紧接着的问题就是杀哪个进程,系统为此专门有个模块叫LML(low memory killer),详情可以参考下官方文档,见这里:processes-and-threads

再次切回app的行为

比如你在离开app的时候,已经打开了3个act,分别是A,B,C,C在最顶端,也就是任务栈顶,A是你的main activity,假设在后台期间被系统杀掉进程了,后面如果用户再次回来(通过recent tasks或者直接点击launcher里的app icon),这时展现在你眼前的将会是重建后的C activity,而不是正常情况下启动的A,系统同时也恢复了当初的任务栈,也就是说栈里的内容还是A,B,C,这时如果你按下了back键结束了C,那么系统又会帮我们重建B,A在B结束的时候也是一样的逻辑。这里需要注意一点就是,如果是用户自己杀掉了app,那么再次启动的时候回到的是A而不是C,只要记住是系统的错导致我们被杀的话,那么再次回到的话系统就有责任帮我们重建act。关于重建act的详情,可以参考官方文档recreating-activity。切回来之后虽然act是被重建了,但如果你代码里用了单例这样的东西来存一些变量的值,那么很不幸,这时所有单例中的字段全变成默认值了(0, false or null),因为你想啊,进程都被杀死了啊,所有静态字段等等都没了。stackoverflow有这样的问题,比如这个静态变量变成null了
目前笔者在维护的代码里有类似的构造,线上也确实出现了些类似的问题,着实蛋疼啊,准备改掉这种单例datakeeper的写法,思路大体有以下几种:

  1. 不改现有的单例datakeeper写法,但是增加永久存储支持,比如写到SP中,以后如果发现字段中没值了,那么就去SP中读一发;
  2. 数据通过Intent传递,这样也能保证不丢失,因为系统重建act的时候,用的Intent和当时启动act时的Intent是一样的,所以如果你所需要的数据都是以这种方式传递的,那恭喜你,you are safe,你要做的只是从Intent中解析出来你需要的数据;
  3. 在onSaveInstanceState中保存数据,在onCreate()/onRestoreInstanceState()中恢复数据;

如何模拟

由于系统后台杀进程具有一定的随机性,所以作为开发人员不可能去坐等这种情况发生,我们得有方法能很快速的复现,具体步骤如下:

                           模拟后台杀进程的步骤

参考 stackoverflow的提问

Android app被系统kill的场景的更多相关文章

  1. wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法

    wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法,可用于其他商城或者系统的编程参考 package cn.zzu.edu.wemall.utils ...

  2. 防止Android程序被系统kill掉的处理方法

    转载请注明出处:http://blog.csdn.net/cuiran/article/details/38851401 目前遇到一个问题程序需要一直运行,并显示在最前端,但是运行一段时间发现会被系统 ...

  3. Android APP使用系统签名

    Android M平台在写APP测试使用MediaRecoder通过AudioSource.VOICE_CALL来录制通话上下行音的时候,需要权限 <uses-permission androi ...

  4. Android app作为系统应用实现功能笔记

    1.禁用StatusBar相关功能需要添加权限 <uses-permission android:name="android.permission.STATUS_BAR"&g ...

  5. wemall doraemon中Android app商城系统解决左侧抽屉菜单和viewpager不能兼容问题

    完美解决左侧抽屉菜单和viewpager不能兼容左右滑动的问题,可进行参考. WeMall-Client/res/layout/wemall_main_ui.xml </RadioGroup&g ...

  6. wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  7. [系统集成] Android 自动构建系统

    一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包android 的打包一般 ...

  8. 如何让自己的Android程序永不被系统kill

    一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源.Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低 ...

  9. 转Android APP安装后不在桌面显示图标的应用场景举例和实现方法

    转http://www.cnblogs.com/allenzheng/p/4510725.html#3186608 Android APP安装后不在桌面显示图标的应用场景举例和实现方法 最近在为公司做 ...

随机推荐

  1. Delete Volume 操作 - 每天5分钟玩转 OpenStack(57)

    今天讨论 cinder 如何删除 volume . 状态为 Available 的 volume 才能够被 delete.如果 volume 当前已经 attach 到 instance,需要先 de ...

  2. 窥探Swift之类的继承与类的访问权限

    上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...

  3. 开发中 常用 js 记录(一)

    (1)获得URL参数 function GetQueryString("url参数名") {     var reg = new RegExp("(^|&)&qu ...

  4. iOS编译FFmpeg、kxmovie实现视频播放 (转载)

    由于FFmpeg开源框架的功能非常强大,可以播放的视频种类很多,同时添加第三方库kxmovie,实现视频播放,真的是爽爆了,因此今天来说一下关于FFmpeg在iOS手机上的一些配置过程,配置工具,还有 ...

  5. Your account already has a valid iOS Distribution certificate!

    iOS 发布提交出现:Your account already has a valid iOS Distribution certificate!问题解决 转载的链接   http://www.jia ...

  6. MD5

    (转载自:http://blog.chinaunix.net/uid-20725556-id-1885710.html) MD5的全称是Message-Digest Algorithm 5(信息-摘要 ...

  7. 为你带来灵感的 20 个 HTML5/CSS3 模板

    1. Curve 2. Tapestry 3. Aqueous 4. Deliccio 5. Respond 1.5 6. Triangle Responsive 7. Design Company ...

  8. 如何通过cmd开一个本地服务器

    1.首先你要下载安装node.js http://nodejs.cn/download/ 并且根据提示安装在自己的电脑上即可 2.打开cmd管理员窗口输入npm -v 检测node.js是否安装成功: ...

  9. QRCode

    这个星期, 领导要我总结项目中用到的一些技术, 然后交付文档. 嘿嘿, 奉命整理. 二维码, 相信很多项目中都会要求生成这个, 然后由手机端去扫描, 或存储一些详情信息, 或存储一条链接, 可以快捷访 ...

  10. Web API与文件操作

    前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在 ...