Activity的生命周期
2015-11-22 17:22
274 查看
Activity生命周期的回调方法:
这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)
1. Activity的entire lifetime(全部的生命期)发生在调用onCreate()和调用onDestory()之间。
在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
2. Activity的visible lifetime(可见的生命期)发生在调用onStart()和onStop()之间。
在这个期间,用户能在屏幕上看见Activity,和它进行交互。
系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
3. Activity的foreground lifetime (前台的生命期)发生在调用onResume()和onPause()之间。
在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
一个Activity能频繁的在前台进入和出去之间转变。
下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:
下面就根据上面的过程图进行说明:
activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道。
通过上图的我们可以看出activity从running状态跳转到onPause状态的原因是:Another activity comes into the foreground. 也就是说有另外一个actvity被启动并运行了,比如说MainActivity通过startActivity启动了SecondActivity,那么SecondActivity就在ui视图的最顶层了,而MainActivity不再是最顶层的activity了,此时就会onPause了,此时我们依稀还能看到MainActivity,只是MainActivity已经站在他人之后了。
而当MainActivity完全被SecondActivity挡住,完全看不见的时候,此时MainActivity就会onStop了。我们看看上图从onPause到onStop的原因是:the activity is no longer visiable.
也就是说此时MainActivity完全不可见了,从这里我们可以猜测当按下home键的时候,当前activity就会处于onStop的状态。
从actvitiy的生命周期图中,我们可以看出activity是可以停留在onPause和onStop在这两个状态上的,因为可以相应的恢复。
对图中最左侧的箭头指示的解释:
当MainActivity处于onPause和onStop状态时,当更高优先级的apps需要内存,而此时系统内存不够了,那么android系统就会将MainActivity所在的进程给杀了以释放资源。
当然被杀了之后,想重生,那必须得从头来过:onCreate ---> onStart() ---> onResume().
总结:
onCreate: 在这里创建界面,做一些数据的初始化的工作
onStart: 到这一步变成用户可见不可交互的
onResume: 变成和用户可交互的
onPause: 到这一步是可见不可交互的,系统会停止动画等消耗CPU的事情,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统回收。 在这里保存的数据,应该在onResume里读出来。(注意:这个方法里做的事情时间要短,因为下一个activity不会等这个方法完成才启动)
onStop: 变得不可见,被下一个activity覆盖了(onPause 和 onStop的区别为是否可见)
onDestroy :这是activity 被干掉之前最后一个被调用的方法了。
下面通过一个Demo来学习以下Activity的生命周期。
Demo很简单,就只有两个Activity,MainActivity和SecondActivity和一个按钮。点击按钮,由MainActivity跳转到SecondActivity。
MainActivity:
1. 运行应用,MainActivity运行。
可以看出一个Activity运行调用的回调方法是: onCreate()->onStart()->onResume()
2. 点击跳转按钮,由MainActivity跳转到SecondActivity:
1>SecondActivity是Dialog。
由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。
2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)
再点击跳转按钮:
对于MainActivity,由于不可见,状态由运行变为停止。
依次调用了它的回调方法: onPause()->onStop()
3.Activity处于运行状态时,点击返回按钮:
点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法: onPause()->onStop()->onDestroy()
4.Activity处于运行状态,点击主页按钮,返回桌面:
Activity由运行状态变为停止状态,依次调用它的回调方法: onPause()->onStop()
5.Activity处于停止状态,即由桌面返回到Activity:
停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()
6.Activity处于运行状态,旋转屏幕:
可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。
运行->暂停->停止->死亡->运行
依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()
7.Activity处于运行状态,手机此时锁屏:
可以看出,手机锁屏,此时由于Activity不可见,会进入停止状态。
依次调用回调方法:onPause()->onStop()
8.当应用正在运行时,手机锁屏,然后解锁回到应用界面:
可以看出应用从停止状态恢复到运行状态。
依次调用回调方法:onRestart()->onStart()->onResume()
参考:http://www.cnblogs.com/JohnTsai/p/4052676.html http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html
//创建Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //Activity快要变成可见的 @Override protected void onStart() { super.onStart(); } //Activity变成可见的,处于运行状态 @Override protected void onResume() { super.onResume(); } //其他Activity获得用户焦点,(Activity快要暂停了) @Override protected void onPause() { super.onPause(); } //Activity不再可见,处于停止状态 @Override protected void onStop() { super.onStop(); } //Activity快要被销毁了 @Override protected void onDestroy() { super.onDestroy(); } }
这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)
1. Activity的entire lifetime(全部的生命期)发生在调用onCreate()和调用onDestory()之间。
在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
2. Activity的visible lifetime(可见的生命期)发生在调用onStart()和onStop()之间。
在这个期间,用户能在屏幕上看见Activity,和它进行交互。
系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
3. Activity的foreground lifetime (前台的生命期)发生在调用onResume()和onPause()之间。
在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
一个Activity能频繁的在前台进入和出去之间转变。
下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:
下面就根据上面的过程图进行说明:
activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道。
通过上图的我们可以看出activity从running状态跳转到onPause状态的原因是:Another activity comes into the foreground. 也就是说有另外一个actvity被启动并运行了,比如说MainActivity通过startActivity启动了SecondActivity,那么SecondActivity就在ui视图的最顶层了,而MainActivity不再是最顶层的activity了,此时就会onPause了,此时我们依稀还能看到MainActivity,只是MainActivity已经站在他人之后了。
而当MainActivity完全被SecondActivity挡住,完全看不见的时候,此时MainActivity就会onStop了。我们看看上图从onPause到onStop的原因是:the activity is no longer visiable.
也就是说此时MainActivity完全不可见了,从这里我们可以猜测当按下home键的时候,当前activity就会处于onStop的状态。
从actvitiy的生命周期图中,我们可以看出activity是可以停留在onPause和onStop在这两个状态上的,因为可以相应的恢复。
对图中最左侧的箭头指示的解释:
当MainActivity处于onPause和onStop状态时,当更高优先级的apps需要内存,而此时系统内存不够了,那么android系统就会将MainActivity所在的进程给杀了以释放资源。
当然被杀了之后,想重生,那必须得从头来过:onCreate ---> onStart() ---> onResume().
总结:
onCreate: 在这里创建界面,做一些数据的初始化的工作
onStart: 到这一步变成用户可见不可交互的
onResume: 变成和用户可交互的
onPause: 到这一步是可见不可交互的,系统会停止动画等消耗CPU的事情,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统回收。 在这里保存的数据,应该在onResume里读出来。(注意:这个方法里做的事情时间要短,因为下一个activity不会等这个方法完成才启动)
onStop: 变得不可见,被下一个activity覆盖了(onPause 和 onStop的区别为是否可见)
onDestroy :这是activity 被干掉之前最后一个被调用的方法了。
下面通过一个Demo来学习以下Activity的生命周期。
Demo很简单,就只有两个Activity,MainActivity和SecondActivity和一个按钮。点击按钮,由MainActivity跳转到SecondActivity。
MainActivity:
package com.example.activitytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button btn; private static final String TAG = "ActivityTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "MainActivity onCreate"); setContentView(R.layout.activity_main); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } }); } @Override protected void onPause() { Log.d(TAG, "MainActivity onPause "); super.onPause(); } @Override protected void onResume() { Log.d(TAG, "MainActivity onResume "); super.onResume(); } @Override protected void onStart() { super.onStart(); Log.d(TAG,"MainActivity onStart "); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "MainActivity onStop "); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "MainActivity onDestroy "); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "MainActivity onRestart "); } }SecondActivity:
package com.example.activitytest; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class SecondActivity extends Activity { private static final String TAG = "ActivityTest"; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.second_layout); super.onCreate(savedInstanceState); Log.d(TAG,"SecondActivity onCreate"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "SecondActivity onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "SecondActivity onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "SecondActivity onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "SecondActivity onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "SecondActivity onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "SecondActivity onRestart"); } }
1. 运行应用,MainActivity运行。
可以看出一个Activity运行调用的回调方法是: onCreate()->onStart()->onResume()
2. 点击跳转按钮,由MainActivity跳转到SecondActivity:
1>SecondActivity是Dialog。
由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。
2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)
再点击跳转按钮:
对于MainActivity,由于不可见,状态由运行变为停止。
依次调用了它的回调方法: onPause()->onStop()
3.Activity处于运行状态时,点击返回按钮:
点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法: onPause()->onStop()->onDestroy()
4.Activity处于运行状态,点击主页按钮,返回桌面:
Activity由运行状态变为停止状态,依次调用它的回调方法: onPause()->onStop()
5.Activity处于停止状态,即由桌面返回到Activity:
停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()
6.Activity处于运行状态,旋转屏幕:
可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。
运行->暂停->停止->死亡->运行
依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()
7.Activity处于运行状态,手机此时锁屏:
可以看出,手机锁屏,此时由于Activity不可见,会进入停止状态。
依次调用回调方法:onPause()->onStop()
8.当应用正在运行时,手机锁屏,然后解锁回到应用界面:
可以看出应用从停止状态恢复到运行状态。
依次调用回调方法:onRestart()->onStart()->onResume()
参考:http://www.cnblogs.com/JohnTsai/p/4052676.html http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html
相关文章推荐
- java中Filefilter和Filenamefilter的区别
- LeetCode 064 Minimum Path Sum
- 规范数据库表字段大小写 小写字段名全部更改为大写
- 20135303魏昊卿家庭作业汇总2.64 2.65 3.57 3.64 4.45
- Linux 内核配置和编译
- learn go passing variable-length arguments
- ajax基础
- 【C语言】【笔试题】模拟实现memcmp
- Javah提示未找到 ..的类文件
- hdu 4786 Fibonacci Tree
- UIBezierPath绘制图形
- [LeetCode]Binary Tree Postorder Traversal
- 前端问题
- 我的程序人生_杂谈 X86,WINDOWS,ARM,ANDROID
- CDN
- intellij 关于国际化文件中文乱码
- 在CentOS 6.6 64bit上安装Python 3.5.0
- 【纸牌屋】第二季3
- 程序员都会的35个jQuery小技巧
- Android中外部,内部文件读写