我的编程空间,编程开发者的网络收藏夹
学习永远不晚

AndroidActivity的生命周期与加载模式超详细图文解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

AndroidActivity的生命周期与加载模式超详细图文解析

Activity的生命周期

Activity是安卓应用的重要组成单元之一,其对于安卓的作用类似于Servlet对于Web应用的作用。

整个Activity生命周期的图解如下

具体的生命周期可以总结成如下几个步骤

onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。

onStart():当Activity显示在屏幕上时,函数被调用。

onRestart():Activity从停止状态进入活动状态是调用。

onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。

onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。

onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。

onDestroy():在Activity被终止前,被调用。

归纳起来,Activity大概会经历四种状态

运行状态:当前Activity位于前台,用户可见,可以获得焦点

暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点

停止状态:该Activity不可见,失去焦点

销毁状态:该Activity结束,或Activity所在的进程被结束

我们使用给一个程序来看一下看一下Activity的生命周期。程序非常简单,就是定义两个Activity,分别命名为FirstActivity和SecondActivity,先从FirstActivity跳转到SecondActivity,然后再在SecondActivity销毁该Activity,最后销毁FirstActivity

public class FirstActivity extends Activity {
    final String TAG = "-----FirstActivity-----";
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        // 输出日志
        Log.d(TAG, "-----onCreate-----");
        TextView textView = findViewById(R.id.text1);
        Button button1 = findViewById(R.id.bn_first1);
        Button button2 = findViewById(R.id.bn_first2);
        // 第一个按钮跳转到第二个Activity
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
        // 第二个按钮销毁该Activity
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirstActivity.this.finish();
            }
        });
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "-----onStart-----");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "-----onRestart-----");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "-----onResume-----");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "-----onPause-----");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "-----onStop-----");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "-----onDestory-----");
    }
}
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        Button button = findViewById(R.id.bn_second);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SecondActivity.this.finish();
            }
        });
    }
}

最后得到的日志信息如下所示,我们过滤了其他日志,只保留FirstActivity的日志

Activity的加载模式

Activity一共有四种加载模式

  • standard:标准模式,这是默认的加载模式
  • singleTop:Task栈顶单例模式
  • singleTask:Task内单例模式
  • singleInstance:全局单例模式

安卓采用Task来管理多个Activity,当我们启动应用的时候,安卓就会位置创建一个Task,然后启动这个引用的入口Activity,(即<intent-filter>中配置为MAIN和LAUNCHER的Activity)。

我们可以将Task简单理解成存放Activity的栈,先加载的Activity位于栈底,后加载的Activity位于栈顶。

Activity的加载模式就是按照什么样的方式去实例化,加载Activity,并且控制Activity和Task之间的关系。

standard模式

当我们通过standard模式启动Activity的时候,每次都会创建一个新的Activity示例放置到栈顶。当我们在配置Activity时没有指定加载模式的时候,采用的就是standard模式。

singleTop模式

这种模式与standard模式基本相同,唯一不同的就是,当要启动的Activity已经位于栈顶的时候不会创建一个新的实例,而是复用已有的实例。如果我们的目标Activity不位于栈顶,那么还是会创建一个新的实例,这一点和standard模式是一样的。

singleTask模式

采用singleTask模式的Activity在同一个Task中只有一个实例,当系统采用singleTask模式启动目标Activity的时候,可分为如下三种情况

如果要启动的Activity实例不存在,系统会创建一个实例,并且将其置于栈顶

如果要启动的Activity实例位于栈顶,此时的操作与singleTop模式相同

如果要启动的Activity实例存在于栈中,但是没有位于栈顶,那么系统就会将该Activity上的所有Activity移出Task栈,从而使目标Activity转入栈顶

singleInstance模式

在这种加载模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。

当系统采用singleInstance模式启动目标Activity时,可分为如下两种情况

如果要启动的目标Activity不存在,系统会创建一个全新的Task,再创建目标Activity的实例,并将它加入到新的Task栈顶

如果要启动的目标Activity已经存在,无论它位于哪个应用程序中,位于哪个Task中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来

到此这篇关于Android Activity的生命周期与加载模式超详细图文解析的文章就介绍到这了,更多相关Android Activity的生命周期内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

AndroidActivity的生命周期与加载模式超详细图文解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

AndroidActivity的生命周期与加载模式超详细图文解析

这篇文章主要介绍了AndroidActivity的生命周期与加载模式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-02-28

Android Activity的生命周期与加载模式是什么

这篇文章主要介绍了Android Activity的生命周期与加载模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android Activity的生命周期与加载模式是什么文章都会有所收获,下面我们一起
2023-07-05

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

本文给大家介绍Activity的生命周期,如果大家学习过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似。生命周期,并不难理解。一个人的生命周期莫过于生老病死,花儿的生命周期就是花开花谢
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录