设备从休眠状态恢复到运行状态时,休眠前的系统也同时转换成后台休眠,再次恢复的时候,经常会出现数据丢失的情况。
解决方法有多种,这里记录一种,采用SharedPreferences来存储休眠前的数据。(一个主的ListActivity,多个Fragment跳转应用)
当系统处于休眠状态时,会调用OnPause,OnStop,onResume有的设备也会直接把打开的软件,直接destroy掉。
所以要在OnPause,OnStop,onResume,OnDestroy四个方法中做处理。
用onStop方法来说明SharePreferences的使用
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
if (context != null){ //当底层的ListActivity存在的话,做数据存储记录
SharedPreferences sp = context.getSharedPreferences("reserverMainBill",
Context.MODE_PRIVATE); //这里声明SharePreferences对象,其中"reserverMainBill",是自定义的
信息,作为后续使用时,获取该对象的标志
SharedPreferences.Editor editor = sp.edit(); //存储需要保存的数据
editor.putString("accnt", boundAccnt); //类似Map,根据key,获取value
editor.commit();
}
}
这里存储了,整个数据的主核心内容accnt,当设备恢复时,就可以根据SharePreferences来获取accnt值,从而再次显示出来,休眠前的数据。
一般是在主ListActivity的onCreate方法中,做获取数据操作。不过这里还是根据软件需求来自定义获取值的地方。
@Override public void onStop() {
// TODO Auto-generated method stub
super.onStop();
SharedPreferences sp = context.getSharedPreferences("reserverMainBill", Context.MODE_PRIVATE);
if(sp != null && !sp.getString("accnt", "").equals(""))
{
boundAccnt = sp.getString("accnt", "");
}
}
因为是采用的ListActivity-Fragment模式的框架,所以会经常涉及到Fragment跳转显示。
如果设备有外界设备,常常会自行在系统休眠前结束掉正在运行的设备。
所以,在程序中获取到保存的主数据值后,要在oncreate方法中,再次跳转一下对应的Fragment,才可以正常显示系统休眠设备前,正在打开的Fragment中显示的数据。
sp = this.getSharedPreferences("reserverMainBill", Context.MODE_PRIVATE);
if(sp != null && !sp.getString("selected", "").equals("") && isExit==false ){
selectedId = sp.getString("selected", "");
maccnt = sp.getString("accnt", "");
Bundle arguments = new Bundle();
arguments.putString(ModeDetailFragment.ARG_ITEM_ID, selectedId);
if(selectedId.equals("systemset")){
Fragment1 fragment = new Fragment1(this);
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.replace(R.id.mode_detail_container, fragment).commit();
}else if (selectedId.equals("systolist")){
Fragment2 fragment = new Fragment2(this);
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.replace(R.id.mode_detail_container, fragment).commit();
}
}else{
//这里显示默认的登录成功后,ListActivity显示的内容
}