Android应用程序的核心组件Activity

news2024/11/29 12:38:18

Activity组件

Activity组件是Android应用程序的核心组件之一,它提供了一个用户界面,用于与用户进行交互。每个Activity都是一个独立的屏幕,它可以包含用户界面元素(如按钮、文本框等)和逻辑代码,用于响应用户的操作。

在Android应用程序中,每个Activity都必须在AndroidManifest.xml文件中进行声明,并且需要实现一些生命周期方法,以便在不同的状态下进行适当的操作。常见的生命周期方法包括onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等。

Activity可以通过Intent来启动其他Activity,从而实现不同Activity之间的切换和交互。通过Intent,可以传递数据和参数给目标Activity,并且可以接收目标Activity返回的结果。

在Android开发中,可以通过继承Activity类来创建自定义的Activity,并在其中实现自己的逻辑代码和用户界面。同时,也可以使用系统提供的一些预定义的Activity,如ListActivity、PreferenceActivity等,来快速构建常见的界面。

Activity组件是Android应用程序中负责用户界面和交互的核心组件,它提供了丰富的功能和灵活的扩展性,使开发者能够构建出各种各样的Android应用程序。

Activity生命周期

在Android中,Activity的生命周期可以分为以下几个阶段:

  1. 创建阶段(Create):当一个Activity被创建时,系统会调用其onCreate()方法。在这个阶段,可以进行一些初始化操作,如设置布局、绑定数据等。

  2. 启动阶段(Start):当一个Activity进入启动状态时,系统会调用其onStart()方法。在这个阶段,Activity已经可见,但还无法与用户进行交互。

  3. 恢复阶段(Resume):当一个Activity进入恢复状态时,系统会调用其onResume()方法。在这个阶段,Activity已经可见且可以与用户进行交互。

  4. 暂停阶段(Pause):当一个Activity被暂停时,系统会调用其onPause()方法。在这个阶段,Activity仍然可见,但失去了焦点,无法与用户进行交互。

  5. 停止阶段(Stop):当一个Activity停止时,系统会调用其onStop()方法。在这个阶段,Activity不再可见,但仍然保留其状态。

  6. 销毁阶段(Destroy):当一个Activity被销毁时,系统会调用其onDestroy()方法。在这个阶段,Activity被完全销毁,释放所有资源。

需要注意的是,Activity的生命周期可以根据用户的操作和系统的资源情况而发生变化。例如,当用户按下返回键时,当前Activity会被销毁;当系统内存不足时,可能会销毁处于停止状态的Activity以释放资源。

下面是Activity生命周期的示意图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在开发过程中,可以通过重写Activity的生命周期方法来实现一些特定的逻辑,如保存和恢复数据、处理用户交互等。同时,也可以通过调用一些生命周期方法来控制Activity的状态转换,如启动和停止Activity等。

Activity启动模式

Activity启动模式是指在Android中,通过设置Activity的启动模式来控制Activity的启动和运行方式。常见的Activity启动模式有以下几种:

  1. standard(默认):每次启动Activity都会创建一个新的实例,并放入任务栈中。

  2. singleTop:如果要启动的Activity已经位于任务栈的顶部,则不会创建新的实例,而是调用已存在的实例的onNewIntent()方法。如果不在顶部,则会创建新的实例。

  3. singleTask:如果要启动的Activity已经存在于任务栈中,则将该Activity上的所有Activity都出栈,使其成为栈顶的Activity,并调用其onNewIntent()方法。如果不存在,则创建新的实例。

  4. singleInstance:该模式下的Activity会独占一个任务栈,即使从其他应用启动该Activity,也会在新的任务栈中创建一个新的实例。

通过设置不同的启动模式,可以灵活地控制Activity的启动和运行方式,以满足不同的需求。根据具体的需求和业务逻辑,选择合适的启动模式可以更好地控制Activity的启动和运行方式。

以下是几种常见的应用场景:

  1. Standard(标准模式):默认的启动模式,每次启动Activity都会创建一个新的实例。适用于独立的、相互独立的界面,比如常见的应用主界面。

  2. SingleTop(单顶模式):如果要启动的Activity已经位于栈顶,那么不会创建新的实例,而是调用已存在的实例的onNewIntent()方法。适用于需要频繁切换到同一个Activity的场景,比如聊天界面、通知消息打开界面。

  3. SingleTask(单任务模式):如果要启动的Activity已经存在于栈中,那么会将该Activity上的其他Activity全部出栈,使得该Activity成为栈顶。适用于需要保持唯一实例的界面,比如应用的主界面。

  4. SingleInstance(单实例模式):该模式下的Activity会独占一个任务栈,其他应用无法与其共享任务栈。适用于需要与其他应用完全隔离的界面,比如来电界面。

Activity启动流程

Android系统中,Activity的启动流程如下:

  1. 用户点击应用程序的图标或者通过其他方式触发应用程序的启动。

  2. 系统会通过PackageManagerService来查找并加载应用程序的信息,包括应用程序的包名、启动Activity的类名等。

  3. 系统会创建一个新的进程来运行应用程序,如果应用程序已经在运行,则会将新的Activity启动在该进程中。

  4. 系统会创建一个新的ActivityThread对象,并在该线程中创建一个新的Activity对象。

  5. 系统会调用Activity的onCreate()方法,进行一些初始化操作,比如加载布局、绑定数据等。

  6. 系统会调用Activity的onStart()方法,表示Activity已经可见,但还不能与用户进行交互。

  7. 系统会调用Activity的onResume()方法,表示Activity已经准备好与用户进行交互。

  8. 用户可以通过触摸屏幕或者按下按键等方式与Activity进行交互。

  9. 当用户离开当前Activity时,系统会调用Activity的onPause()方法,表示Activity即将进入后台。

  10. 当用户返回到当前Activity时,系统会调用Activity的onResume()方法,表示Activity重新进入前台。

  11. 当用户关闭当前Activity时,系统会调用Activity的onStop()方法,表示Activity已经不可见。

  12. 当用户退出应用程序时,系统会调用Activity的onDestroy()方法,进行一些资源的释放操作。

常见问题

弹出Dialog对Activity的生命周期影响:
  1. onPause():当弹出Dialog时,Activity的onPause()方法会被调用。这是因为Dialog的出现会覆盖Activity的界面,导致Activity处于不可见状态。

  2. onStop():如果Dialog是一个模态对话框(即阻塞用户操作),则Activity的onStop()方法也会被调用。这是因为模态对话框会阻塞用户对Activity的操作,使得Activity进入停止状态。

需要注意的是,弹出Dialog并不会触发Activity 的销毁和重建,因此Activity的onCreate()方法不会被调用。只有当Activity被销毁后重新创建时,才会调用onCreate()方法。

横竖屏切换时Activity生命周期

在横竖屏切换时,Android系统会重新创建Activity并调用相应的生命周期方法。

  1. onPause():在Activity失去焦点时调用,用于暂停正在进行的操作,如动画、音乐播放等。

  2. onSaveInstanceState(Bundle outState):在Activity即将被销毁前调用,用于保存临时数据。可以通过outState参数将数据保存到Bundle中。

  3. onStop():在Activity完全不可见时调用,用于释放资源、取消注册等操作。

  4. onDestroy():在Activity被销毁时调用,用于释放所有资源。

  5. onCreate(Bundle savedInstanceState):在Activity被创建时调用,用于初始化界面和数据。可以通过savedInstanceState参数获取之前保存的数据。

  6. onStart():在Activity变为可见状态时调用,用于准备界面和数据。

  7. onResume():在Activity获取焦点并开始与用户交互时调用,用于恢复之前暂停的操作。

在配置横竖屏切换时,可以通过在AndroidManifest.xml文件中的Activity节点中添加android:configChanges="orientation"属性来告诉系统不重新创建Activity,而是调用onConfigurationChanged(Configuration newConfig)方法来处理横竖屏切换。在onConfigurationChanged()方法中,可以根据newConfig.orientation的值来判断当前屏幕的方向,进行相应的界面调整。

例如,以下是一个Activity的配置示例:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation">
</activity>

在MainActivity中,可以重写onConfigurationChanged()方法来处理横竖屏切换:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 横屏处理
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        // 竖屏处理
    }
}

这样,在横竖屏切换时,系统不会重新创建Activity,而是调用onConfigurationChanged()方法进行处理。

onSaveInstanceState()方法的作用

onSaveInstanceState()方法用于保存当前Activity的状态数据。当Activity即将被销毁时(例如屏幕旋转、内存不足等情况),系统会调用onSaveInstanceState()方法,开发者可以在该方法中保存需要保留的数据。

onSaveInstanceState()方法中,开发者可以使用Bundle对象来保存数据。Bundle是一种键值对的数据结构,可以用来存储各种类型的数据,例如字符串、整数、布尔值等。开发者可以将需要保存的数据放入Bundle中,并将其作为参数传递给onSaveInstanceState()方法。

当Activity重新创建时,系统会调用onRestoreInstanceState()方法,并将之前保存的Bundle对象作为参数传递给该方法。开发者可以在onRestoreInstanceState()方法中恢复之前保存的数据,并将其重新设置到Activity的各个组件中,以保持用户界面的一致性。

onSaveInstanceState()方法的作用是在Activity即将被销毁时保存数据,以便在重新创建时恢复数据。这样可以避免用户在屏幕旋转等情况下丢失数据,提升用户体验。

Intent传递数据的大小限制

Intent传递数据的大小是有限制的,Android系统对Intent的大小有限制,一般为1MB。如果传递的数据量较大,可以考虑以下方案来解决:

  1. 使用文件传递:将较大的数据保存到文件中,然后通过Intent传递文件的路径。接收方可以根据文件路径读取数据。

  2. 使用ContentProvider:ContentProvider是Android中用于共享数据的组件,可以将数据存储在ContentProvider中,然后通过Intent传递ContentProvider的URI。接收方可以通过URI获取数据。

  3. 使用全局变量:将较大的数据保存在全局变量中,然后通过Intent传递一个标识符,接收方可以根据标识符从全局变量中获取数据。

  4. 使用Parcelable或Serializable:如果数据对象实现了Parcelable或Serializable接口,可以将数据对象直接通过Intent传递。Parcelable通常比Serializable效率更高。

需要注意的是,以上方案都有一定的限制和适用场景,具体使用哪种方案需要根据实际情况进行选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩了一下 Jenkins,最新版本 + JDK11

背景 今年五月的时候玩了一下 Jenkins&#xff0c;最新版本 2.414.3 &#xff0c;JDK 11 。本机有两个 JDK&#xff0c;只放到 Tomcat 里面了&#xff0c;看到了一个启动页面&#xff0c;后面有其他事情就忘记了。最近又想起来&#xff0c;觉得还是应该玩一下这么有技术含量的…

K8S的pod创建过程

创建流程图 用户发起请求创建deployment&#xff1b;apiserver收到创建资源的请求&#xff0c;apiserver对客户端操作进行身份认证&#xff0c;认证完成后接受该请求&#xff0c;并把相关的信息保存到etcd中&#xff0c;然后返回确认信息给客户端&#xff1b;apiserver向etcd…

【Python3】【力扣题】217. 存在重复元素

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;遍历每个元素&#xff0c;判断元素个数是否大于1。&#xff08;此方法不适用。超出时间限制&#xff09; class Solution:def containsDuplicate(self, nums: List[int]) -> bool:# 超…

优先队列----数据结构

概念 不知道你玩过英雄联盟吗&#xff1f;英雄联盟里面的防御塔会攻击离自己最近的小兵&#xff0c;但是如果有炮车兵在塔内&#xff0c;防御塔会优先攻击炮车&#xff08;因为炮车的威胁性更大&#xff09;&#xff0c;只有没有兵线在塔内时&#xff0c;防御塔才会攻击英雄。…

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了&#xff0c;近一年都在某个国企里工作&#xff0c;我做的就是嵌入式工程师的岗位&#xff0c;最近才刚刚退出来&#xff0c;想来说说自己的工作使用的软件和系统。 本身进公司的时候&#xff0c;其实做的就是写单片机的板子的程序的工作&#x…

8. 一文快速学懂常用工具——Linux命令(上)

本章讲解知识点 引言 指令学习 本专栏适合于软件开发刚入职的学生或人士&#xff0c;有一定的编程基础&#xff0c;帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化&#xff0c;尽量做到好记、言简意赅。如专栏内容有错漏&#xff0c;欢迎在评论区指…

西门子PLC ModbusTcp通信访问网关后从站(梯形图篇)

这篇文章和之前的" 西门子PLC ModbusTcp通信访问网关后从站(SCL语音轮询状态机FB) "属于姊妹篇,这里我们主要介绍梯形图代码如何实现ModbusTcp轮询。 SCL代码篇 西门子PLC ModbusTcp通信访问网关后从站(SCL语言轮询状态机FB)-CSDN博客文章浏览阅读6次。西门子PLC的…

创建超过1G内存大小的程序

正常情况一个进程最大占用内存为1G一下&#xff0c;如果程序有需求要使用超过1G大小的程序&#xff0c;可进行如下操作 VS修改设置&#xff1a;属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…

【数据结构】树形结构所有路径复原为链表

目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构&#xff0c;它表示元素之间层次关系。在树形结构中&#xff0c;每个节点可能拥有一个或多个子节点&#xff0c;形成了一个分层的结构。为了还原树形结构的路径&…

Linux的账号管理

本章的学习感觉如果不做系统管理员&#xff0c;作为简单了解就可以了 前面介绍了&#xff0c;用户&#xff0c;组&#xff0c;other三个角色&#xff0c; 每个用户创建都会有uid与之对应&#xff0c;创建的用户基本信息在一下两个文件中&#xff0c;也是我们要介绍的内容&…

天猫双11:秋冬换季呼吸健康受关注 呼吸机、雾化器、血氧仪成交翻番

10月31日晚8点&#xff0c;天猫双11正式开售&#xff0c;健康消费热情集中释放。秋冬换季&#xff0c;呼吸健康备受关注&#xff0c;呼吸机、雾化器、血氧仪成交翻番&#xff0c;中药滋补经典方增长近400%。天猫健康数据显示&#xff0c;小仙炖、Ulike、Swisse、可复美、敷尔佳…

网课搜题小程序源码/小猿题库多接口微信小程序源码+自带流量主

网课搜题小程序源码&#xff0c;多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序&#xff0c;可以开通流量主赚钱。 搭建教程 1、微信公众平台注册自己的小程序 2、下载微信开发者工具和小程序的源码 3、上传代码到自己的小程序 下载地址&…

车载网关让无人车栩栩如生:一款性价比车载终端案例

​无人车是汽车智能化的高形态,而连接无人车的大脑正是5G车载网关。今天让我们通过SV900-5G产品,感受一下无人车会带来怎样便利的生活场景。 详情查看&#xff1a;https://www.key-iot.com/iotlist/sv900.html 我们首先来到一座自动化工厂,几台小型AGV忙碌穿梭,它们都安装了SV…

跨国文件传输为什么要用专业的大文件传输软件?

跨国文件传输是许多跨国企业需要的基础工作&#xff0c;对于传输的质量和速度要求也是很严格的&#xff0c;随着数据量的不断增加&#xff0c;寻常传统的传输方式肯定是不行&#xff0c;需要新的技术和方式来进行传输&#xff0c;大文件传输软件应运而出&#xff0c;那它有什么…

如何创建一个react项目

文章目录 前言前言打开小黑窗口npm init vite后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;react.js &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&am…

【hive 面试题】聚合操作时null和‘‘对结果的影响

1、HiveSQL中 聚合操作时null和对结果的影响 代码示例&#xff1a; with temp as (select null as aunion allselect 111 as a union allselect 222 as a union allselect 333 as aunion allselect as a )select sum(a), -- null 不会参与运算, 会转换成0avg(a), -- null …

图像二值化阈值调整——OTSU算法(大津法/最大类间方差法)

大津算法&#xff08;OTSU算法&#xff09;是一种常用的图像二值化方法&#xff0c;用于将灰度图像转化为二值图像。该算法由日本学者大津展之于1979年提出&#xff0c;因此得名。 大津算法的核心思想是通过寻找一个阈值&#xff0c;将图像的像素分为两个类别&#xff1a;前景…

【Amazon】AWS实战 | 快速发布安全传输的静态页面

文章目录 一、实验架构图二、实验涉及的AWS服务三、实验操作步骤1. 创建S3存储桶&#xff0c;存放网站网页2. 使用ACM建立域名证书3. 设置Cloudfront&#xff0c;连接S3存储桶✴️4. 设置Route53&#xff0c;解析域名服务5. 通过CLI工具上传网页更新内容【可选】 四、实验总结 …

Python小试牛刀:GUI(图形界面)实现计算器UI界面(二)

上一篇&#xff1a;Python小试牛刀&#xff1a;GUI&#xff08;图形界面&#xff09;实现计算器UI界面&#xff08;一&#xff09;-CSDN博客 在上一篇文章中介绍了Python GUI常用的库&#xff0c;以及运用GUI标准库tkinter仅设计了计算器的UI界面。 而在本篇文章&#xff0c;…

idea集成测试插件替代postman

idea集成测试插件替代postman 兄弟萌&#xff0c;你再测试接口是否无bug是否流畅的时候是否还在使用“postman”来回切换进行测试呢&#xff1f; 页面切换进行测试&#xff0c;有没有感觉很麻烦呢&#xff1f; 打开postman&#xff0c;输入接口地址&#xff0c;有没有感觉很麻烦…