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也有类似的地方可以看到应用的进程),
当看到自己应用的进程没有了,就是被系统杀掉了
参考资料:
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();