activity生命周期
启动一个activity 的时候
onCreate --->onStart --> onResume 此时activity在界面上可以看到
用intent启动另一个activity
onPause-->new_onCreate-->new_onStart -->new_onResume -->onStop
可见 当另一个activity启动还没有覆盖掉之前的activity的时候 之前的activity先停止 调用 onPause
等第二个activity启动起来了 之前的activity 才onStorp
注意:触发onPause的 一定是另一个activity启动了。。而不是 这个activity失去焦点
比如 弹出一个Dialog()是不会触发onPause()的。。
这个时候 分n种情况
1.按下back键 back键就等于finish()方法 会销调用onDestory
new_onPause --> onRestart -->onStart --> onResume --> new_onStop --new_onDestory
所以只要按下back按键就会onDestory
此时 两种情况
1-1) 按下back键 回到桌面上了
onPause-->onStop --> onDestory
1-2) 按下home键 回到桌面上了 但是 应用并没有被销毁
onPause -->onStop
这个时候 两种情况
1-2-1) 在打开那个activity
onRestart --> onStart --> onResume
1-2-2) 这个时候把按住home键 找到最近使用过的应用 关掉后台应用
onDestory
2.按下home键 回到桌面上 但是应用没有被销毁
new_onPause-->new_onStop
2-1 如果是模拟器的话 在ddms中左边的device选中相应的程序 然后按下上面红色的stop 杀死这个进程
什么都不会执行 只是回到桌面
这个时候 按下home键 或者重新打开那个应用
onCreate --> onStart --> onResume
这个时候注意了。如果使用的是系统默认的堆栈方式 打开的界面不一定是首界面
肯定是 刚才杀死进程时候现实的界面
3.按下一个按钮 intent 跳转到之前的activity中
new_onPause -->onCreate-->onStart --> onResume --new_onStop
4.按下一个按钮 弹出一个dialog
什么也不做。。不会出发到onPause 更不会出发onStop
5.按下一个按钮 弹出一个activity 但是 只覆盖界面的一部分 剩下的部分可以看到
但是去焦点了(被覆盖肯定市区焦点 但是失去焦点 不一定 出发onPause)
onPause()
可见 只有在activity全部被覆盖了。才出发onStop
此时 按下 back键。。执行
onResume()
简单的可以记住 :跳转activity都是先把自己onPause 在进行其他的 最后在执行自己的onStop
android 状态保存和恢复机制
onSaveInstanceState
用于意外关闭程序的时候 才会调用 。
调用的情况 有:
(1)、当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
onSaveInstanceState-->onPause-->onStop
(2)、长按HOME键,选择运行其他的程序时。
onSaveInstanceState-->onPause-->onStop
(3)、按下电源按键(关闭屏幕显示)时。
(4)、从activity A中启动一个新的activity时。
onSaveInstanceState-->onPause--new_onCreate-->new_onStart-->new_onResume-->onStop
(5)、屏幕方向切换时,例如从竖屏切换到横屏时。
onSaveInstanceState-->onPause-->onStop-->onDestory-->onCreate-->onStart-->onResume
回复数据 可以使用 onSaveInstanceState 与 onCreate 结合使用
例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
System.out.println(
"----onCreate----"
);
this
.setContentView(
this
.getLayoutInflater().inflate(
R.layout.activity_log_in,
null
));
EditText editText1 = (EditText) findViewById(R.id.et1);
if
(savedInstanceState !=
null
) {
String
name = savedInstanceState.getString(
"NAME"
);
editText1.setText(savedInstanceState.getString(
"NAME"
));
Toast.makeText(
this
, name,
1
).show();
}
}
|
1
2
3
4
5
6
7
|
@Override
protected
void
onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
// super.onSaveInstanceState(outState);
outState.putString(
"NAME"
,
"HI HAO"
);
System.out.println(
"----onSaveInstanceState----"
);
}
|
在onSaveInstanceState中设置了
outState.putString(
"NAME"
,
"HI HAO"
);
并且把
super
.onSaveInstanceState(outState);
系统的保存并必掉 就可以 固定保存了。。
onSaveInstanceState是一个哈希结构的表 如果是复杂的类就不可以了
对onSaveInstanceState理解依然不那么不深刻。。