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被销毁的处理:


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(); 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值