一 介绍

Activity是android中使用最为频繁的组件,在官方文档中是这样描述的:An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).

一个activity就是一个单一的可以与用户进行交互的东西,或者说界面,几乎所有的Activity都要和用户进行交互,Activtity的重要性就很明显了,所有每一个Android童鞋都应该掌握它。今天了解的是Ativity的生命周期。

二 正常情况下的生命周期

正常情况下的生命周期就是我们使用中,Activity经过的生命周期.下面是官网給的Activity生命周期的图,使用它可以帮助我们更直观的理解Activity的生命周期

正常情况下,Activity会经历如下声明周期:

1 onCreate : 该方法表示Activity正在被创建,在这个方法里可以做一些初始化的工作,setContentView去加载布局,通过findViewById获得要操作的控件,以及初始化数据等操作。

2 onReStart : 表示Activity正在重新启动,当Activity从不可见变为可见状态的时候,该方法就会被调用,比如你打开了一个新的Activity,此时当前的Activity就会执行onPause和onStop方法,接着当我们按返回键的时候,就会调用此方法.

3 onStart : 表示Activity正在被启动,此时Activity已经可见了,只是没有出现在前台界面,不能和用户进行交互,比如点击事件之类的

4 onResume : 表示Activity已经可见并且可以进行用户交互。注意和onStart方法的区别

5 onPause : 表示Activity正在停止。该方法被调用的情况一般是当前Activity变为不可见状态的时候.

6 onStop : 表示Activity 即将停止。该方法被调用的情况一般是当前Activity变为不可见状态的时候.

7 onDestory : 表示Activity 即将被销毁,我们可以在这里做一些回收工作和资源释放.

三 正常情况下的生命周期例子

说了那么多,我们自己写一个例子,可以更好的理解。在android studio中新建两个Activity:MainActivity和Main2Activity(as会默认为我们创建好MainActivity )

MainActivity代码如下:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "lifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, this.getLocalClassName() + ":onCreate");
} @Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,this.getLocalClassName()+":onRestart");
} @Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getLocalClassName() + ":onStart");
} @Override
protected void onResume() {
super.onResume();
Log.d(TAG, this.getLocalClassName() + ":onResume");
} @Override
protected void onPause() {
super.onPause();
Log.d(TAG, this.getLocalClassName() + ":onPause");
} @Override
protected void onStop() {
super.onStop();
Log.d(TAG, this.getLocalClassName() + ":onStop");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, this.getLocalClassName() + ":onDestroy");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
} public void click(View view) {
startActivity(new Intent(this,Main2Activity.class));
}
}

Main2Activity代码如下:

public class Main2Activity extends AppCompatActivity {

    private static final String TAG = "lifecycle";

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Log.d(TAG, this.getLocalClassName() + ":onCreate");
} @Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, this.getLocalClassName() + ":onRestart");
} @Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getLocalClassName() + ":onStart");
} @Override
protected void onResume() {
super.onResume();
Log.d(TAG, this.getLocalClassName() + ":onResume");
} @Override
protected void onPause() {
super.onPause();
Log.d(TAG, this.getLocalClassName() + ":onPause");
} @Override
protected void onStop() {
super.onStop();
Log.d(TAG, this.getLocalClassName() + ":onStop");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, this.getLocalClassName() + ":onDestroy");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main2, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
}

上面的代码很清楚了,就是重写了Activity生命周期的各个方法,然后用log打印出来。下面启动MainActivity,log日志打印如下:



可以看到我们MainActivity启动的时候经过的生命周期: onCreate ——>onStart——>onResume

我们点击toMain2按钮进入Main2Activity,log日志打印如下



可以看到log打印了MainActivity执行了onPause->onStop方法,变为不可见了,Main2Activity就和上面的情况一样了。

此时我们在Main2Activity点击回退按钮再查看log信息:



可以看到log打印了Main2Activity执行了onPause->onStop->onDestroy方法,

MainActivity由于还在任务stack中所以执行 onRestart->onStart->onResume,结合上面的图就很好理解了。

我们在MainActivity中再次点击back回退,log如下:



此时MainActivity变为不可见,最后被销毁了.onPause->onStop->onDestory

对于上面的生命周期, onCreate对应于onDestroy,创建与销毁,onStart对应onStop,表示了Activity的是否可见,而onResume对应于onPause,

这里需要注意,onStart,onStop是对应于Activity是否可见来说的,而onResume于onPause是从Activity是否位于前台来说的

注意上面的log,Main2启动之前总是Main已经执行了onPause方法之后。

四 异常情况下的生命周期

异常情况主要是指系统资源相关的配置发生了改变,或者系统内存不足Activity被杀死的情况

系统配置发生改变最常见的就是横竖屏切换了,默认情况下,横竖屏切换后由于系统配置发生了改变,Activity就会被重新创建,并且会多调用一个onSaveInstanceState来保存Activity的状态,Activity被重新创建后,会调用onRestoreInstanceState来恢复一下数据,我们可以根据这个方法是否被调用来判断Activity是否被重建了.这两个方法系统组哦了一些View的恢复工作,比如用户输入的数据,焦点等

五 异常情况下的生命周期的例子

在MainActivity中加入如下代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, this.getLocalClassName() + ":onSaveInstanceState");
} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, this.getLocalClassName() + ":onRestoreInstanceState");
}

重新启动MainActivity,然后将手机横屏显示,此时log信息如下:

可以看到的确调用了onSaveInstanceState和onRestoreInstanceState方法来保存数据和恢复数据。我们也可以在onSaveInstanceState中保存一些我们的信息,然后在onRestoreInstanceState和 onCreate中做恢复;

代码如下:

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, this.getLocalClassName() + ":onSaveInstanceState");
outState.putString("data","this is my data");
} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, this.getLocalClassName() + ":onRestoreInstanceState"+"data is "+savedInstanceState.get("data"));
}

再进行横竖屏切换后发现在onRestoreInstanceState方法中log输出了data数据.

另外一种异常情况是内存不足的时候

如果我们想要系统资源发生改变以后不重新创建, 只需要在AndroidManifest.xml 中指定android:configChanges=”orientation|screenSize”

android:configChanges可配置的参数有很多,具体的意思参考官网或其他资料查看.

到这里相信大家对Activity的生命周期已经有了很好的理解了.

深入了解Activity-生命周期的更多相关文章

  1. [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!

    转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...

  2. Activity生命周期(深入理解)

    今天看到一篇大神总结Activity的文章,内容甚为详细,特此转载http://www.cnblogs.com/lwbqqyumidi/p/3769113.html Android官方文档和其他不少资 ...

  3. Android Activity生命周期

    从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态  activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...

  4. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

  5. android Activity生命周期(设备旋转、数据恢复等)与启动模式

    1.Activity生命周期     接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...

  6. android开发------Activity生命周期

    这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...

  7. 安卓activity生命周期

    相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程. 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法, ...

  8. Activity生命周期 onCreate onResume onStop onPause (转)

    Android应用开发提高系列(6)——Activity生命周期 onCreate 和 onResume 在程序启动时候都会启动, 所有有些需要在onCreate onResume中都要实现的功能,之 ...

  9. Android总结篇系列:Activity生命周期

    Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity生命周期进行一次总结. Activity是由Activit ...

  10. Android体系结构及activity生命周期

    Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核 Android的系统架构图    每层 ...

随机推荐

  1. Spring.Net.FrameworkV3.0 版本发布了,感谢大家的支持

    Spring.Net.FrameworkV3.0 版本发布了,感谢大家的支持. Spring.Net.Framework,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开 ...

  2. Entity Framework Code First ---EF Power Tool MySql

    关于如何使用EF Power Tool的介绍请看 http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html, 这里 ...

  3. (转)ubuntu安装opengl

    $ sudo apt-get install build-essential 安装OpenGL Library接下来要把我们会用到的 Library 装上去,首先安装 OpenGL Library $ ...

  4. 介绍WEB站点结构

    在这节里,我们将抛开Umbraco来看看已创建的站点.在我们介绍Umbraco之前,需要了解站点是如何工作的,如何使用使用浏览器工具. 我们看到在标签顶端的内容叫做页面标题.每个页面的标题都会改变表示 ...

  5. Hadoop入门进阶课程12--Flume介绍、安装与应用案例

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  6. 免费素材下载:iOS 8 矢量 UI 素材套件

    小伙伴们,苹果终于在今天凌晨推送了 iOS 8 的正式版.虽然该系统并未与 iPhone6 发布会同时亮相,但对于已经提前体验尝鲜过测试版的同学来说并不陌生.iOS 8 几乎每个图标都进行了重新设计, ...

  7. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...

  8. Scrum 3.1 多鱼点餐系统开发进度(第三阶段项目构思与任务规划)

    Scrum 3.1 多鱼点餐系统开发进度(第三阶段项目构思与任务规划) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到 ...

  9. 6/13 sprint2 看板和燃尽图的更新

  10. SQL Server中的连接查询【内连接,左连接,右连接,。。。】

    在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...