原
问题描述:
最近项目中出现了个Bug,打开应用程序按home键退出前台,启动其他的应用,经过一段时间再次启动自己的应用程序,发现界面中出现了数据丢失问题,导致程序出现一系列问题。
发现即使用Static 修饰的变量,也竟然被GC回收了,很纳闷这个问题。这问题在我调试的手机上没有发生过,但是测试人员描述,应用程序打开后,退出前台,一晚上过一段时间再次启动就出现这问题了。
分析:
分析测试描述,发现应用是在退出前台,再次进入前台出现的问题。考虑到这点想起了做毕业论文时候看过的一段话:
*在Android系统中,为了使系统能够正确决定内存不足时终止那个进程从而回收内存,Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别,根据级别把进程装入“Importance Hierarchy(重要性分级)“中, “Importance Hierarchy”中的进程是按重要程度排序的。*
1.前台进程(Foreground)
前台进程是与用于进行交互的进程,在程序运行中仅有少量的进程处于前台,不同的组件会通过不同的方式将进程移植前台,当内存无法供给前台进程同时运行时候,部分前台进程才被杀死,用于维持用户界面响应。*
2.可见进程(Visible)
可见进程不在前台显示,但用户可以看到他的Activity,当一个Activity被调用onPause()方法时,它的进程就处于可见状态。可见进程一般不允许被终止,当前系统内存不足阻塞前台进程时,会终止可见进程释放内存供前台进程使用。
3.服务进程(Service)
服务进程是用户不可以直接看到进程,虽然用户不能看到该进程的执行,但该进程做着用户关心的问题,例如,在后台播放音乐。系统会一直维护该进程运行,除非系统内存不足时,无法维护前台进程和可见进程,系统将杀死该类进程。
4.后台进程(Background)
后台进程有一个用户看不到的Activity,该Activity的onStop()方法被系统调用,Activity处于停止状态,对用户的体验没有影响,系统可以在任何时刻杀死该类进程回收其内存供前台进程、可见进程、服务进程使用。系统中通常存在较多该进程保存在LRU中,当内存不足时系统回收LRU中用户最早使用的后台进程。
5.空进程(Empty)
该进程的设立是为了提高程序运行速度,组件再次运行时虚拟机不需要重新为组件分配内存。系统经常会杀死这种进程会杀死这种进程中优先级较低的进程以保持进程缓存和系统内核缓存之间的平衡。
现在很清楚,按home键,应用程序进程制为后台进程,调用Onstop() 方法,当系统内存不足的时候,GC会回收该进程中变量(即便变量的引用没有断开),从而导致数据丢失,但是Activity没有被 finish调,再次进入前天进程,就会出现数据丢失的现象。
问题解决:
Activity 提供保存 数据的方法:
onSaveInstanceState(Bundle outState) 和onRestoreInstanceState(Bundle savedInstanceState)
onSaveInstanceState 调用情况:
1.按下或长按home键
2.横竖屏幕切换
3.该Activity 启动其他Activity
4.按下电源键
onRestoreInstanceState 调用情况:
当Activity退出前台,确实被系统销毁,会调用该方法,用户保存数据。
在onCreate(Bundle savedInstanceState) 方法中可以进行数据的回复。
savedInstanceState 可以存储序列换的list
outState.putParcelableArrayList(“childList”, childList);
如何进行 Parcelable 参考
收藏
分享
https://blog.csdn.net/CHITTY1993/article/details/50350879?locationNum=4博文来自: na2609613672的博客
项目中遇到的一些小问题,记录、分享一下。Android如何保证App切换到后台,或页面跳转后,重新打开APP、或返回之前页面时,维持其页面状态不变?...博文来自: Chitty_Tina 的 部落格
关于更改APP语言,我的大致思路是:提供设置和获取APP语言的方法,并在sp中保存,初次默认使用系统语言;APP内设置语言后保存在sp中,摒弃直接重启APP的方法,不立即跳转页面并且刷新当前页面,跳转...博文来自: 小小T的专栏
public class MainActivity extends Activity{ private EditText edit; @Override protected void onCreat论坛
当应用在点击Home键时,会调用onSaveInstanceState方法,随后是OnStop方法,如果需要缓存数值,就保存在onSaveInstanceState方法中,如果是长期保存的数值,就需要...博文来自: qq_34371084的博客
问题情景:我们的应用在前台运行,无论怎么测试,我们的应用都是正常没问题的,这时按下home键,手机回到桌面,我们的应用进入后台,过了一段时间,我们把应用从后台切换回前台,这时测试时发现应用崩溃,...博文来自: z的博客
问题的详细描述是这样的:android中,当我们按home键(一般指手机的物理按钮的中间那个键)回到手机桌面,此时app并没有退出,而是一直运行与后台中,此时如果我们点击app图标,还是会进入刚刚的界...博文来自: 龙吟的专栏
安卓中,活动存在四种状态,分别是运行状态、暂停状态、停止状态和销毁状态,除了运行状态之外,当系统内存不足的情况下,其他三种状态都有可能被回收,这样就会出现数据丢失的情况,那么如何在活动被回收之前保存数...博文来自: candy_rainbow的博客
问题现象:第一次安装应用,不要用adb安装,而是要用系统的安装器去安装,安装完成后,直接点击打开,不要点击完成,进入应用,随便点开其他界面,点击home键让应用进入后台,然后再点击应用的图标进入应用,...博文 u010351494的专栏
问题描述日常排查bugly上面的错误时,发现Nullpointer的问题特别严重,而相关的特征都是应用在后台和应用带fragment。排查代码发现都做了为空判断,为什么还会出现空对象的情况呢?模拟场景...博文来自: 少年阿涛
通常在一部Android手机里同时运行着多个应用(app),每个app对应一个系统进程,当系统需要更多的资源(如内存)而空闲资源不足时,Android系统就会选择杀掉一些低优先级的进程以便释放所需资源...博文来自: 限量发行的专栏
前几天遇到了一个有关SurfaceView和MediaCodec搭配使用,退到后台黑屏的问题(应用切换等情况)。这里我分享一下个人最后的解决方案,大家如果用到可以参考。这个问题要么释放或者不释放。我采...博文来自: qq_28334473的博客
本文转自http://blog.csdn.net/goodlixueyong/article/details/50543627注:对一些安全性要求较高的app,在用户后台运行一段时间后重新打开都是需要...博文来自: shichen501的博客
privateStringname;@OverrideprotectedvoidonSaveInstanceState(BundleoutState){outState.putString("...博文来自: langwang2的专栏
1.android:allowTaskReparenting这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“true...博文来自: agoodcoolman的专栏
android的手机的back键默认行为是finish处于前台的Activity的即Activity的状态为Destroy状态,再次启动该Activity是从onCreate开始的。而Home键默认是...博文来自: fuzhongbin的博客
Android应用程序自动更新失败,报错原因已安装了存在数字签名冲突的同名数据包。通俗来讲,就是调试手机同名应用程序的签名与更新数据包签名不一致。往往造成这种情况的是调试手机中安装有开发板的Andro...博文来自: u013754648的专栏
正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法例如:一个android程序包含两个Activity,分别为MainActivity和Other...博文来自: 99guo的专栏
目前情况: 做了一个Android的APP,使用Service把个人的地理位置手机号等信息发送给服务器,但是目前发现了一个问题,手机没锁屏黑屏的时候,能上传数据,锁屏后一段时间之后,程序就没法网上发数论坛
首先来介绍onSaveInstanceState()和onRestoreInstanceState()。关于这两个方法,一些朋友可能在Android开发过程中很少用到,但在有时候掌握其用法会帮我们起...博文来自: Liyunlong
做android开发的时候,也要负责后台的api,90%和95%时间是个硬性指标,需要不断提高。最近发现90%时间长了很多,但是只限于nginx记录的时间,java后台记录的api90%时间并...博文来自: 杂七杂八
我不知道各位大神都有没有这种情况,应用长时间处在后台被android给kill,所有的应用运行数据都被清空,如一些登入保存在application中的user信息,和其他全局信息。这样下次再进入应用的论坛
一,定义状态模式:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一...博文来自: wangxp423的博客
1、先添加权限2、添加Activity管理类packagenet.oschina.app;importjava.util.Stack;importandroid.app.Activity;import...博文来自: Seachal的博客
今天面试的时候面试官问我当按home键的时候再次进入的时候怎么保存activity的数据和状态,瞬间现场蒙逼,回来马上做笔记。。。...博文来自: Android开发
这是关于在应用中保存数据和应用状态系列文章中的第一篇。在安卓SDK中有许多机制可以用来保存数据,决定使用哪一种和何时触发该操作常让人困惑。当创建个人应用程序的时候你想要做的第一件、最容易的事就是保存一...博文来自: 张之海的博客
项目中遇到:程序没有退出,home键,来电或者其他应用运行而被迫进入后台运行。再次点击桌面图标后,需要重新登录的现象。排除内存不够,应用被回收外,经过测试还发现以下原因:...博文来自: west8623的专栏
上篇博客介绍了策略模式的实例使用,这篇博客介绍一下状态模式的实例使用。1.状态模式是解决什么问题的?状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况,把状态的判断逻辑转移到表示不同...博文来自: 王雅瑾---上善若水,水善利万物而不争