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

下面是关于“Android开发中Activity的生命周期及加载模式详解”的完整攻略:

什么是Activity生命周期?

在Android开发中,Activity是一个界面的表示,它包含了用户与之交互的所有内容。而Activity的生命周期,是指从Activity的创建到销毁,整个过程中所经历的六个阶段。这六个阶段分别为:

  1. onCreate()
  2. onStart()
  3. onResume()
  4. onPause()
  5. onStop()
  6. onDestroy()

接下来我们将对这六个阶段分别进行详细讲解。

Activity生命周期详解

onCreate()

Activity继承自Context,因此第一个被调用的是Activity的构造方法。其次你可以通过onCreate()方法来初始化你的Activity,比如可以调用setContentView()方法来指定你的Activity的布局文件。

onStart()

在onCreate()方法完成后,接着调用的是onStart()方法。在这个阶段,Activity需要准备好显示给用户的界面,但是界面并没有出现,它仍然被其他界面所覆盖着。

onResume()

当一个Activity处于Resumed状态时,用户可以看到并与之交互。在onResume()方法中,Activity会向用户展示它的UI,并开始响应用户的操作。因为这个阶段Activity已经可以接收用户的输入,所以也是处理用户交互的最佳地点。

onPause()

当一个Activity处于Paused状态时,它仍然可见,但是它已经失去了焦点。一般在这个阶段,Activity将停止处理用户输出,且它的动画停止了。次生对象的访问将暂停,为了加快后台任务的速度。在这个阶段,如果某些操作需要耗费大量时间,你需要启动一个线程来进行操作。

onStop()

当一个Activity停止时,它会隐藏,并不再对用户进行显示。它的UI不再可见,并且所有次生对象都会被回收。当用户重启这个Activity时,Activity将在onStart()方法中重新创建。

onDestroy()

当一个Activity被销毁时,它会从内存中消失,并且不再占用任何空间。在这个阶段,Activity已经过时,任何重要的信息都需要被保存起来。

Activity加载模式详解

  1. Standard

标准模式是Activity的默认加载模式,每次启动Activity都会创建一个新的实例。

  1. SingleTop

在这个模式中,如果新Activity已经位于栈顶时,不会再重新创建一个新的实例,而是直接调用onNewIntent()方法。如果不在栈顶,则会创建一个新的实例。

示例:

public class SingleTopActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_top);
        textView = findViewById(R.id.tv_single_top);
        textView.setText("TaskId = " + getTaskId() + "\n" + "Instance = " + toString());
        Log.d("SingleTopActivity", "onCreate: TaskId:" + getTaskId()
                + ", hashCode:" + hashCode());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("SingleTopActivity", "onNewIntent: TaskId:" + getTaskId()
                + ", hashCode:" + hashCode());
    }

    public void onClick(View view) {
        Intent intent = new Intent(this, SingleTopActivity.class);
        startActivity(intent);
    }
}
  1. SingleTask

在这个模式中,如果Activity已经存在于栈中,就不会再创建一个新的实例,而是直接调用onNewIntent()方法。如果将要启动的Activity不存在于栈中,则会创建一个新的Task,将Activity放到栈顶。

示例:

public class SingleTaskActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_task);
        textView = findViewById(R.id.tv_single_task);
        textView.setText("TaskId = " + getTaskId() + "\n" + "Instance = " + toString());
        Log.d("SingleTaskActivity", "onCreate: TaskId:" + getTaskId()
                + ", hashCode:" + hashCode());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("SingleTaskActivity", "onNewIntent: TaskId:" + getTaskId()
                + ", hashCode:" + hashCode());
    }

    public void onClick(View view) {
        Intent intent = new Intent(this, SingleTaskActivity.class);
        startActivity(intent);
    }
}
  1. SingleInstance

在这个模式中,每次启动一个Activity都会创建一个新的Task,在新的Task中Activity只有一个实例。

示例:

public class SingleInstanceActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_instance);
        textView = findViewById(R.id.tv_single_instance);
        textView.setText("TaskId = " + getTaskId() + "\n" + "Instance = " + toString());
        Log.d("SingleInstanceActivity", "onCreate: TaskId:" + getTaskId()
                + ", hashCode:" + hashCode());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("SingleInstanceActivity", "onNewIntent: TaskId:" + getTaskId()
                + ", hashCode:" + hashCode());
    }

    public void onClick(View view) {
        Intent intent = new Intent(this, SingleInstanceActivity.class);
        startActivity(intent);
    }
}

通过上面的四个示例,我们可以更好的理解Activity的生命周期及加载模式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android开发中Activity的生命周期及加载模式详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 三菱plcio分配表

    以下是关于“三菱PLC IO分配表”的完整攻略: 步骤1:打开三菱PLC编程软件 首先,需要打开三菱C编程软件,例如GX Works3或GX Developer。 步骤2:创建新项目 在三菱PLC编程软件中,创建一个新项目。可以根据需要选择PLC型号和通信方式。 步骤3:打开IO分配表 在三菱PLC编程软件中,打开IO分配表。可以在软件的菜单栏中找到IO分配…

    other 2023年5月7日
    00
  • JS中数组重排序方法

    标题:JS中数组重排序方法的完整攻略 1. sort()方法 sort()方法是JS中内置的数组排序方法,它会将数组中的元素按照一定的规则进行排序。sort()方法默认按照Unicode编码的顺序进行排序,即使对于数字类型的元素,也会按照字符的顺序进行排序。 1.1 基本用法 sort()方法可以直接作用于数组对象,无需额外的参数。 let arr = [3…

    other 2023年6月25日
    00
  • MySQL怎么给字符串字段加索引

    为了给字符串字段添加索引,需要使用MySQL中的CREATE INDEX命令。下面是该过程的详细步骤: 步骤一:选择需要添加索引的表和字段 首先,需要选择需要添加索引的表和字段。假设有一个名为my_table的表,包含一个名为name的字符串字段,需要添加索引。可以使用以下代码查看表结构并找到需要添加索引的字段: DESCRIBE my_table; 步骤二…

    other 2023年6月27日
    00
  • JDK环境变量配置的具体操作步骤

    下面是 JDK 环境变量配置的具体操作步骤。 1. 下载和安装 JDK 首先你需要下载并安装 JDK。你可以在 Oracle 官网上下载对应版本的 JDK。 安装 JDK 的过程中需要注意: 安装路径,一般建议安装在默认路径下; 安装 JRE 或者不安装 JRE。如果已经安装过 JRE,那么可以选择不需要安装 JRE。 2. 配置 JDK 系统变量 完成 J…

    other 2023年6月27日
    00
  • 常见的10种图片格式(文件后缀)和使用场景(方便选择不同的后缀)

    常见的10种图片格式及使用场景攻略 在选择图片格式时,了解不同格式的特点和适用场景非常重要。下面是常见的10种图片格式及其使用场景的详细攻略: 1. JPEG (.jpg/.jpeg) 特点: JPEG 是一种有损压缩格式,可以在保持较高质量的同时减小文件大小。 使用场景: JPEG 格式适用于存储照片、图像和复杂的图形,如数字摄影、网页图像和社交媒体分享。…

    other 2023年8月5日
    00
  • Go泛型实战教程之如何在结构体中使用泛型

    下面是关于“Go泛型实战教程之如何在结构体中使用泛型”的完整攻略: 1. 了解泛型 在编程中,泛型是指编写适用于多种数据类型的代码。在Go语言中,由于没有泛型,我们通常会使用接口或空接口(interface{})来模拟泛型的效果。 2. 定义泛型结构体 首先,我们可以使用空接口来实现一个泛型的结构体。下面是一个示例代码: type GenericStruct…

    other 2023年6月27日
    00
  • Filezilla server配置FTP服务器中的各种问题与解决方法

    Filezilla server配置FTP服务器中的各种问题与解决方法 前言 Filezilla server是一款免费且开源的FTP服务器软件,它可以运行在Windows操作系统下,并且界面简单易用。但是,在使用过程中,我们可能会遇到各种各样的问题,导致FTP服务器的正常运行出现了异常。针对这些问题,本文将在下面的内容中做出详细的解答和解决方案。 File…

    other 2023年6月27日
    00
  • 用python查找统一局域网下ip对应的mac地址

    用Python查找统一局域网下IP对应的MAC地址攻略 在局域网中,要查找IP地址对应的MAC地址,可以使用Python编程语言来实现。下面是一个详细的攻略,包含了两个示例说明。 步骤1:导入必要的库 首先,我们需要导入一些Python库来执行网络操作。在这个攻略中,我们将使用scapy库来发送和接收网络数据包。 from scapy.all import …

    other 2023年7月31日
    00
合作推广
合作推广
分享本页
返回顶部