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安装后不在桌面显示图标的应用场景举例和实现方法 最近在为公司做 ...
 
随机推荐
- javascript之一切皆为对象3
			
在前面两个章节“Javascript之一切皆为对象1”和“Javascript之一切皆为对象2”中,曾提到: 1.“一切(引用类型)皆为对象” 2. “每个函数都有一个prototype” 3. “每 ...
 - Android随笔之——闹钟制作铺垫之AlarmManager详解
			
说实话,之前写的两篇博客Android广播机制Broadcast详解.Android时间.日期相关类和方法以及现在要写的,都算是为之后要写的闹钟应用做铺垫,有兴趣的话,大家可以去看看前两篇博客. 一. ...
 - 小菜学习Winform(一)贪吃蛇
			
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
 - react-native 学习之TextInput组件篇
			
/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...
 - 搭建SSH详细步骤及相关说明
			
因为手里已有相关jar,为方便我搭建的是:Struts2.0+Hibernate3.3+Spring3.0,数据库:MySQL 如果想搭建最新的,在官网上下载最新jar即可. 这里会对比MyEclip ...
 - 微信小程序小技巧系列《一》幻灯片,tab导航切换
			
作者:gou-tian 来自:github 幻灯片 使用微信小程序原生组件swiper实现. <swiper indicator-dots="{{indicatorDots}}&quo ...
 - Mongoose使用案例--让JSON数据直接入库MongoDB
			
目录 1.准备工作. 2.配置Mongoose. 3.创建目录及文件. 4.插入数据,POST提交JSON增加一条记录. 5.查询数据,取出你插入数据库的记录. 一.准备工作 使用Express4创建 ...
 - idea 自动提示生成 serialVersionUID
			
from: http://tonycody.blog.51cto.com/8421818/1401422 Intellij IDEA 默认没启用这个功能. Setting->Inspection ...
 - jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析
			
Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...
 - C# Winform 拦截关闭按钮触发的事件
			
用户关闭软件时,软件一般会给“是否确认关闭”的提示. 通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭:否则把FormClosingEventArgs 的 Cancel 属性设置 ...