Android中Activity生命周期和启动模式详解

Android中Activity生命周期和启动模式详解

在Android开发中,Activity是重要的组件之一,负责控制用户界面和交互。了解Activity的生命周期和启动模式对于开发高质量的Android应用程序至关重要。

Activity生命周期

Activity的生命周期是指从Activity被创建一直到消失的整个过程。了解Activity生命周期可以帮助我们更好地控制其行为以及更好地理解应用程序的运行状态。

Activity的生命周期分为以下几个阶段:

  1. 创建阶段:Activity被创建,但未可见。

在此阶段,Activity被创建,但还未在屏幕上显示。Activity的生命周期方法顺序为:

markdown
onCreate() -> onStart() -> onResume()

  1. 运行阶段:Activity正在运行且可见。

在此阶段,Activity正在前台运行,并且正常与用户交互。Activity的生命周期方法顺序为:

markdown
onPause() -> onResume()

  1. 暂停阶段:Activity正在运行但不再可见。

在此阶段,Activity已经失去了焦点,但仍然在前台运行。Activity的生命周期方法顺序为:

markdown
onPause() -> onStop()

  1. 停止阶段:Activity不再显示在屏幕上。

在此阶段,Activity已停止,即它不再在屏幕上显示。Activity的生命周期方法顺序为:

markdown
onStop()

  1. 销毁阶段:Activity从内存中移除。

在此阶段,Activity已被销毁,即完全释放了其占用的资源。Activity的生命周期方法顺序为:

markdown
onDestroy()

示例1:生命周期演示

假设我们有一个包含一个按钮的Activity,并且单击按钮会启动另一个Activity。下面是如何在两个Activity之间跟踪生命周期方法的示例:

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondaryActivity.class);
                startActivity(intent);
            }
        });
        Log.d("MainActivity", "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("MainActivity", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("MainActivity", "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("MainActivity", "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("MainActivity", "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("MainActivity", "onDestroy");
    }
}
public class SecondaryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secondary);
        Log.d("SecondaryActivity", "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("SecondaryActivity", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("SecondaryActivity", "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("SecondaryActivity", "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("SecondaryActivity", "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("SecondaryActivity", "onDestroy");
    }
}

在这个示例中,我们使用了Logcat来打印活动周期中的每个方法调用记录。当单击主Activity中的按钮并打开SecondaryActivity时,我们可以在Logcat中看到以下输出。

D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
D/MainActivity: onPause
D/SecondaryActivity: onCreate
D/SecondaryActivity: onStart
D/SecondaryActivity: onResume
D/MainActivity: onStop
D/SecondaryActivity: onPause
D/MainActivity: onDestroy

这个输出显示了两个Activity的生命周期事件,从主Activity的onCreate开始,绕过SecondaryActivity,然后返回到主Activity的onDestroy。

Activity启动模式

默认情况下,每次启动Activity时都会创建一个新的实例。这意味着如果用户多次单击应用程序中的按钮,则会打开多个Activity实例,从而导致应用程序浪费内存并降低用户体验。

为了解决这个问题,可以使用Activity的启动模式来控制Activity实例的创建和管理。Android提供了四种启动模式,每种模式都控制Activity窗口如何显示和处理。下面对各个启动模式进行简单介绍:

  1. standard:默认模式,每次启动Activity都会创建一个新的实例。

  2. singleTop:如果Activity已经在栈的顶部,则不会创建新的Activity实例。如果Activity不在栈的顶部,则会创建新的实例。

  3. singleTask:如果在任务中存在该Activity的实例,则不会创建新的Activity实例。否则,会在新任务中创建该Activity的新实例。

  4. singleInstance:同一应用程序中的所有Activity都在单独的任务中启动,并且只能有一个实例。

示例2:启动模式演示

下面是一个演示Activity启动模式的简单示例:

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondaryActivity.class);
                startActivity(intent);
            }
        });
    }
}
public class SecondaryActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secondary);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondaryActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

在这个示例中,MainActivity和SecondaryActivity都以默认的启动模式启动。这意味着每次单击按钮时都会创建新的Activity实例。

要演示singleTop启动模式,可以在MainActivity上加上该启动模式的声明,并为其指定一个新的启动模式:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop" />

然后将此修改应用于示例中的SecondaryActivity,演示如下:

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondaryActivity.class);
                startActivity(intent);
            }
        });
    }
}
public class SecondaryActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secondary);
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SecondaryActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });
    }
}

在这个演示中,我们使用了FLAG_ACTIVITY_CLEAR_TOP标志来清除栈中的旧实例并将新实例推送到栈顶。这确保了不会创建多个MainActivity实例,并且保留了用户的UI状态。

结论

了解Activity的生命周期和启动模式是Android应用程序开发的基础。如果我们能够清楚地了解Activity的生命周期和启动模式,那么我们可以更好的管理和控制我们的应用程序。

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

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

相关文章

  • KMP算法最浅显理解(小白教程)

    KMP算法最浅显理解(小白教程) 什么是KMP算法? KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,用于在一个主串中查找一个模式串的出现位置。与朴素的字符串匹配算法相比,KMP算法具有更高的效率。 KMP算法的基本思想 KMP算法的基本思想是利用已经匹配过的部分信息,避免不必要的回溯。它通过构建一个部分匹配表(Partial M…

    other 2023年8月6日
    00
  • IE10浏览器无法记住网站的登陆账号和密码的解决方法

    解决IE10浏览器无法记住网站的登陆账号和密码的方法有以下几步: 步骤一:检查IE10浏览器的设置 打开IE10浏览器,点击右上角的齿轮图标,选择Internet选项; 在弹出的Internet选项窗口中,选择“内容”选项卡,并点击“自动完成设置”按钮; 确认选中“用户名和密码在表单中填写”和“为我保存密码”两个选项,并点击“确定”按钮; 关闭所有IE10浏…

    other 2023年6月27日
    00
  • 教你如何使用注册表给Win11开启传统右键菜单

    以下是教你如何使用注册表给Win11开启传统右键菜单的完整攻略: 1. 概述 Windows 11中的右键菜单继续了Windows 10中的设计,采用了比较现代的“漂浮式菜单”(Fluent Design)形式。尽管这种设计具有更加现代的外观和感觉,但对于某些用户而言,其使用起来却并不是那么方便,甚至会对老年人使用造成较大的困难。 因此,在Windows 1…

    other 2023年6月27日
    00
  • laravel 创建命令行命令的图文教程

    下面是一份基于Laravel 8的创建命令行命令的详细攻略: 步骤一: 创建命令 在 Laravel 中,所有的 Artisan 命令都存储在 app/Console/Commands 目录下。如果这个目录不存在,我们可以手动创建。 我们可以使用 make:command Artisan 命令来创建一个新的命令。这个命令将会在 app/Console/Com…

    other 2023年6月26日
    00
  • 使用vue组件封装共用的组件

    那么这里我将详细讲解一下使用Vue组件封装共用的组件的完整攻略。 前置知识 在学习使用Vue组件封装共用的组件前,需要掌握Vue基础知识和组件的使用方法。如果还没有掌握,可以先学习Vue教程以及组件的使用方法。 Vue组件封装共用的组件的步骤 下面是Vue组件封装共用的组件的步骤: 1. 创建共用的组件 首先需要创建共用的组件。这个组件应该是一个通用的组件,…

    other 2023年6月25日
    00
  • 教你在react中创建自定义hooks

    当我们在开发React应用时,很多时候我们会发现需要在多个组件中使用相同的逻辑,这时候我们可以使用自定义Hook来避免代码的重复。 创建自定义Hook的步骤 创建自定义Hook的步骤非常简单: 创建一个函数, 函数名以 “use” 开头,这个函数可以接受任意参数,但是需要返回一个对象或数组作为其结果; 在任意React组件中使用这个自定义Hook。 让我们看…

    other 2023年6月25日
    00
  • git查看分支被合并记录

    以下是“git查看分支被合并记录”的完整攻略: git查看分支被合并记录 在使用git进行版本控制时,我们经常需要查看分支被合的记录。以下是在中查看分支被合并记录的步骤: 步骤1:切换到目标分支 在查看分支合并记录之前需要先切换到目标分支。以下是切换到目标分支的步骤: 打开命令行终端 切换您的git仓库目录。 输入以下命令来列出所有分支: git branc…

    other 2023年5月7日
    00
  • office2016最新安装及激活教程(kms)【亲测有效】!!

    Office 2016最新安装及激活教程(KMS)【亲测有效】!! 介绍 Microsoft Office 2016是目前最流行的一款办公软件套装,其拥有许多实用的功能和便捷的操作,使得它成为了广大用户工作和生活中必不可少的工具之一。本篇文章将详细介绍如何进行Office 2016的最新安装及KMS激活,以便更好的使用Office 2016。 系统要求 在进…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部