Android开发【全面理解Activity】

news2025/1/14 0:51:36

一、 Activity的生命周期

和其他手机 平台 的应用 程序 一样,Android的应用程序 的生命周期是被统一掌控 的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并适应它。

简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信 ,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 ,另外系统也不允许你占用太多资源 ,至少要保证电话功能吧,所以资源不足的时候也就有可 能被干掉。

言归正传,Activity的基本生命周期如下代码 所示:

Java 代码
public
class MyActivity extends Activity { 
  protected
void onCreate(Bundle savedInstanceState); 
​
  protected
void onStart(); 
​
  protected
void onResume(); 
​
  protected
void onPause(); 
​
  protected
void onStop(); 
​
  protected
void onDestroy(); 
 } 
​
public class MyActivity extends Activity {   protected void onCreate(Bundle savedInstanceState);   protected void onStart();   protected void onResume();   protected void onPause();   protected void onStop();   protected void onDestroy();  
​
}

你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断 这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。

详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

  • onCreate: 在这里创建界面 ,做一些数据 的初始化工作
  • onStart: 到这一步变成用户可见不可交互 的
  • onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个

Activity的最上面,运行完弹出栈,则回到上一个Activity)

onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来,注意:这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才启动

onstop: 变得不可见 ,被下一个activity覆盖了

onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。

onPause,onstop, onDestroy,三种状态 下 activity都有可能被系统干掉为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。

实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回 滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。

Activity五个状态

Starting-> running-> poused-> stopped-> killed

关于activity四个状态所在的生命周期:

  • 启动状态(Starting):Activity的启动状态很短暂,当Activity启动后便会进入运行状态(Running)。
  • 运行状态(Running):Activity在此状态时处于屏幕最前端,它是可见、有焦点的,可以与用户进行交互。如单击、长按等事件。即使出现内存不足的情况,Android也会先销毁栈底的Activity,来确保当前的Activity正常运行。
  • 暂停状态(Paused):在某些情况下,Activity对用户来说仍然可见,但它无法获取焦点,用户对它操作没有没有响应,此时它处于暂停状态。
  • 停止状态(Stopped):当Activity完全不可见时,它处于停止状态,但仍然保留着当前的状态和成员信息。如系统内存不足,那么这种状态下的Activity很容易被销毁。
  • 销毁状态(Destroyed):当Activity处于销毁状态时,将被清理出内存。

activity的生命周期

oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()

上面图概括了android生命周期的各个环节,描述了activity从生成到销毁的过程。

  • onCreate() : 在Activity创建时调用,通常做一些初始化设置;
  • onStart(): 在Activity即将可见时调用;
  • onResume(): 在Activity已可见,获取焦点开始与用户交互时调用;
  • onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用;
  • onStop() : 在Activity对用户不可见时调用;
  • onDestroy() :在Activity销毁时调用;
  • onRestart() : 在Activity从停止状态再次启动时调用;

Activity四种启动方式

一个项目中会包含多个activity,系统中使用任务栈来存储这些activity,任务栈呢,是一种“后进先出”的栈结构。举个栗子:当我们多次启动同一个(没有设置启动方式–即默认的启动方式)的activity的时候,系统会创建多个实例依次进入栈中。当back返回的时候,每按一次,一个activity出栈。直至栈空为止。

Standard 标准模式

无论任务栈内是否已经存在要启动的Activity实列,都会创建一个Activity放入任务栈,并置于栈顶。 使用场景:默认使用大多数场景

SingleTop栈顶复用模式

如果任务栈已经存在一个要启动的Activity实列,就复用该Activity置于栈顶不会重新创建Activity的实列,复用Activity会执行onNewIntent方法,但是onCreate.onStart方法不会执行,因为它没有改变.如果任务栈中或者任务栈顶没有实例就创建一个Activity实例存入其中,置于栈顶。 使用场景:适合接收通知内容显示页面,当用户从任务栏中进入查看消息内容界面时,如果设置为singleTop时,这样每次行为都使用同一个实例,用户点击返回时不会存在多个消息页面的情况。

SingleTask栈内复用模式

如果栈内已经存在要启动的Activity实例,就把该Activity栈上面的activity清出栈,让该activity置于栈顶,如果复用它的onNewIntent方法会被回调,但是onCreate.onStart方法不会执行,因为它没有改变. 使用场景:APP的首页,当你需要到某个页面时,关闭之前所打开的Activity可以用到。

SingleInstance单实例模式

这种模式启动的Activity实例单独占用一个任务栈,也就是启动该模式的Activity同时给它分配一个任务栈。 使用场景:singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

以上就是Android开发基础中的Activity生命周期,Android的技术学习才刚刚开始,更多Android进阶技术学习尽在《Android核心技术手册》里面大大小小30多个技术文档,可以供你查缺补漏学习!

文末

要正确实现生命周期的回调方法,从而使应用程序正确动作,需要注意以下几点:

  • 确保用户使用你时,应用程序可以接听电话或切换到其他应用程序,而不会崩溃。确保您的应用程序在用户不使用时不会消耗系统资源。
  • 确保用户在从其他应用程序切换回您的应用程序时可以继续他们以前的工作,并且在切换用户屏幕或其他操作时不会崩溃或丢失用户数据。

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

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

相关文章

一年一度的云计算春晚——亚马逊云科技re:Invent

一年一度的云计算春晚——亚马逊云科技re:Invent,近日盛大开幕。那么“云计算春晚”发布了什么AI产品? 首先来看Amazon SageMaker,今年是其发布的第五年,各行各业已有数百万个机器学习模型使用该服务管理,每月进行数千…

支付服务-----功能实现逻辑

支付服务实现逻辑 简单概况一下支付服务的实现逻辑 通过支付宝的沙箱环境来模拟支付功能,用户点击支付宝的链接后给后端发/aliPayOrder请求,封装支付宝需要payVo对象,并且调用 String pay alipayTemplate.pay(payVo)和 return pay&#xf…

A-LEVEL经济例题解析及练习Economic Question

每日一练 例题 Question: Consumer surplusA. Find Marginal Buyer’s WTP (Willingness to Pay) at Q10. B. Find Consumer Surplus for P30. Suppose P falls to $20. How much will Consumer Surplus increase due to: C. buyers entering the market D. existing buyers pa…

mysql8安装过程

1下载地址 https://downloads.mysql.com/archives/community/ 根据自己电脑系统环境选择操作系统和版本,本人选择下载的是windows 64位, 2.创建并编写my.ini文件 创建一个文本文档将文件名改为my后缀为ini my.ini配置其中basedir跟datadir自行根据加…

发布了二十年的《敏捷宣言》是否依然适用?

敏捷宣言已经诞生二十年,这份简短却“颠覆”规则的文件,帮助我们将产品开发交付的方式,从长途运输变成了“次日达”一样的存在。当下的我们正处在一个持续创新的世界,面对技术变革洪流,有时候我们可能会产生思考&#…

day42 文件包含LFIRFI伪协议编码算法代码审计

前言: #知识点: 1、解释-什么是文件包含 2、分类-本地LFI&远程RFI 3、利用-配合上传&日志&会话 4、利用-伪协议&编码&算法等 #核心知识: 1、本地包含LFI&远程包含RFI-区别 一个只能包含本地,一个可…

操作系统例题合集(持续更新)

传送门 由于操作系统知识太多,再加上我总结的比较细,所以一片放不下,拆分成了多篇文章。 操作系统笔记——概述、进程、并发控制 操作系统笔记——储存器管理、文件系统、设备管理 操作系统笔记——Linux系统实例分析、Windows系统实例分析 …

模拟和矢量信号源进阶使用技巧

前言 通常射频信号源的简单应用通常只是输入频率、功率,加上一些模拟、数字调制,然而要充分挖掘出信号源的潜力和性能需要更多的技巧。本应用指南会告诉您可以通过更多的方式提高射频信号源输出信号的质量,具体内容包括: 1. 提高…

【LeetCode_字符串_逻辑分析】6. Z 字形变换

目录考察点第一次:2022年12月9日10:58:17解题思路代码展示题目描述6. Z 字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下&#xf…

DAP组件外部服务开发说明

DAP数据分析平台主要是为了满足企业数据分析的需要而开发的一款产品,不同于一般的BI平台,DAP数据分析平台更侧重数据的聚合,平台预置有数据源注册、ODS注册与管理、数仓配置与数据聚合,从而实现企业业务数据的统一,构建…

不掌握这些坑,你敢用BigDecimal吗?

背景 一直从事金融相关项目,所以对BigDecimal再熟悉不过了,也曾看到很多同学因为不知道、不了解或使用不当导致资损事件发生。 所以,如果你从事金融相关项目,或者你的项目中涉及到金额的计算,那么你一定要花时间看看…

C++ 特殊类的设计

文章目录1. 设计一个只能在堆上创建对象的类2. 设计一个只能在栈上创建对象的类3. 设计一个类不能被拷贝4. 设计一个类 不能被继承5. 设计一个类,只能创建一个对象前言: 在本文中,我们掌握几种常见的特殊类的设计。1. 设计一个只能在堆上创建…

微信小程序使用vant 和 mobx 自动定义Tabbar

vant 和 mobx 自动定义Tabbar 在此案例中,用到的主要知识点如下: 自定义组件 Vant 组件库 MobX 数据共享 组件样式隔离 组件数据监听器 组件的 behaviors Vant 样式覆盖 1.首先需要给我们的app.json 配置tabBar “custom”:true 注意点&…

代码随想录算法训练营第五十九天| LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一个更大元素 II 1:题目描述(503. 下一个更大元素 II) 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的…

实践 DevOps 测试策略

什么是 DevOps 测试策略? DevOps 的一个重要组成部分是持续集成/持续交付(CI/CD),在 CI 和 CD 之间的就是持续测试。 如果不进行持续测试,将会出现: 缺陷的泄漏软件延期交付客户不满意DevOps 测试策略的好处 可以提供更快的反…

如何在vscode、remix中结合hardhat编译部署合约

创建 hardhat 工程 # 创建npm空项目,注意这里要选择合约项目对应的文件目录 npm init # 安装 hardhat 环境,这里安装的版本 2.11.1 npm install --save-dev hardhat2.11.1 # 创建工程 npx hardhat首先创建 npm 空项目,注意这里要选择合约项目…

Linux编程环境

一、实验目的 1.熟悉Linux下C语言程序设计的基本步骤 2.掌握gcc编译器的各种参数的使用方法 3.掌握gcc编译器创建函数库的方法 4.掌握gdb调试程序的方法 5.掌握多文件编译中的makefile的用法 二、实验软硬件要求…

matlab学习笔记(八)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 matlab学习笔记(八)一、傅里叶变换的MATLAB求解二、连续时间信号的频谱图三、MATLAB分析LTI系统的频率特性一、傅里叶变换的MATLAB求解 MATLAB的symb…

大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS

文章目录📚web前端期末大作业 (1500套) 集合一、网页介绍二、网页集合三、作品演示A电影主题B漫画主题C商城主题D家乡主题E旅游主题F餐饮/美食主题G环境主题H游戏主题I 个人主题K体育主题L博客主题M汽车主题N文化主题P美妆主题Q企业主题R教育主题S其他主题&#x1f…

Docker的私有仓库部署——Harbor

一.Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库,共有仓库只要在官方注册用户,登录即可使用。但对于仓库的使用,企业还是会有自己的专属镜像,所以私有库的搭建也是很有必要的…