`
zheyiw
  • 浏览: 1016979 次
  • 性别: 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内存管理涉及到操作系统层面的内存分配算法和Java层的垃圾回收机制。循环首次适应和最佳适应算法在实现内存分配时各有优劣,而Android的垃圾回收机制通过分代策略有效管理内存。开发者应掌握这些原理,...

    安卓kernel 内存回收机制

    主动回收通常发生在系统检测到内存使用量接近限制时,会触发一系列的内存清理动作。被动回收则是当系统检测到低内存时,临时唤醒的内存回收过程。 3. OOM(Out Of Memory)管理:当系统内存耗尽,无法通过回收内存...

    android系统分析内存泄露测试

    在Android系统中,内存泄漏是一个严重的问题,它会导致应用程序占用过多的内存,进而影响设备性能,甚至可能导致应用崩溃。理解并有效地分析内存泄漏是每个Android开发者必须掌握的关键技能。 内存泄漏通常发生在...

    Android-Application被回收引发空指针异常分析(消灭全局变量

    Application对象虽然不会因为某个Activity的销毁而被回收,但当整个应用进程被系统杀死时,Application及其所有成员变量都会被清空。 为了防止因Application回收引发的空指针异常,开发者可以采取以下策略: 1. ...

    面向Android系统的动态内存管理策略.pdf

    此外,还实现了PMEM内存块的回收机制,目的是提升内存的使用效率和系统的整体性能。 在研究过程中,对Linux内存和Android系统的PMEM管理机制进行了深入的分析。分析指出,增加PMEM管理区的内存优化方案能够明显提升...

    Unity调用Android查看内存信息1

    当接收到内存信息时,`ReceiveMemoryInfo()`方法会被调用,我们可以在这里更新游戏界面显示内存信息。 至于FPS的显示,Unity引擎本身提供了`Time.smoothDeltaTime`属性,它表示上一帧的时间,通过`1 / Time....

    让Android系统发生重启的应用

    4. **内存管理策略**:Android系统有其特定的内存管理策略,当检测到内存不足时,会尝试回收内存,包括杀死后台进程。但如果全局引用导致内存无法正常回收,系统可能被迫重启。 解决此类问题的关键在于合理管理和...

    嵌入式开发经验:Android系统的内存管理研究

    2. Zygote进程模型:Android系统使用Zygote进程来加速应用的启动,它在系统启动时被预先加载并运行,可以为新应用提供一个复制的运行环境。这种模型对内存的使用和管理有特别的设计。 3. Android运行时(ART):...

    Android处理内存泄漏的代码例子

    本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收图像、注销监听器以及释放引用。下面将详细解释这些方法。 1. 关闭游标: 在Android数据库操作中,游标是...

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

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

    Android应用程序内存泄漏的分析.pdf

    内存泄漏是Android开发中非常常见且棘手的问题,它发生在一个对象不再被使用时,该对象所占用的内存没有被系统回收,长时间累积后可能导致应用程序性能下降或崩溃。 描述中重复强调了文档的标题,但没有提供额外的...

    android模拟内存分配

    在Android系统中,内存管理是优化应用程序性能和稳定性的重要环节。操作系统作业,特别是模拟内存分配与分区回收,是理解整个系统运行机制的关键。本文将深入探讨Android中的内存分配策略及其在实际操作中的应用。 ...

    Android内存泄漏简介

    内存泄漏是指应用程序中不再使用的内存没有被及时释放,从而导致应用程序的内存使用量不断增长,最终可能导致应用程序耗尽所有可用内存,甚至导致整个系统运行缓慢或崩溃。 在Android平台上,由于Java虚拟机的垃圾...

    android 系统的详细介绍

    此外,Android还使用低内存杀手策略来防止系统因内存不足而崩溃,优先级较低的应用可能会被暂停或关闭。 五、虚拟机 Android的虚拟机是其运行应用程序的关键。早期版本使用Dalvik虚拟机,执行字节码(.dex文件)。...

    Android防止内存溢出浅析.zip

    1. **Android内存管理机制** - **Dalvik/ART虚拟机**:Android系统使用Dalvik或ART虚拟机执行应用程序,它们都有自己的内存管理策略。 - **堆内存**:Java对象主要存储在堆中,Android为每个应用分配了一定量的堆...

    Android系统内存管理研究及优化_杜吉志1

    总的来说,理解Android内存管理机制并进行有效的内存优化,能够显著提升应用程序的性能和用户体验,避免因为内存问题导致的系统不稳定。对于Android开发者而言,深入研究和实践内存管理技巧是提升软件质量的关键步骤...

    Android中内存加载dex

    在Android系统中,Dalvik虚拟机(或者对于较新的Android版本,ART运行时)负责执行应用程序的代码。这些代码通常以.dex(Dalvik Executable)文件的形式存在,它们是优化过的机器码,专为Android平台设计。当我们...

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

Global site tag (gtag.js) - Google Analytics