本文共 8086 字,大约阅读时间需要 26 分钟。
官方给的解释:An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.
Activity就是一个为用户提供可以和其他事物进行交互的屏幕的组件,例如:打电话、拍照、发送邮件、浏览地图等等。这是官方给出的Activity生命周期的思维导图,Activity的整个生命周期都是依赖onCreate(),onStart(),onResume(),onPause(),onStop(),onDestory(),onRestart()这7个方法来完成。 举个栗子 创建一个最简单的Android程序,该程序只有一个Activity,程序运行时打开Activity,点击back键关闭Activity。这个过程就会将6个方法全部调用一遍。详情如下: 在加载程序时,依次调用onCreate()创建Activity;onStart()启动Activity;onResume()使得Activity可见。 back键关闭Activity时依次调用onPause()暂停Activity;onStop停止Activity但不释放资源;onDestory()销毁Activity。
举几个实实在在的栗子
创建一个只有一个Activity的Android程序,命名ActivityLifeCycleTest,并重写7个方法(这里不会用到onRestart方法,但是先写上),在每个方法中打印日志,代码如下public static final String TAG = "lifecircle"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "MainActivity onCreate"); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "MainActivity onStart"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "MainActivity onResume"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "MainActivity onPause"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "MainActivity onStop"); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "MainActivity onRestart"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "MainActivity onDestroy"); }
然后运行程序,查看logcat中的日志(查看前先设置一下日志过滤器),如下图
01-28 15:19:28.811 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onCreate01-28 15:19:28.913 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onStart01-28 15:19:28.913 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onResume
根据日志可知,当加载一个Activity依次调用onCreate(),onStart(),onResume()
然后点击back键,关闭Activity,log如下............01-28 15:24:47.101 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onPause01-28 15:24:47.535 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onStop01-28 15:24:47.536 28369-28369/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onDestroy
所以,关闭Activity时依次执行onPause(),onStop(),onDestory().
接下来点儿复杂滴 在项目中新建一个Activity,命名为NormalActivity,从MainActivity中跳转过去,在NormalActivity中也重写6个方法。代码如下public static final String TAG = "lifecircle"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "NormalActivity onCreate"); setContentView(R.layout.activity_normal); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "NormalActivity onStart"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "NormalActivity onResume"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "NormalActivity onPause"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "NormalActivity onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "NormalActivity onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "NormalActivity onRestart"); }
现在重新运行程序,使用intent跳转到NormalActivity(代码略过),查看log
............01-28 15:42:38.994 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onPause01-28 15:42:39.028 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity onCreate01-28 15:42:39.038 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity onStart01-28 15:42:39.038 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity onResume01-28 15:42:39.564 18105-18105/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onStop
首先调用MainActivity的onPause方法将其暂停,然后三部曲创建NormalActivity,然后再onStop掉MainActivity,(这里为什么不直接onStop掉MainActivity再创建NormalActivity,因为伟大的Android开发者早已想到万一NormalActivity创建失败,MainActivity还可以继续使用,避免出现黑屏,影响用户体验),此时MainActivity并没有销毁,仍然保存在内存中,如果此时内存不足,系统会将其销毁。既然没有销毁,自然是可以恢复的,恢复就需要调用onRstart方法,按back键返回MainActivity,查看log
............01-28 15:53:27.319 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity onPause01-28 15:53:27.334 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onRestart01-28 15:53:27.336 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onStart01-28 15:53:27.336 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onResume01-28 15:53:27.698 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity onStop01-28 15:53:27.698 7680-7680/com.activitylifecycletest.app.activity I/lifecircle: NormalActivity onDestroy
先暂停NormalActivity,然后执行onRestart方法,重启MainActivity,不需要重新创建,最后销毁掉NormalActivity。
如果不是跳转到另一个普通的Activity,而是启动一个弹出框会怎样呢?
创建一个DialogActivity,重写7个方法,代码如下public static final String TAG = "lifecircle"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dialog); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "DialogActivity onStart"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "DialogActivity onResume"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "DialogActivity onPause"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "DialogActivity onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "DialogActivity onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "DialogActivity onRestart"); }
运行程序,启动DialogActivity(启动代码省略),查看log
............01-28 16:11:12.277 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onPause01-28 16:11:12.313 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity onStart01-28 16:11:12.313 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity onResume
此时MainActivity只是暂停,并不会stop,此时Activity处于前面所说的第二种状态:Paused;按back键返回,查看log
......01-28 16:14:05.881 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity onPause01-28 16:14:05.911 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: MainActivity onResume01-28 16:14:05.960 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity onStop01-28 16:14:05.960 1854-1854/com.activitylifecycletest.app.activity I/lifecircle: DialogActivity onDestroy
此时只需调用onResume方法,即可返回到MainActivity。
项目源码下载地址
Github: CSDN: