首页 Java java教程 Android开发中Activity的生命周期及加载模式详解

Android开发中Activity的生命周期及加载模式详解

Jan 07, 2017 pm 03:27 PM

本文给大家介绍Activity的生命周期,如果大家学习过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似。生命周期,并不难理解。一个人的生命周期莫过于生老病死,花儿的生命周期就是花开花谢了。在Android中Activity的生命周期莫过于Activity的创建到消亡的过程了。本篇博客就会介绍Activity生命周期中的不同阶段,通过实例的形式来窥探一下Activity的生命周期。搞明白Activity的生命周期是至关重要的,因为只有搞明白每个生命周期的每个阶段,你才能在不同段做不同的事情。

接下来我们将通过一个实例来介绍Activity的生命周期,在这个Demo中会有一个MainActivity, MainActivity就是App启动后第一个显示的Activity。在MainActivity上有一个按钮,点击这个按钮就会跳转到SecondActivity,点击返回键就会从SecondActivity中返回到MainActivity中,再点击返回键就会退出App。通过这一些列的Activity的切换,我们将通过打印Log的方式来进行观察Activity的生命周期。

一.代码编写

其实这篇博客的代码是非常简单的,就是重写Activity生命周期不同阶段的方法,然后在方法中进行Log的打印,从而来标记这个生命周期的阶段。而Demo的UI也是灰常的简单的,所以Activity的layout文件就不做过多的赘述了。接下来看一下两个Activity中的关键代码。

1.下方的代码是MainActivity中的关键代码,对Activity生命周期的不同阶段进行重写,然后打印日志,标记出是哪个Activity中的哪个方法。在onCreate()方法中通过id获取Button, 然后给按钮绑定上单击事件,点击button时跳转到SecondActivity中。具体代码如下。

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("lifeCycle", "MainActivity: 我是onCreate方法,我会在Activity第一次被创建是调用");
    Button jumpButton = (Button) findViewById(R.id.jump_second_button);
    jumpButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        //跳转到SecondActivity
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
      }
    });
  }
  //Ctrl + O 选择父类中的方法进行重写
  @Override
  protected void onStart() {
    super.onStart();
    Log.d("lifeCycle", "MainActivity: 我是onStart方法,我会在Activity由不可见变为可见时调用");
  }
  @Override
  protected void onResume() {
    super.onResume();
    Log.d("lifeCycle", "MainActivity: 我是onResume方法,我在Activity处于运行状态时调用");
  }
  @Override
  protected void onPause() {
    super.onPause();
    Log.d("lifeCycle", "MainActivity: 我是onPause方法,我会在Activity暂停时调用");
  }
  @Override
  protected void onStop() {
    super.onStop();
    Log.d("lifeCycle", "MainActivity: 我是onStop方法,我会在Activity停止时调用");
  }
  @Override
  protected void onRestart() {
    super.onRestart();
    Log.d("lifeCycle", "MainActivity: 我是onRestart方法,我会在Activty从停止状态变为运行状态时调用");
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    Log.d("lifeCycle", "MainActivity: 我是onDestroy方法,我会在Activty销毁之前调用");
  }
登录后复制

2.在SecondActivity中的也是重写上述方法,唯一的区别就是把上面日志中的MainActivity改成SecondActivity,代码类似就不往上粘贴了。

二、运行观察打印的log

运行我们的app,然后观察打印的日志,通过实例来分析Activity的生命周期。具体步骤如下:

1.创建并激活Activity

首次打开App所打印的Log如下图所示。打开App首先看到的时MainActivity, 通过Log我们不难看出在MainActiviy首次出现时要调用如下三个方法,经过下方的三个方法,MainActivty就会被创建,然后变为可见,最后处于运行状态。

(1).onCreate()方法:Activity首次出现创建时会调用该方法,在之前的Demo中我们在此方法中加载Activity的布局和或控件并关联事件。

(2).onStar()t方法:接着就会执行onStart()方法,Activity由不可见状态变为可见状态会调用该方法。

(3).onResume方法:Activity变为可见后接着要调用onResume方法来变为运行状态。

Android开发中Activity的生命周期及加载模式详解

2.Activity间切换

为了更清楚,在点击按钮跳转到SecondActivity之前,我们可以清除一下Log, 下方左边有一个垃圾桶的标志,就是用来清除之前打印的日志的。下方所打印的日志就是点击跳转按钮时所打印的日志。在这个切换过程中,MianActivty会停止运行变为不可见,而SecondActivy就会被创建并且处于运行状态。具体步骤如下。

(1).onPause()方法:当点击跳转按钮时,运行中MainActivity就会调用onPause()变为停止状态,但仍然可见。

(2).接着就是SecondActivity调用onCreate()方法进行创建,调用onStart()方法进行显示,调用onResume()方法进行运行的过程。

(3).onStop()方法:当SecondActivity处于运行状态时,MainActivity就完全不可见了,所以就会调用onStop()方法,进入完全不可见停止状态。

Android开发中Activity的生命周期及加载模式详解

3.从另一个Activity返回

从SecondActivity中点击返回键,从SecondActivity中返回到MainActivity中。下方的Log是点击返回按钮时所打印的Log.

(1)onPause()方法:点击返回按钮后,SecondActivity会调用onPause()方法,进入暂停运行状态。

(2)onRestart()方法:接着MainActivity就会调用onRestart()方法,由停止状态变为运行状态。然后MainActivity又会调用onStart方法从不可见变为可见,接着会调用onResume()方法最终进入运行状态。

(3)当返回到MainActivity中并且MainActivity处于运行状态后,SecondActivity会调用onStop方法,停止运行并不可见。因为SecondActivty做的事出栈操作,停止运行后,就会调用onDestory方法进行销毁。下此在进入SecondActivity中时,还是从onCreate方法进行执行。

Android开发中Activity的生命周期及加载模式详解

4.Activity退出并销毁

接着在MainActivity中点击返回按钮就会退出App了,下方是退出App时打印的Log信息。MainActivty先调用onPause()方法变为暂停运行状态,然后再调用onStop()方法停止运行,最后调用onDestroy()方法进行销毁。

Android开发中Activity的生命周期及加载模式详解

三.生命周期流程图

1.上面是用语言通过实例打印出的Log来描述两个Activity切换的生命周期,接下来将用一个流程图来描述这一过程,具体流程图如下。

Android开发中Activity的生命周期及加载模式详解

2.通过上面的实例不难分析出一个Activity的生命周期分为哪些阶段,并且很容易的看出哪些阶段在什么时候执行,所以我们很容易的画出一个Activity的生命周期,下方的流程图是一个Activity的生命周期。

Android开发中Activity的生命周期及加载模式详解

四.Activity的加载模式

Activity的启用模式也较为简单,它会在活动切换时用到。Activity的启动模式分为四种,standard、singleTop、singleTask、singleInstance模式。接下来将为大家详细的介绍一下这几种加载模式。

Activity的加载模式可以在配置文件AndroidManifest.xml中进行配置,配置项为android:launchMode具体如下图所示:

Android开发中Activity的生命周期及加载模式详解

1.standard模式

在Activity的栈中无论该活动有没有加入栈,活动就会被创建。测试方式是把MainActivity的launchMode设置成standard, 在MainActivity中添加一个按钮,点击按钮使用Intent跳转到当前Activity,看onCreate方法中打印的Log。点击按钮的方法如下:

Button launchModelButton = (Button) findViewById(R.id.launch_model_button);
    launchModelButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, MainActivity.class);
        startActivity(intent);
      }
    });
登录后复制

   

standard加载模式的栈如下所示,无论栈中有没有该对象的实例,都会被创建。

2.singleTop模式

只要被创建的活动不位于栈的顶部,该活动就会被创建入栈。如果将要被创建的活动位于栈的顶部,该活动的实例就不会被创建。测试方法,把上面的模式直接改成singleTop模式,MainActivty往自己身上跳转就不会从新创建一个新的实例,会重用之前在栈顶中的实例。如果是MainActivty跳转到SecondActivty, 然后SecondActivity再次跳转到MainActivty, 那么此时的MainActivity将会被创建,因为栈顶是SecondActivity。如下所示:

Android开发中Activity的生命周期及加载模式详解

3.singleTask模式

单任务模式,这个也不难理解,如果从MainActivty跳转到SecondActivity, 如果再从SecondActivty跳转到MainActivity, 在单任务模式下MainActivity已经在栈中,就会把它之前的Activity出栈,使其处于在栈顶活跃的位置。原理如下图所示:

Android开发中Activity的生命周期及加载模式详解

4.singleInstance

可以看成单例模式,这个比较特殊,被设置成singleInstance的Activity将会放入另一个栈中,因为这样为了便于共用。上面3中模式位于同一个栈中。下方ThirdActivity跳转到一个加载模式为singleInstance的Activity中。

Android开发中Activity的生命周期及加载模式详解

今天的Activity生命周期就先到这儿,相关内容会在下篇博客中进行更新。 

更多Android开发中Activity的生命周期及加载模式详解相关文章请关注PHP中文网!


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

See all articles