美文网首页
Android中突发情况的数据保存

Android中突发情况的数据保存

作者: 御风逍遥 | 来源:发表于2016-06-30 10:02 被阅读144次
    • 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;
    }

    相关文章

      网友评论

          本文标题:Android中突发情况的数据保存

          本文链接:https://www.haomeiwen.com/subject/jbgxjttx.html