Android有四大组件,可以理解为四根脊柱,分别为Activity(活动)、Service(服务)、BroadcastReceiver(广播)、ContentProvider(内容提供者)。而作为我们学习Android过程中的第一个接触到的组件Activity,让我们仔细了解一下。Activity又称活动,为什么叫活动呢,是和用户交互最频繁的组件,也是应用中我们能看到各种各样的控件的依托。至于为什么Activity要叫活动呢?请看英语词典。而Google开发者为什么要将其命名为Activity,我想是因为其特性,和用户频繁交互,本身也包含万千。
一、我们先从生命周期开始了解Activity。
这是一张Activity生命周期的概括图,为了能更好、更深刻的了解这张图的含义,我们实际上手去测试一下。从多个操作流程中总结结论。
(1)、新建一个Module,名为“study_activity”,默认首页为MainActivity,将生命周期各个方法log打印后,运行程序。Logcat如下:
当我们在MainActivity页面按下返回键时,Logcat如下:
重新启动项目后,我们这次在MainActivity页面按下Home键,Logcat如下:
再次点击应用图标打开项目,Logcat如下:
以上得出结论如下:
•当Activity启动时会调用生命周期中的onCreate(),onStart(),onResume()方法。
•在当前Activity按下返回键时会调用生命周期中的onPause(),onStop(),onDestroy()方法。
•在当前Activity按下Home键时会调用生命周期中的onPause(),onStop()方法。
•在当前Activity按下Home键后重新打开该Activity会调用生命周期中的onRestart(),onStart(),onResume()方法。
(2)、新建一个Activity——AActivity,测试MainActivity和AActivity交互时的Activity。当由MainActivity跳转到AActivity时,Logcat如下:
此时按下Home键,Logcat如下:
重新打开应用,Logcat如下:
此时按下返回键,Logcat如下:
以上得出结论如下:
•由Activity1跳转到Activity2时,会调用Activity1的onPause()—>Activity2的onCreate(),onStart(),onResume() —>Activity1的onStop()。
•在当前Activity操作时没有对跳转来的Activity的生命周期造成影响。
•由Activity2返回到Activity1时,会调用Activity2的onPause()—>Activity1的onRestart(),onStart(),onResume() —>Activity2的onStop(),onDestroy()。
(3)、此时我们再新建一个背景完全透明的Activity——BActivity,观察一下由MainActiivty跳转到BActivity的生命周期,Logcat如下:
此时我们按下Home键,Logcat如下:
重新打开应用,Logcat如下:
此时按下返回键,Logcat如下:
以上得出结论如下:
•由Activity1跳转到透明的Activity3时,会调用Activity1的onPause()—>Activity3的onCreate(),onStart(),onResume()。
•在当前Activity操作时对跳转来的Activity的生命周期造成了影响。
•由Activity3返回到Activity1时,会调用Activity3的onPause()—>Activity1的onResume() —>Activity3的onStop(),onDestroy()。
我们将以上实验结论归纳整理,对各个方法的总结如下:(声明两个概念,可见:用户能看的见但是还不能操作,前台:用户能看见也能操作。)
onCreate:初始化方法,是Activity声明周期中的起点,在其中可以做一切初始化配置,例如setContentView加载布局等,其在整个声明周期中只调用了一次。是不可见的,可以利用动画的初始化做可见性测试。
onStart:Activity生命周期的第二个方法。此时Activity已经可见了(通过第三次实验我们能看出,onStart是可见的,而onResume是前台的),但是还没出现在前台。当Activity已经调用onStop方法但是还没有Destroy时,重新载入该页面会调用onRestart方法并重走onStart方法。
onResume:此时Activity已经出现在前台并且可见,当Activity调用了onPause方法却没有Stop时,页面重新载入会调用该方法,我们可以将一些页面的刷新机制放在该方法中。
onPause:只要当前Activity暂停就会调用该方法,该方法可见但不在前台。一般情况下不需要在该方法中做任何处理,也不能在该方法中做耗时的操作,不然会导致Activity强制关闭。
onStop:此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。我们可以将一些暂停工作和资源回收工作放在这里。
onDestroy:Activity生命周期中的最后一个方法,不可见,此时我们将资源的释放工作放在这里,并回收。。
onRestart:当Activity处于Stop状态中,重新调起该Activity时,先调用该方法,并通过该方法调用onStart方法,Activity在这时可见,这里一般不做什么操作。