Android中突发情况的数据保存
-
Activity:
一般Activity意外被销毁时候采用onSaveInstanceState方法来保存数据,然后在onCreate方法中先判断saveInstance参数是否不为空,再取出保存的值。
注意onSaceInstanceState方法在按back键时是不被调用的,它的调用是在onPause和onStop之间,并且一定在onStop之前被调用,但是否在onPause之前就不保证了。
onSaveInstanceState用来保存一些临时的、非永久性的数据。View中页实现了该方法,但前提是要给该View指定id,并且不同的widget还不能共用这个id。
onPause方法,无论程序在什么情况退出,该方法一定会被调用,且onStop和onDestory方法不一定会被调用,这个特性使得我们可以将一些需要永久保存的数据放在onPause方法中进行保存。
-
fragment:
它的生命周期:
onAttach->onCreate->onCreateView->onActivityCreated->
onStart->onResume->onPause->onStop->onDestoryView->onDestory->onDetach。
其中除了onActivityCreated方法外其它方法都是一一对应的。当fragment之间使用replace切换且没有设置返回栈时,它会走完完整的生命周期,从create到destory。如果设置了添加返回栈即ft.addToBackStack,则fragment只会调用onPause、onStop、onDestoryView方法。突发情况回收fragment时,对fragment的临时数据进行保存,不能仅仅在onSaveInstanceState方法中,还应该在onDestoryView方法中进行保存。
对持久性的数据,还是要在onPause方法中进行保存。
如果fragment不需要被频繁地创建和销毁的话应该调用add,show,hide方法。因为replace会先remove当前的fragment然后add一个新的;add则只添加(isAdd先判断),不会删除已有的。并且调用show、hide方法进行fragment切换时不会调用它们的任何生命周期中的函数。
在使用hide、show进行切换fragment时候,如果fragment的引用被意外回收,但实体还在,则无法对其hide,就会出现画面重叠现象。解决办法是add时候添加tag。然后每次
getFragmentManager().findFragmentByTag(TAG)
进行判断。再加一个Fragment问题的解决,当Fragment的栈里面有几个fragment的时候,会出现,当你触摸当前fragment的时候,下层的fragment的事件被触发,这是由于Touch事件泄露传到了下层中。解决方法就是拦截onTouch事件.记得注册监听事件。
@Override public boolean onTouch(View v, MotionEvent event) { return true; }
fragment切换参考代码:
public void switchContent(Fragment from, Fragment to) {
if (mContent != to) {
mContent = to;
FragmentTransaction transaction = mFragmentMan.beginTransaction().setCustomAnimations(
android.R.anim.fade_in, R.anim.slide_out);
if (!to.isAdded()) { // 先判断是否被add过
transaction.hide(from).add(R.id.content_frame, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
}
}
}
2次返回键退出程序
/*
* 上一次点击 back 键的时间
* 用于双击退出的判断
*/
private static long lastBackTime = 0;
@Override
public void onBackPressed() {
long currentTime = System.currentTimeMillis();
if (currentTime - lastBackTime < BACK_INTERVAL) {
super.onBackPressed();
} else {
showToast("双击 back 退出");
}
lastBackTime = currentTime;
}