设备从休眠状态恢复到运行状态时,休眠前的系统也同时转换成后台休眠,再次恢复的时候,经常会出现数据丢失的情况。
解决方法有多种,这里记录一种,采用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显示的内容 }