Android app被系统kill的场景
何时发生
当我们的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的写法,思路大体有以下几种:
- 不改现有的单例datakeeper写法,但是增加永久存储支持,比如写到SP中,以后如果发现字段中没值了,那么就去SP中读一发;
- 数据通过Intent传递,这样也能保证不丢失,因为系统重建act的时候,用的Intent和当时启动act时的Intent是一样的,所以如果你所需要的数据都是以这种方式传递的,那恭喜你,you are safe,你要做的只是从Intent中解析出来你需要的数据;
- 在onSaveInstanceState中保存数据,在onCreate()/onRestoreInstanceState()中恢复数据;
如何模拟
由于系统后台杀进程具有一定的随机性,所以作为开发人员不可能去坐等这种情况发生,我们得有方法能很快速的复现,具体步骤如下:
参考 stackoverflow的提问。
Android app被系统kill的场景的更多相关文章
- wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法
wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法,可用于其他商城或者系统的编程参考 package cn.zzu.edu.wemall.utils ...
- 防止Android程序被系统kill掉的处理方法
转载请注明出处:http://blog.csdn.net/cuiran/article/details/38851401 目前遇到一个问题程序需要一直运行,并显示在最前端,但是运行一段时间发现会被系统 ...
- Android APP使用系统签名
Android M平台在写APP测试使用MediaRecoder通过AudioSource.VOICE_CALL来录制通话上下行音的时候,需要权限 <uses-permission androi ...
- Android app作为系统应用实现功能笔记
1.禁用StatusBar相关功能需要添加权限 <uses-permission android:name="android.permission.STATUS_BAR"&g ...
- wemall doraemon中Android app商城系统解决左侧抽屉菜单和viewpager不能兼容问题
完美解决左侧抽屉菜单和viewpager不能兼容左右滑动的问题,可进行参考. WeMall-Client/res/layout/wemall_main_ui.xml </RadioGroup&g ...
- wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- [系统集成] Android 自动构建系统
一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包android 的打包一般 ...
- 如何让自己的Android程序永不被系统kill
一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源.Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低 ...
- 转Android APP安装后不在桌面显示图标的应用场景举例和实现方法
转http://www.cnblogs.com/allenzheng/p/4510725.html#3186608 Android APP安装后不在桌面显示图标的应用场景举例和实现方法 最近在为公司做 ...
随机推荐
- linux下的常用命令
1 fg切换前后台作业 将后台作业转换为前台作业,”fg %作业号“ 2 stty改变和打印终端行设置 tostop 阻止后台作业写终端,stty -a显示终端的所有选项 3 uname查看机子信息 ...
- css3实现的动画效果
在线演示:莲花盛开 在线演示:忙碌光标效果 在线演示:发光效果
- Google和Baidu常用的搜索技巧--转
原文链接:http://mp.weixin.qq.com/s?__biz=MjM5NTY0MTY1OQ==&mid=2654509772&idx=1&sn=754454e374 ...
- C#/VB.NET 向PowerPoint文档插入视频
如今,Microsoft Office PowerPoint在我们日常生活中的应用已经很广泛了,利用Microsoft Office PowerPoint不仅可以创建演示文稿,还可以在互联网上召开面对 ...
- 关于Java中的final关键字
Java中的final关键字是用来限制用户行为的,说白了,就是用来限制我们这些程序员的.final可以用来修饰:变量.方法.类. 1)Java final variable final用来修饰变量时, ...
- OpenCV2邻域和模板操作
在图像处理中,通过当前位置的邻域像素计算新的像素值是很常见的操作.当邻域包含图像的上几行和下几行时,就需要同时扫描图像的若干行,这就是图像的邻域操作了.至于模板操作是实现空间滤波的基础,通常是使用一个 ...
- Struts2 源码分析——DefaultActionInvocation类的执行action
本章简言 上一章讲到关于拦截器的机制的知识点,让我们对拦截器有了一定的认识.我们也清楚的知道在执行用户action类实例之前,struts2会先去执行当前action类对应的拦截器.而关于在哪里执行a ...
- react入门(2)
接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html React事件 可以先看一下官网讲解的内容h ...
- 30行代码让你理解angular依赖注入:angular 依赖注入原理
依赖注入(Dependency Injection,简称DI)是像C#,java等典型的面向对象语言框架设计原则控制反转的一种典型的一种实现方式,angular把它引入到js中,介绍angular依赖 ...
- Python_Day_01(使用环境为Python3.0+)
Python 变量与赋值. Python在赋值时时不需要进行定义类型,可直接进行定义赋值. #直接赋值字符串格式 value = "Char" #直接赋值为数字 value = 1 ...