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,就可以看到应用被系统回收的效果了
分享到:
相关推荐
Android 是一款基于 Linux 内核,面向移动终端的操作系统。为适应其作为移动平台操作系统的特殊...Android 操作系统中的内存回收可分为两个层次: 1、默认内存回收、即Application Framework 层的默认回收。 2、内核
Android系统里面的应用程序进程有一个特点,那就是它们是被系统托管的。也就是说,系统根据需要来创建进程以及回收进程。进程创建发生在组件启动时,它们是由Zygote进程负责创建。Zygote进程是由系统中的第一个进程...
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...
为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使应用程序关闭但不退出,并由操作系统进行进程的回收管理。本文在ApplicationFramework与Linux内核两个层次上,以进程为粒度,对Android...
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载...
Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................
Android内存回收机制策略 1、GC 2、lowmemorykiller GC GC是java虚拟机的内存回收机制。Android GC原理探究https://www.jianshu.com/p/a7f31aee4e2e lowmemorykiller lowmemorykiller总结:...
对android应用开发的总结,GC内存回收的原来和算法,JVM内存管理的方式
在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。内存...
其实和java的垃圾回收机制类似,系统 linux认证:Android系统特质不需要太多剩余内存,其实很多人都是把使用其他系统的习惯带过来来了。android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有...
Android平台下井下安全监控系统存在内存泄露问题。经过分析认为Java内存泄露是破坏系统的主要因素。文章着重介绍了在Android平台下开发应用程序中,内存泄露出现的原因及相应的解决办法,并通过示例程序进行说明。
- Android系统保护:内存加速器持续关注系统资源并在系统内存过低时进行内存回收。 - 一键快速优化:除自动优化功能以外,内存加速器也具备手动一键快速优化功能。 - 其他:其他功能如任务杀手,白名***理,优化等级...
下面这张图就展示了Android内存的回收管理策略(图来自Google2011的IO大会)图中的每个圆节点代表对象的内存资源,箭头代表可达路径。当圆节点与GCRoots存在可达路径时,表示当前资源正被引用,虚拟机是无法对其进行...
内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够用的时候,就产生了内存溢出。 内存泄漏:当某个对象不再被使用,即不再有变量引用它时,该对象占用的内存就会...
一、Android内存基础 物理内存与进程内存 物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个Dalvik VM进程,系统会给它分配固定的内存空间(16M,32M不定),这块内存空间会映射到RAM上某个区域。然后...
《Android移动应用开发(第3版)卷Ⅰ:基础篇》涵盖了Android开发从概念、技术到市场推广应用的全部主题,内容包括Android平台概览、Android应用程序设计精髓、Android用户界面设计精髓、Android应用程序设计精髓、...
Android开发已经成为移动开发热门领域,Android应用程序中内存使用的问题却经常容易被忽视,部分开发者对Java垃圾回收机制认识模糊,使得内存泄漏成为Android应用开发中十分隐秘但又确实存在的应用安全问题,对内存...
那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么以来便出现了内存泄漏的情况。在应用中内出现一次两次的内存泄漏...