`
zheyiw
  • 浏览: 997116 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android系统内存不足时,应用被系统回收发生了什么?

阅读更多


android独特的内存机制,导致系统内存不足时会销毁后台的应用,这里我们研究一下应用被销毁后重新加载时的情形

一个安卓应用A先后打开3个Activity:  a --> b --> c  
这个时候如果来了一个电话, 接电话的过程中, 手机内存不够, 那么应用A将会被系统回收

当打完电话,再次进入应用A的时候会发生下面的事情:
1, 系统会重新加载c,而且是在新线程中
2, 现在点返回关闭c,系统就会重新加载b,而且是在新的线程中(跟c不是一个线程)
3, 现在点返回关闭b,系统就会重新加载a,而且是在新的线程中(跟c,b的线程都不相同)
(就是先打开c,finish了c时加载b,finish了b时加载a)

注意: 这个时候应用中的全局静态变量将全部重置(有默认值的为默认值,没有默认值的为null)

这就使得出现了错误的数据

解决办法: 
方法1, 不使用全局变量, 放在Application中也不行, 因为重新加载的a,b,c的页面不在一个线程中,Application不唯一了
方法2, 结束b和c, 只重新加载a ,在a中重新初始化数据 (a往往是登录界面)

现在讲办法2的实现:
在b,c等所有非a的activity中的onCreate里面加上下面的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	if (isNull(Config.UserID)) {
		if (null != savedInstanceState) {
			// activity由系统打开 (是由于手机内存不够,activity在后台被系统回收,再打开时出现的现象)
			// 因为系统加载的所有的Activity不在同一个线程,所以要结束除了loginActivity之外的其他线程
			android.os.Process.killProcess(android.os.Process.myPid());
		} else {
			this.finish();
		}
		return;
	}
	// ...其他代码
}

代码的原理: 
因为重新加载的a,b,c都在不同的线程中,所以我们先后舍弃c,b的线程,那么a就会重新加载

a被重新加载可以通过下面的代码证实
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_login);
	if (null != savedInstanceState) {
		toast("程序被系统回收,需要重新登录!");
		//activity由系统加载的时候savedInstanceState不为空
	}
	//...其他代码
}

请在小内存的手机测试,先打开应用A,进入两到三个页面,再按home键回到桌面,打开一个大型游戏,再按home键回到桌面,再打开应用A,就可以看到应用被系统回收的效果了

分享到:
评论
2 楼 elton_john007 2016-10-12  
我用 Thread.currentThread().getId() 打印的线程都是1,加载不view不都在UI线程吗,在其它线程操作就崩溃了,怎么可能a b c 在不同线程?
1 楼 zy19891111 2015-12-31  
回答得无比的赞

相关推荐

    Android操作系统之内存回收策略

    Android 是一款基于 Linux 内核,面向移动终端的操作系统。为适应其作为移动平台操作系统的特殊...Android 操作系统中的内存回收可分为两个层次: 1、默认内存回收、即Application Framework 层的默认回收。 2、内核

    Android应用程序进程管理

    Android系统里面的应用程序进程有一个特点,那就是它们是被系统托管的。也就是说,系统根据需要来创建进程以及回收进程。进程创建发生在组件启动时,它们是由Zygote进程负责创建。Zygote进程是由系统中的第一个进程...

    《Android系统源代码情景分析》

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...

    Android操作系统的内存回收机制

    为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使应用程序关闭但不退出,并由操作系统进行进程的回收管理。本文在ApplicationFramework与Linux内核两个层次上,以进程为粒度,对Android...

    Android系统源代码情景分析-罗升阳-源码

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载...

    Android系统源代码情景分析光盘

    Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................

    Android内存回收机制

    Android内存回收机制策略 1、GC 2、lowmemorykiller GC GC是java虚拟机的内存回收机制。Android GC原理探究https://www.jianshu.com/p/a7f31aee4e2e lowmemorykiller lowmemorykiller总结:...

    Android应用程序的内存分析

    对android应用开发的总结,GC内存回收的原来和算法,JVM内存管理的方式

    Android常见的几种内存泄漏小结

    在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。内存...

    Android系统内存设计

    其实和java的垃圾回收机制类似,系统  linux认证:Android系统特质不需要太多剩余内存,其实很多人都是把使用其他系统的习惯带过来来了。android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有...

    Android平台下井下安全监控系统内存泄露分析

    Android平台下井下安全监控系统存在内存泄露问题。经过分析认为Java内存泄露是破坏系统的主要因素。文章着重介绍了在Android平台下开发应用程序中,内存泄露出现的原因及相应的解决办法,并通过示例程序进行说明。

    内存加速 Memory Booster (Full Version) 5.9.3

    - Android系统保护:内存加速器持续关注系统资源并在系统内存过低时进行内存回收。 - 一键快速优化:除自动优化功能以外,内存加速器也具备手动一键快速优化功能。 - 其他:其他功能如任务杀手,白名***理,优化等级...

    Android应用内存泄漏的定位、分析与解决策略

    下面这张图就展示了Android内存的回收管理策略(图来自Google2011的IO大会)图中的每个圆节点代表对象的内存资源,箭头代表可达路径。当圆节点与GCRoots存在可达路径时,表示当前资源正被引用,虚拟机是无法对其进行...

    Android内存溢出及内存泄漏原因进解析

    内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够用的时候,就产生了内存溢出。 内存泄漏:当某个对象不再被使用,即不再有变量引用它时,该对象占用的内存就会...

    浅谈Android应用的内存优化及Handler的内存泄漏问题

    一、Android内存基础 物理内存与进程内存 物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个Dalvik VM进程,系统会给它分配固定的内存空间(16M,32M不定),这块内存空间会映射到RAM上某个区域。然后...

    Android移动应用开发(第3版)卷Ⅰ基础篇 (Shane Conder, Lauren Darcey) PDF扫描版

     《Android移动应用开发(第3版)卷Ⅰ:基础篇》涵盖了Android开发从概念、技术到市场推广应用的全部主题,内容包括Android平台概览、Android应用程序设计精髓、Android用户界面设计精髓、Android应用程序设计精髓、...

    论文研究-移动应用程序内存泄露机制分析与检测方案设计.pdf

    Android开发已经成为移动开发热门领域,Android应用程序中内存使用的问题却经常容易被忽视,部分开发者对Java垃圾回收机制认识模糊,使得内存泄漏成为Android应用开发中十分隐秘但又确实存在的应用安全问题,对内存...

    详解Android性能优化之内存泄漏

    那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么以来便出现了内存泄漏的情况。在应用中内出现一次两次的内存泄漏...

Global site tag (gtag.js) - Google Analytics