其实,归纳起来,并不仅仅这种情况下造成数据丢失,造成数据丢失的情况有如下几种:
(1)、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。
(2)、长按HOME键,选择运行其他的程序时。
(3)、按下电源按键(关闭屏幕显示)时。
(4)、从activity A中启动一个新的activity时。(这种情况应该是,当我们在activity A时,此时通知栏有其他的通知,我们点击通知启动activity B,此时我们进入别的应用)
(5)、屏幕方向切换时,例如从竖屏切换到横屏时。
值得幸运的是,android对此提供了非常好的解决办法租宽!
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
安卓有点难,因为安卓本身系统会根据内存情况和后台程序耗电纳陵情况判断是否杀死后台,要保持后台只能手机里添加一下白名单,之后就听天由命了,QQ能保持后台貌似是它又开了一个服务,QQ被后台杀死,这个派茄橘服务就唤起QQ,服务挂了,QQ就再唤起这个服尘团务,这样来保持后台运行的,这是QQ自己做的,其他软件不一定Android开发中,有时候需要判断App是否在前台运行。 代码实现如下:private boolean isRunningForeground (Context context) { ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)ComponentName cn = am.getRunningTasks(1).get(0).topActivityString currentPackageName = cn.getPackageName()if(!TextUtils.isEmpty(currentPackageName) &&currentPackageName.equals(getPackageName())) { return true } return false }注意:AndroidManifest.xml中需桥禅增加<uses-permission android:name =“android.permission.GET_TASKS” />protected static boolean isTopActivity(Activity activity){String packageName = "xxxxx"ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE)List<RunningTaskInfo>tasksInfo = activityManager.getRunningTasks(1)if(tasksInfo.size() >敏兆尘 0){System.out.println("---------------包名-----------"+tasksInfo.get(0).topActivity.getPackageName())//应用程序位于堆栈的顶层if(packageName.equals(tasksInfo.get(0).topActivity.getPackageName())){}需要添加android.permission.GET_TASKS权限猜嫌欢迎分享,转载请注明来源:内存溢出
评论列表(0条)