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

本文给大家介绍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
java主要是干嘛的 Java在实际开发中的主要用途解析java主要是干嘛的 Java在实际开发中的主要用途解析May 16, 2025 pm 02:54 PM

Java主要用于构建桌面应用、移动应用、企业级解决方案和大数据处理。1.企业级应用:通过JavaEE支持复杂应用,如银行系统。2.Web开发:使用Spring、Hibernate简化开发,SpringBoot快速搭建微服务。3.移动应用:仍是Android开发主要语言之一。4.大数据处理:Hadoop和Spark基于Java处理海量数据。5.游戏开发:适用于中小型游戏开发,如Minecraft。

java怎么设置为中文 Java开发工具中文界面设置教程java怎么设置为中文 Java开发工具中文界面设置教程May 16, 2025 pm 02:51 PM

如何将Java开发工具设置为中文界面?可以通过以下步骤实现:Eclipse:Window->Preferences->General->Appearance->I18nsupport->Language->Chinese(Simplified),然后重启Eclipse。IntelliJIDEA:Help->FindAction->输入"switchlanguage"->选择"SwitchIDELanguage&q

学java要学多久才能工作 Java学习周期和就业时间预估学java要学多久才能工作 Java学习周期和就业时间预估May 16, 2025 pm 02:48 PM

学习Java并达到工作水平通常需要6到12个月,对于有编程基础的人可能缩短至3到6个月。1)零基础学习者需6-12个月掌握基础和常用库。2)有编程基础者可能3-6个月内掌握。3)就业时间在学习9-18个月后,实际项目和实习可加速进程。

java中的new是什么 new操作符的内存分配过程java中的new是什么 new操作符的内存分配过程May 16, 2025 pm 02:45 PM

在Java中,new操作符用于创建对象,其过程包括:1)在堆内存中分配空间,2)初始化对象,3)调用构造函数,4)返回对象引用。理解这些步骤有助于优化内存使用和提升应用程序性能。

java中数组如何定义 数组声明的语法格式说明java中数组如何定义 数组声明的语法格式说明May 16, 2025 pm 02:42 PM

在Java中定义数组的语法是:1.数据类型[]数组名=new数据类型[数组长度];2.数据类型数组名[]=new数据类型[数组长度];3.数据类型[]数组名={元素列表};数组是对象,可为null,下标从0开始,使用时需注意潜在的错误如NullPointerException和ArrayIndexOutOfBoundsException。

java中new关键字的用法 new关键字创建对象实例详解java中new关键字的用法 new关键字创建对象实例详解May 16, 2025 pm 02:39 PM

new关键字在Java中用于创建对象实例。1)它告诉JVM分配内存并调用构造函数初始化对象。2)使用new可以强制创建新对象,即使内容相同。3)构造函数允许自定义初始化。4)频繁使用new可能导致性能问题和内存泄漏。5)需要使用try-catch处理可能的异常。6)匿名内部类是new的高级用法。

java中文乱码解决方法 字符编码转换的几种技巧java中文乱码解决方法 字符编码转换的几种技巧May 16, 2025 pm 02:36 PM

解决Java中的中文乱码问题可以通过以下步骤:1.设置正确的字符编码,如UTF-8或GBK,确保文件、数据库和网络通信使用相同编码。2.使用Java的字符编码转换类进行必要的编码转换。3.通过调试工具和日志验证编码是否正确,确保在不同环境下中文显示正常。

java中异常分为哪两类 检查型和非检查型异常区别java中异常分为哪两类 检查型和非检查型异常区别May 16, 2025 pm 02:33 PM

Java中的异常分为检查型异常和非检查型异常。检查型异常必须显式处理,否则编译器报错,常用于可恢复错误,如文件未找到;非检查型异常无需显式处理,常用于编程错误,如空指针异常。

See all articles

热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

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

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。