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日

相关文章

  • 帝国cms所有的数据库表结构和字段说明

    下面是帝国 CMS 所有的数据库表结构和字段说明。 1. 表结构 1.1. 表 igg_attachment 该表存储所有的附件信息,包括附件的名称、大小、上传时间、存放路径等。 CREATE TABLE `igg_attachment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) …

    other 2023年6月25日
    00
  • 推荐几个靠谱的vpn

    推荐几个靠谱的VPN 随着互联网的普及,网络安全越来越成为人们关注的焦点。VPN已经成为了保障个人隐私和网络安全的重要工具。那么,我们如何选择靠谱的VPN呢?本文将推荐几个经过长时间验证的VPN,这几个VPN上线很多年了都十分稳定,希望能给你提供些借鉴。 1.yizhihongxingVPN 第一个是yizhihongxingVPN,它是比较老牌的一款VPN…

    2023年3月29日
    10
  • ue4开发入门教程

    UE4开发入门教程 Unreal Engine 4(UE4)是一款强大的游戏引擎,可以用于开发各种类型的游戏,包括第一人称射击游戏、角色扮演游戏、策略游戏。本文将详细介绍UE4的开发入门教程,包括安装、界面介绍、蓝图编程等内容,并提供两个示例说明。 安装 UE4可以从官方网站下载,支持Windows和MacOS系统。下载完成后,双击安装程序,照提示进行安装即…

    other 2023年5月7日
    00
  • 关于uiscollview中的contentoffset的理解

    关于UIScrollView中的contentOffset的理解 UIScrollView是iOS开发中常用的控件之一,它可以滚动显示内容。contentOffset是UIScrollView的一个属性,表示UIScrollView的内容视图在UIScrollView坐系的移量。本文将详细讲解contentOffset的理解,并提供两个示例说明。 1. co…

    other 2023年5月7日
    00
  • 在vue中使用pug

    以下是关于在Vue中使用Pug的详细攻略,包括定义、方法、示例说明和注意事项。 定义 Pug是一种简洁的HTML模板语言,它可以通过缩进和标签嵌套来代替HTML中的标签和属性。在Vue中使用Pug可以使代码更加简洁易读,提高开发效率。 方法 以下是在Vue中使用Pug的方法: 安装pug和pug-plain-loader bash npm install p…

    other 2023年5月8日
    00
  • vue中created和mounted的区别浅析

    Vue中created和mounted的区别浅析 1. 概述 created和mounted两个生命周期函数是Vue中常用的两个函数,二者在Vue的生命周期中都扮演着重要的角色,但二者却存在着不同的特征。本篇文章将围绕Vue中created和mounted的区别进行分析,帮助Vue初学者更好的理解它们的作用。 2. created created函数是Vue…

    other 2023年6月27日
    00
  • webservice服务调用方法介绍

    Webservice服务调用方法介绍 在程序开发中,服务调用是十分常见的操作。而Webservice是一种可跨平台互操作的服务架构,可以通过SOAP、WSDL和HTTP协议来提供和发布服务。本文将介绍如何使用两种主流的方法来调用Webservice服务。 方法一:使用SOAP UI SOAP UI是一种通用的Webservice测试工具,它可以通过WSDL文…

    其他 2023年3月28日
    00
  • C语言中scanf的用法举例

    让我们开始介绍C语言中scanf的用法。 什么是scanf? scanf函数是C语言中的一个标准库函数,用于从标准输入中读取一定格式的数据。其函数原型为: int scanf(const char *format, …) 我们通常调用scanf函数时,需要向其传递一个格式字符串,以指明我们要读取的数据的格式,此外,我们还需要传递一个或多个指向我们要存储读…

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