1.学习
1.介绍
所有生命周期有7个和意外的两个:
7个:onCreate,onStart,onResume,onPause,onStop,onReStart,onDestroy
2个:onSaveInstanceState,onRestoreInstanceState
意外销毁时的生命周期:
- 打开应用会执行onCreate,onStart,onResume
- 点击主页面建会执行onPuase,onSaveInstanceState,onStop
- 重新打开会执行onRestart,onStart,onResume
- 返回键会执行onPause,onStop,onDestroy
- 点击多功能切换键:onPause,onStop,销毁不会执行onDestroy
2.实践
1.代码:
正常的执行过程:

意外销毁时的执行方法过程(如屏幕旋转,意外销毁):

图解:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private String TAG = "MainActivity";
private Button bt_enter;
private int mScore;
private int mLevel;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);//记得总是调用父类
//检查是否在重新创建一个以前销毁的实例
setContentView(R.layout.activity_main);
if (savedInstanceState!=null) {
//从保存状态恢复成员的值
mScore = savedInstanceState.getInt(STATE_SCORE);
mLevel = savedInstanceState.getInt(STATE_LEVEL);
}else {
//可能初始化一个新实例默认值的成员
}
initView();
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
private void initView() {
bt_enter = (Button) findViewById(R.id.bt_enter);
bt_enter.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_enter:
startActivity(new Intent(MainActivity.this, MainActivity2.class));
break;
}
}
//意外销毁时调用,如点击home键,内存不足等等
static final String STATE_SCORE="playerScore";
static final String STATE_LEVEL="playerLevel";
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
Log.d(TAG, "onSaveInstanceState: ");
//保存用户自定义的状态
outState.putInt(STATE_SCORE,1);
outState.putInt(STATE_LEVEL,2);
//调用父类,交给系统处理,这样系统能保存视图层次结构状态
super.onSaveInstanceState(outState);
}
//存在保存状态,才调用
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState: ");
//获取值
int anInt = savedInstanceState.getInt(STATE_SCORE, 1);
int anInt1 = savedInstanceState.getInt(STATE_LEVEL, 1);
//恢复界面
Toast.makeText(this, "恢复界面"+anInt+"---"+anInt1, Toast.LENGTH_SHORT).show();
}
}
3.问题与实践
1.比如小说阅读到了30页,如果发生意外销毁,那么顾客要从1页重新开始,翻到30页,这很麻烦:
解决办法:就是储存page=30。onCreate与onRestoreInstanceState都能拿到bundle数据,那选择哪个呢,那肯定是onRestoreInstanceState:原因:如果在在onCreate里,他第一次执行的时候就会进行判断if,这样效率会低一点点。
本文详细介绍了Android应用程序中Activity的生命周期,包括七个主要阶段和两个意外情况下的处理方法。通过实例代码展示了正常流程及屏幕旋转等意外情况下的执行过程,并讨论了如何有效保存和恢复Activity状态,确保用户体验。
1298

被折叠的 条评论
为什么被折叠?



