深入剖析Android四大组件(一)——Activity生命周期具体解释
1.管理Activity的生命周期
不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期。
①Activity的3种状态
通过回调方法来管理Activity的生命周期对于开发一个健壮而且灵活的应用程序是很关键的。
Activity的生命周期直接影响到它与其它Activity,任务以及栈的关系。
Activity存在3种状态。各自是resumed,paused和stopped。
resumed:指Activity在屏幕前台而且拥实用户焦点的状态。这个状态有时也称为“正在执行”
paused:指还有一个Activity在屏幕前台而且拥实用户焦点的状态,但这个Activity仍然可见。即还有一个Activity在前一个Activity之上。而前一个Activity又是可见的而且部分透明或者没有覆盖整个屏幕。一个处于paused状态的Activity是全然存活的(Activity对象村中被保留,它维护全部状态和成员信息,并依旧依附窗体管理器),可是在内存极低时将被系统杀掉。
stopped:指前一个Activity被还有一个Activity全然遮蔽(前一个Activity当前在后台中)。
一个处于stopped状态的Activity仍然是存活的(这个Activity对象在内存中被保留,它维护全部状态和成员信息,但没有依附窗体管理器)。然而。它却不再显示给用户,而且在内存极低时会被系统杀掉。
假设一个Activity处于paused或stopped状态,那么系统会从内存中丢掉它。这能够通过调用它的finish()方法来实现,或者简单一点,通过杀掉它的进程来实现。
当Activity又一次打开(在它结束或者被杀掉之后)时,它就必须被又一次创建。
②实现Activity的生命周期回调
当Activity发生状态转变时,它会通过回调方法来得到通知,我们能够重写全部这些回调方法完毕适当的工作。
当Activity状态发生改变时,Activity的框架包括每个主要的生命周期方法,例如以下列代码所看到的:
@Override
public void onCreate(Bundle savedInstanceState){
//指示这个Activity正在被创建
super.onCreate(saveInstanceState);
//完毕一些任务
}
@Override
protected void onStart(){
//这个Activity正在变为可见
super.onStart();
//完毕一些任务
}
@Override
protected vodi onResume(){
//这个Activity已经变为可见
//如今是resumed状态
super.onResume();
//完毕一些任务
}
@Override
oritected void onPause(){
//还有一个Activity获得焦点并且当前的Activity失去焦点
//也就是当前Activity被还有一个Activity部分或者所有覆盖
//当前Activity失去焦点的时候调用
//这个Activity如今处于paused状态
super.onPause();
//完毕一些任务
}
@Override
protected void onStop(){
//这个Activity不再可见的时候调用
//当前Activity处于stopped状态
super.onStop();
//完毕一些任务
}
@Override
protected void onDestory(){
//这个Activity已经被销毁
super.onDestory();
//完毕一些任务
}
建议:通常,在实现这些生命周期方法时,必须先调用超类的实现(比方调用super.XXX)。综上所述,以上这些方法定义了Activity的整个生命周期。通过实现这些方法,我们就能监视Activity生命周期中的3个嵌套循环,详细例如以下所看到的。
Activity的整个生命周期发生在调用onCreate()和调用onDestory()之间。
在onCreate()中,Activity应该设置“全局”状态(比方定义布局),而且在onDestory()中释放其余资源。比如,假设Activity有一个后台执行的线程从网络上下载数据,那么它应该在onCreate()中创建这个线程,而且在onDestory()停止该线程。
Activity的可见生命周期发生在调用onStart()和调用onStop()之间。在这个过程中,用户能够看到这个Activityd在屏幕中而且能够与之交互。比如。当一个新Activity启动而且前一个Activity不再可见的时候,onStop()就被调用了。在这两个方法之间,能够维护须要显示给用户的Activity资源。比如,能够在onStart()方法中注冊一个广播接收器去监视影响UI的变化,当用户看不到显示的东西时。则在onStop()注销它。在Activity的整个生命周期中。当Activity在可见和隐藏之间切换时,系统就会多次调用onStart()和onStop()方法。
Activity的前台生命周期发生在调用onResume和调用onPause()之间。须要说明的是。在这期间,Activity在屏幕中全部其它Activity的前面而且拥实用户焦点。
普通情况下。Activity能够被频繁转换。
比如。当设备休眠或者显示一个对话框时,onPause()就会被调用。
对于以上知识,为了方便读者理解并理顺它们之间的内在关系,我们用一张图来直观地描写叙述。例如以下图:

上图为Activity生命周期的演化过程
顺便也列出一张表。描写叙述了在Activity的整个生命周期里定位的每个回调方法以及其细节,以及回调方法完毕后系统能否够停止这个Activity等。
| 方法 | 描写叙述 | 调用后能否够被杀掉 | 下一步操作 |
| onCreate() | 当Activity第一次被创建时调用。此处能够做全部的一般静态设置,比方创建视图,绑定列表数据等。
假设状态被捕捉,而且此状态存在的话。这种方法传递一个包括这个Activity的前状态的Bundle对象。 |
否 | onStart() |
| onRestart() | Activity被停止后。再次启动之前调用。 | 否 | onStart() |
| onStart() | 在Activity对用户可见之前被调用。
假设这个Activity来到前台,那么下一步操作是调用OnResume()。 |
否 | onResume()或者onStop() |
| onResume() | 在Activity開始与用户交互之前被调用。在这里,该Activity位于Activity栈顶。開始与用户交互。 须要注意的是,此时当前Activity处于resumed状态。这个状态下Activity是可见的。 |
否 | onPause() |
| onPause() | 当系统正在恢复还有一个Activity的时候被调用。这种方法通经常使用于提交未保存的数据,停止动画以及可能 消耗CPU的事情等。这些应该高效地完毕,由于下一个Activity在这种方法没有返回之前不会被执行。假设Activity回到前台,则下一步操作为调用onResume()。假设Activity变得不可见。则调用onStop(). | 是 | onResume()或者onStop() |
| onStop() | 当Activity对用户不再可见的时候调用。
这会发生,是由于它正在被销毁或者还有一个Activity(能够是已经存在的或者新的)被执行而且覆盖了它。 |
是 | onRestart()或者onDestory() |
| onDestory() | 该Activity被销毁之前调用。这个Activity收到的终于调用。它能够是由于Activity正在结束(调用finish()),或者是由于心痛为保护空间而面临销毁这个Activity的实例而调用。能够通过isFinishing()方法区分这两种情况。 | 是 | 无 |
2.保存和协调Activity
①保存Activity状态
取而代之的是。假设用户再次导航到这里,系统就必须又一次创建这个Activity对象,可是用户不知道系统已经销毁了该Activity而如今又又一次创建了它。因此,用户可能觉得这个Activity就是之前的那个Activity。在这样的情况下,我们能够通过实现一个附加的同意保存我们Activity状态信息的回调方法,而将关于Activity状态的重要信息保留下来,然后当系统又一次创建这个Activity的时候,再去又一次存储它。
那么,假设系统停止掉Activity进程。而且用户又又一次启动该Activity,那么系统进程会将这个Bundle对象传递给onCreate(),这样就能够恢复onSaveInstanceState()中保存的Activity状态了。假设没有为恢复的状态信息,那么传给onCreate()的Bundle对象则是null。


②协调Activity
以下给出了Activity A启动Activity B的顺序。
比如。假如必需要写数据库,则当第一个Activity停止的时候,那么紧跟着的Activity就能够读取那个停止了的Activity。这种话,我们就应该在onPause()中而不是在onStop()中写数据库。
3.用实例说话
这个实例很easy,它包括两个Activity,它们都实现了全部的生命周期回调接口,而且还实现了相关的Activity状态保存与状态恢复的回调方法。此外。我们还能够从一个Activity导航到还有一个Activity上。详细的操作过程例如以下所看到的。
①创建一个名为ActivityLife的project。包名为helloworld.liyuanjing.example.com.activitylife。
创建完毕后,我们就在原有的基础上加入一个新类SecondActivity,它继承自Activity类。
此时Androidproject中就拥有两个Java代码文件,它们各自是MainActivity.java和SecondActivity.java。如今。这两个代码都实现生命周期的全部方法。并在各个方法中加入日志。加入日志的方法例如以下:
Log.e(TAG, message);
②将新增的类SecondActivity声明到AndroidManifest.xml文件里去,这一步很重要。假设没有这一步,就无法启动SecondActivity。声明代码例如以下:
<activity android:name=".SecondActivity"></activity>
在AndroidManifest.xml中声明一个Activity有相当多的讲究,这里仅仅做简单配置上去,从而使得我们的Activity能够正常启动。如需深入清单文件能够到http://blog.csdn.net/column/details/androidmanifest.html该专栏下一探到底。
再者,为了实现从MainActivity上启动SecondActivity,我们须要在默认的布局文件(activity_main)中加入一个button。
而且实现它的单击事件。在该事件中。启动SecondActivity。改动后的布局代码例如以下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/mybut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="To SecondActivity"/>
</LinearLayout>
改动后的MainActivity的代码例如以下:
public class MainActivity extends Activity {
public static final String TAG="MainActivity";
private Button mybut=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "MainActivity::onCreate()");
this.mybut=(Button)findViewById(R.id.mybut);
this.mybut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "MainActivity::onStart()");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "MainActivity::onResume()");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "MainActivity::onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "MainActivity::onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "MainActivity::onDestroy()");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "MainActivity::onSaveInstanceState()");
}
}
SecondActivity的代码例如以下:
public class SecondActivity extends Activity {
public static final String TAG="SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "SecondActivity::onCreate()");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "SecondActivity::onResume()");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "SecondActivity::onStart()");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "SecondActivity::onPause()");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "SecondActivity::onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "SecondActivity::onDestroy()");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "SecondActivity::onSaveInstanceState()");
}
}
③编译执行project,注意观察日志。等到应用程序展现出来的时候,就能够观察到例如以下图所看到的的日志信息:

出现这种界面就说明,一个Activity从启动到展示完毕经历了从onCreate()到onStart()。在再到onResume的3个阶段。
④单击“导航”button,也就是布局文件那个button,启动SecondActivity,看看有什么样的日志输出,例如以下图:

此时。SecondActivity就呈现出来了。而原来的MainActivity则被SecondActivity覆盖掉而不再拥实用户焦点。因此,可得出以下的3个结论。
ⅠMainActivity的onPause()方法被调用。
ⅡSecondActivity将会经历与MainActivity一样的显示过程。
Ⅲ当完毕SecondActivity的展现后,MainActivity保存的回调接口(onSaveInstanceState())就被调用。接着还会调用MainActivity的onStop()方法。
⑤按BACK键返回到原来的Activity,看看会发生什么?例如以下图:

从上图可知。发生了以下4件事情。
ⅠSecondActivity的onPause方法被调用。指示它即将被暂停。
Ⅱ因为MainActivity是以前被创建的Activity,因此这里仅仅调用了它的onStart()以及onResume()方法来完毕Activity的又一次展现。
ⅢSecondActivity完毕了生命周期而被销毁。
在这个过程中。它经历了停止和销毁两个生命周期。这也就意味着当须要它又一次显示的时候,仅仅能从又一次创建開始了。
Ⅳ假设此次再次按下BACK键,则MainActivity也将被销毁。相同,它的onStop()以及onDestory()也会被依次调用。
深入剖析Android四大组件(一)——Activity生命周期具体解释的更多相关文章
- Android 四大组件之Activity生命周期
写这篇博文之前,已经对android有一定的了解和认识.这篇博文主要讲述android的Activity的生命周期,这是android开发者必须掌握的知识.android的Activity组件拥有7个 ...
- Android四大组件之---activity生命周期详解
废话不多说, 先来一张Google提供的一张经典的生命周期流程图: 有的朋友可能看英文的有点费劲,再提供一张中文版的 O(∩_∩)O 相信已经很多人对这张图再熟悉不过了,下面笔者按照自己的理解并结合 ...
- 四大组件之Activity——生命周期
1.完整的Activity生命周期 包括onCreate() -> onStart() -> onResume() -> onPause() -> onStop -> o ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)
如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com ...
- 【Android开发日记】之入门篇(四)——Android四大组件之Activity
在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- Android 四大组件之 Activity(一)
1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...
随机推荐
- MySQL的DML和DQL 增删改查
DML和DQL 增删改查 SELECT * FROM grade --新增 insert -- 向年级表中新增3条数据INSERT INTO grade(gradeID,gradeName) VA ...
- 再战primer——decltype 和引用
刷primer看到原文讲到"引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外.",我很是好奇. 这个“引用”当然是指引用类型,like this: ; i ...
- Jquery 《不想工作系列》--整理一下append、prependTo、after的区别
还有其他类似方法,以后再加,直接上代码和图 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &q ...
- Android RecyclerView使用 及 滑动时加载图片优化方案
1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...
- JS高级——作用域链
基本概念 1.只要是函数就可以创造作用域 2.函数中又可以再创建函数 3.函数内部的作用域可以访问函数外部的作用域 4.如果有多个函数嵌套,那么就会构成一个链式访问结构,这就是作用域链 <scr ...
- (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)
http://blog.csdn.net/u012453843/article/details/70184155 上节课我们一起学习了怎样解决KindEditor富文本编辑器上传图片的浏览器兼容性问题 ...
- illumina测序原理
一些常用基本概念的介绍: flowcell流动池 是指Illumina测序时,测序反应发生的位置,1个flowcell含有8条lane lane通道 每一个flowcell上都有8条泳道,用于测序反应 ...
- cesium的学习
一.学习资料:http://cesiumjs.org/tutorials.html,看完6个教程后对图层加载.控件控制开关.地形数据叠加.模型添加.相机控制.图形绘制有一点了解.这也是cesium的主 ...
- 发布自己的nuget包
1.先到www.nuget.org注册账户,然后在用户中心获取apikey 2.到https://dist.nuget.org/index.html下载最新的nuget.exe,放到你的项目根目录下 ...
- Git学习总结三(工作区和暂存区、撤销修改)
工作区和暂存区 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 版本库(Repository) 工作区有一个隐藏目录.git, ...