Activity的状态保存

当点击home键或程序运行过程中突然来电话等意外情况或屏幕方向改变时,会调用onSaveInstanceState()方法进行保存数据到手机硬盘上,再次运行Activity时则调用onRestoreInstanceState()方法从硬盘中取出以保存的数据。也可从onCreate()方法中的bundle对象中取数据:

 
 
  1. publicvoidonCreate(BundlesavedInstanceState)
  2. {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.main);
  5. txt=(EditText)findViewById(R.id.txt);
  6. if(null!=savedInstanceState&&savedInstanceState.containsKey(CONTENT))
  7. {
  8. txt.setText(savedInstanceState.getString(CONTENT));
  9. }
  10. secondBtn=(Button)findViewById(R.id.secondBtn);
  11. secondBtn.setOnClickListener(listener);
  12. Log.i(TAG,"MainActivity-->onCreate");
  13. }
onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法,如下:
 
 
  1. publicclassPreferencesActivityextendsActivity{
  2. privateStringname;
  3. protectedvoidonRestoreInstanceState(BundlesavedInstanceState){
  4. name=savedInstanceState.getString("name");//被重新创建后恢复缓存的数据
  5. super.onRestoreInstanceState(savedInstanceState);
  6. }
  7. protectedvoidonSaveInstanceState(BundleoutState){
  8. outState.putString("name","liming");//被摧毁前缓存一些数据
  9. super.onSaveInstanceState(outState);
  10. }
  11. }

当Activity重新创建时,会先执行onCreate()方法,再执行onRestoreInstanceState()方法,也可以在onCreate()方法中取数据

使用Activity默认的Shared Preference,也可以保存数据。
如果需要单击返回按钮退出程序后,下次进入仍然可以保留数据,可以在onPause()方法中设置共享参数,实际是将数据保存在系统的xml文件中

 
 
  1. protectedvoidonPause(){
  2. super.onPause();
  3. //SharedPreferencesuiState=getPreferences(0);
  4. //SharedPreferences.Editoreditor=uiState.edit();
  5. //editor.putString(TEXT_ENTRY_KEY,myEditText.getText().toString());
  6. //editor.putBoolean(ADDING_ITEM_KEY,addingNew);
  7. //editor.commit();//Committhepreferences.
  8. //或:
  9. this.getPreferences(MODE_PRIVATE).edit().putString(TEXT_ENTRY_KEY,myEditText.getText().toString());
  10. }

在onResume()方法中取数据

 
 
  1. protectedvoidonResume(){
  2. super.onResume();
  3. this.getPreferences(MODE_PRIVATE).edit().getString(TEXT_ENTRY_KEY,…………
  4. }
注意:如果系统中有两个Activity,一个处于暂停状态,一个处于停止状态,当内存不足时,系统会首先杀死停止状态的Activity

本文出自 “IT之梦” 博客,请务必保留此出处http://dreamboy.blog.51cto.com/3180937/723871


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值