activity的数据状态保存:自己的一点经验

Activity状态保存的一般过程(自己喜欢的一种方式)

 当activity被系统销毁(一般是内存吃紧时,系统把位置后台不可见的activity销毁了)时,

类似的代码如下:
1 在onSaveInstanceState(Bundle outState)中保存数据和状态
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can save the view hierarchy state:保存布局控件的状态
   
super.onSaveInstanceState(savedInstanceState);
    // Save the user's current game state:保存其他数据
    savedInstanceState
.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState
.putInt(STATE_LEVEL, mCurrentLevel);
   
   

}
2 重新执行onCreate()时,取得之前保存的数据和状态。
@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState); // Always call the superclass first
   
   
// Check whether we're recreating a previously destroyed instance
   
if (savedInstanceState != null) {//当activity被系统销毁后,重建时,savedInstanceState不为空,从中取得onSaveInstanceState()保存的数据
       
// Restore value of members from saved state
        mCurrentScore
= savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel
= savedInstanceState.getInt(STATE_LEVEL);
   
} else {
       
// Probably initialize members with default values for a new instance:activity第一次创建时
   
}
   
...
}

测试方法:

打开自己的应用,进入要测试的activity界面,然后回到桌面,打开10几个其他的应用,把内存占用到自己应用被系统杀掉
再点击菜单按键,打开应用历史记录列表,找到自己的应用,点击打开就可以测试了(系统会重建应用最上面的activity,调用 onCreate()方法)

怎么看自己应用杀掉了,
可以看  eclipse的devices面板(android studio也有类似的地方可以看到应用的进程),
当看到自己应用的进程没有了,就是被系统杀掉了

activity的数据状态保存:自己的一点经验_第1张图片

 参考资料:

http://mobile.51cto.com/aprogram-449004.htm
http://developer.android.com/training/basics/activity-lifecycle/recreating.html#RestoreState

屏幕旋转导致activity被销毁的处理:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
http://blog.csdn.net/yangqingqo/article/details/18944103


Activity状态保存的注意事项


1.只保存关键的数据,不要保存太大的数据 : 
如一些从上一个activity传过来的数据,网络请求的一些参数,用户操作流程的进度信息等等。

2.在界面中:

2.1 如果是EditText,已经设置id(android:id=""),不需要自己手动去保存它的状态和数据(用户输入的文本),系统会自动保存: 
需要:在 onSaveInstanceState()方法中:调用 
super.onSaveInstanceState(savedInstanceState);

2.2 如果不是EditText,无论是否设置id,需要自己手动写代码保存它的状态的数据。

3. 当activity被系统销毁后,打开这个activity中的intent(启动activity的intent)里面的
intent.getExtras()如果有parcelable或Serializable数据(如String parcelable或Serializable的子类),
系统会帮你自 动保存下来,下次重建时,可以再次拿出来
(这个需要测试:是不是通用的,所有的SDK版本都一样)

4.如果一个activity显示一个fragment(一个activity对应一个fragment)时,
需要使用下面的代码,才能使onSaveInstanceState()中保存数据能在onCreate()中获取到:

@Override
 public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       Intent intent = getIntent();
       String fragmentName = intent.getStringExtra("fragment");
       //get fragment instance :获取缓存的fragment
       FragmentManager fm = getSupportFragmentManager();
      fragment = fm.findFragmentByTag("display" + fragmentName);
      if (fragment == null) {
           try {
            fragment = createFragment(fragmentName);
           } catch (Exception e) {
                // TODO: handle exception
                fragment = new EmptySupportFragment();
           }
  }
    //add to activity :加到activity中,并显示
  FragmentTransaction fragmentTransaction = fm.beginTransaction();
  if (fragment != null) {
   if (fragment.isAdded()) {
        fragmentTransaction.show(fragment);
   } else {
        fragmentTransaction.add(R.id.content, fragment, "display" + fragmentName);
   }
   fragmentTransaction.commit();
  }
 
 }


而不是使用:replace()方法:  直接使用一个新的fragment实例,来直接替换

try {
         fragment = createFragment(fragmentName);
  } catch (Exception e) {
   // TODO: handle exception
   fragment = new EmptySupportFragment();
  }
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();            
   fragmentTransaction .replace(R.id.content,fragment ,"display");
   fragmentTransaction.commit(); 

你可能感兴趣的:(android,Activity,Fragment,数据保存,状态保存)