Android Activity生命周期详解
2015-09-07 16:08
405 查看
先介绍各个生命周期主要方法的使用:
onCreate
当Activity被第首次加载时执行。我们新启动一个程序的时候其主窗体的onCreate事件就会被执行。如果Activity被销毁后(onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行。
onStart
是activity用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互
onResume
是activity获得用户焦点,在与用户交互
onPause
用于由一个Activity转到另一个Activity、设备进入休眠状态(屏幕锁住了)、或者有dialog弹出时
onStop
用于不可见的Activity(有对话框弹出时,这时底下的activity仍然可见,所以此时onStop不会被调用)
onRestart
重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onStop
事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件
onDestroy
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源!
这是我自己写的demo打印初来各种情况下生命周期的执行顺序
1,首次加载Activity1
onCreate
onStart
onResume
onWindowFocusChanged
2,切换到Acitvity2
Activity1 执行顺序:
onPause
onWindowFocusChanged
onSaveInstanceState
onStop
Activity2执行顺序:
onCreate
onStart
onResume
onWindowFocusChanged
完整的流程是这样的:
Acvity1 ---> onCreate
Acvity1 --->onStart
Acvity1 --->onResume
Acvity1 --->onPause
Activity2--->onCreate
Activity2--->onStart
Activity2--->onResume
Acvity1 --->onStop
如果Activity2属性加入android:theme="@android:style/Theme.Dialog"
则Activity1就不会执行onStop方法
3,Activity2 返回指Activity1
Activity2执行顺序:
onPause
onWindowFocusChanged
onStop
onDestory
Activity1执行顺序:
onRestart
onStart
onResume
onWindowFocusChanged
4,Activity1退到后台
Activity1执行顺序:
onPause
onWindowFocusChanged
onSaveInstanceState
onStop
5,Activity1返回前台
Activity1执行顺序:
onRestart
onStart
onResume
onWindowFocusChanged
6,手机按下电源键息屏
Activity1执行顺序:
onPause
onSaveInstanceState
onStop
onWindowFocusChanged
7,手机按下电源键亮屏
Activity1执行顺序:
onRestart
onStart
onResume
onWindowFocusChanged
下面是两个Activity的源代码
Activity1的代码:
Activity2的代码:
最后盗生命周期流程图一张
onCreate
当Activity被第首次加载时执行。我们新启动一个程序的时候其主窗体的onCreate事件就会被执行。如果Activity被销毁后(onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行。
onStart
是activity用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互
onResume
是activity获得用户焦点,在与用户交互
onPause
用于由一个Activity转到另一个Activity、设备进入休眠状态(屏幕锁住了)、或者有dialog弹出时
onStop
用于不可见的Activity(有对话框弹出时,这时底下的activity仍然可见,所以此时onStop不会被调用)
onRestart
重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onStop
事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件
onDestroy
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源!
这是我自己写的demo打印初来各种情况下生命周期的执行顺序
1,首次加载Activity1
onCreate
onStart
onResume
onWindowFocusChanged
2,切换到Acitvity2
Activity1 执行顺序:
onPause
onWindowFocusChanged
onSaveInstanceState
onStop
Activity2执行顺序:
onCreate
onStart
onResume
onWindowFocusChanged
完整的流程是这样的:
Acvity1 ---> onCreate
Acvity1 --->onStart
Acvity1 --->onResume
Acvity1 --->onPause
Activity2--->onCreate
Activity2--->onStart
Activity2--->onResume
Acvity1 --->onStop
如果Activity2属性加入android:theme="@android:style/Theme.Dialog"
则Activity1就不会执行onStop方法
3,Activity2 返回指Activity1
Activity2执行顺序:
onPause
onWindowFocusChanged
onStop
onDestory
Activity1执行顺序:
onRestart
onStart
onResume
onWindowFocusChanged
4,Activity1退到后台
Activity1执行顺序:
onPause
onWindowFocusChanged
onSaveInstanceState
onStop
5,Activity1返回前台
Activity1执行顺序:
onRestart
onStart
onResume
onWindowFocusChanged
6,手机按下电源键息屏
Activity1执行顺序:
onPause
onSaveInstanceState
onStop
onWindowFocusChanged
7,手机按下电源键亮屏
Activity1执行顺序:
onRestart
onStart
onResume
onWindowFocusChanged
下面是两个Activity的源代码
Activity1的代码:
private static final String TAG = "MainActivity"; private Context context = this; private int param = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate called."); Button button = (Button)findViewById(R.id.setting_network); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(MainActivity.this, Activity2.class); MainActivity.this.startActivity(intent); } }); } //Activity创建或者从后台重新回到前台时被调用 @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart called."); } //Activity从后台重新回到前台时被调用 @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart called."); } //Activity创建或者从被覆盖、后台重新回到前台时被调用 @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume called."); } //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.i(TAG, "onWindowFocusChanged called."); } //Activity被覆盖到下面或者锁屏时被调用 @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause called."); //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据 } //退出当前Activity或者跳转到新Activity时被调用 @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop called."); } //退出当前Activity时被调用,调用之后Activity就结束了 @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestory called."); } /** * Activity被系统杀死时被调用. * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. * 在onPause之前被调用. */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("param", param); Log.i(TAG, "onSaveInstanceState called. put param: " + param); super.onSaveInstanceState(outState); } /** * Activity被系统杀死后再重建时被调用. * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后. */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { param = savedInstanceState.getInt("param"); Log.i(TAG, "onRestoreInstanceState called. get param: " + param); super.onRestoreInstanceState(savedInstanceState); }
Activity2的代码:
private static final String TAG = "Activity2"; private Context context = this; private int param = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate called."); Button button = (Button)findViewById(R.id.setting_network); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); } //Activity创建或者从后台重新回到前台时被调用 @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart called."); } //Activity从后台重新回到前台时被调用 @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart called."); } //Activity创建或者从被覆盖、后台重新回到前台时被调用 @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume called."); } //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.i(TAG, "onWindowFocusChanged called."); } //Activity被覆盖到下面或者锁屏时被调用 @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause called."); //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据 } //退出当前Activity或者跳转到新Activity时被调用 @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop called."); } //退出当前Activity时被调用,调用之后Activity就结束了 @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestory called."); } /** * Activity被系统杀死时被调用. * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. * 在onPause之前被调用. */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("param", param); Log.i(TAG, "onSaveInstanceState called. put param: " + param); super.onSaveInstanceState(outState); } /** * Activity被系统杀死后再重建时被调用. * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后. */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { param = savedInstanceState.getInt("param"); Log.i(TAG, "onRestoreInstanceState called. get param: " + param); super.onRestoreInstanceState(savedInstanceState); }
最后盗生命周期流程图一张
相关文章推荐
- android:ellipsize="end" 失效或者 相关的Bug
- Android笔记(二十二) Android中的GridView
- Android studio dabao
- Android系统自带样式(android:theme)详解
- android studio 编程中用到的快捷键
- Android应用Design Support Library完全使用实例
- android studio下导入.so库
- Android Studio系列-签名打包
- Android 常用API
- android中自定义View设置属性
- 正确使用SQLCipher来加密Android数据库
- Android内存泄露案例分析
- Android短信接口开发经验及具体开发实现
- Android 布局文件中出现两个framelayout布局重叠,如何让下层不响应事件
- Android Studio使用笔记
- android 全局activity跳转动画(自右向左)
- android shape属性及使用说明
- android:layout_gravity和android:gravity属性的区别
- Android大图片裁剪终极解决方案(上:原理分析)
- Android自定义ListView实现分页加载