android.app.Activity 的介绍

发现当前Android的资料不是很多,而且对于Activity的介绍也很少,所以把官方文档的android.app.Activity的介绍翻译了一下,加入了一些自己的理解。各位如果觉得我自己理解的不对,请无视。欢迎邮件讨论。

android.app 
public class

android.app.Activity

java.lang.Object

android.content.Context

android.app.ApplicationContext    ViewInflate.Factory

android.app.Activity      KeyEvent.Callback Window.Callback

 

 

Activity 是用户唯一可以看得到的东西。几乎所有的activity都与用户进行交互,所以Activity主要负责的就是创建显示窗口,你可以在这些窗口里使用setContentView(View)来显示你自己的UI。activity展现在用户面前的经常是全屏窗口,你也可以将activity作为浮动窗口来使用(使用设置了windowIsFloating的主题),或者嵌入到其他的activity(使用ActivityGroup)中。下面是两个几乎所有Activity的子类都实现了的方法。

onCreate(Bundle) 这个方法是初始化 activity的地方. 最重要的是,你经常需要在这里使用setContentView(int) 来设置UI布局所使用的layout资源, 当你需要使用程序控制UI中的组件时可以使用 findViewById(int) 来获得对应的视图。

当用户离开activity时你可以在onPause() 进行相应的操作. 更重要的是,用户做的任何改变都应该在该点上提交 (经常提交到ContentProvider 这里保存数据)。

如果要使用 Context.startActivity()来启动activity, activity都必须在启动者应用包的AndroidManifest.xml文件中有对应的 <activity> 定义。

 

Activity类是 application's overall lifecycle 的一个重要部分。

 

这里涉及到的主题:

  1. Activity 生命周期
  2. 配置改变
  3. 启动Activity并获得结果
  4. 保存持久状态
  5. 许可
  6. 进程生命周期

Activity 生命周期

系统中的Activity可以通过一个activity栈来进行管理。当一个新的activity启动的时候,它首先会被放置在activity栈顶部并成为running状态的activity —— 之前的activity也在activity栈中,但总是被保存在它的下边,只有当这个新的activity退出以后之前的activity才能重新回到前景界面。

 

所有的activity本质上有四种状态:

  • activity在屏幕的前景中(activity栈的顶端),它是active或者running状态。

 

  • activity失去了焦点但是仍然可见(这个activity顶上遮挡了一个透明的或者非全屏的activity),它的状态是paused。一个paused状态的activity完全是alive的(它维护自己所有的状态和成员信息,而且仍然在window manager的管理中),但当系统内存极度贫乏时也会将其killed。

 

  • activity由于其他的activity而完全变暗,它就进入了stopped状态。它仍然保持着所有的状态和成员的信息,可是,他对于用户来说不可见,当别的地方需要内存的时候它经常会被killed。
  • activity是paused或者stopped,系统需要将其清理出内存的时可以命令其finish或者简单kill其进程。当它重新在用户面前显示的时候,它必须完全重新启动并且将其关闭之前的状态全部恢复回来。

下面的图表是Activity的状态图,直角矩形代表了callback方法,你可以实现这些方法从而使Activity在改变状态的时候执行你制定的操作。带颜色的椭圆形是Activity的主要状态。

 

 

 这里有三个比较关键的生命周期。

  • 从最初调用onCreate(Bundle)到最终调用onDestroy()称为完整生命周期。Activity会在onCreate()进行所有“全局”状态的设置,在onDestroy()中释放所有持有的资源。举个例子,如果它有一个从网络上下载数据的后台线程,那他可能就会在onCreate()中创建这个线程并在onDestroy()中停止这个线程。
  • 从activity调用onStart()开始,到调用对应的onStop()为止称为可见生命周期。在这段时间内用户可以在屏幕上看到这个activity,尽管并不一定是在前景也不一定可以和用户交互。在这两个方法之间你可以维护那些activity在用户显示时所需的资源。举个例子来说,你可以在onStart()中注册一个IntentReceiver来监控那些可以对你的UI产生影响的环境改变,当你的UI不继续在用户面前显示时你可以在onStop()中注销这个IntentReceiver。每当activity在用户面前显示或者隐藏时都会调用相应的方法,所以onStart()和onStop()方法在整个生命周期中可以多次被调用。
  • 从activity调用onResume()开始,到调用对应的onPause()为止称为前景生命周期,这段时间activity处于其他所有activity的前面,且与用户交互。一个activity可以经常在resumed和paused状态之间转换——例如手机进入休眠时、activity的结果返回时、新的intent到来时——所以这两个方法中的代码应该非常的简短。

下面的Activity方法定义了activity完整的生命周期。他们全都是hook方法,你可以重载这些方法从而使activity在状态改变时执行你所期望的操作。所有activity都应该实现自己的onCreate(Bundle)方法来进行初始化设置;大部分还应该实现onPause()方法提交数据的修改并且准备终止与用户的交互。尽管我们计划在系统中添加更多的工具来管理应用,现在大多activity仍需要实现onFreeze()并且在onCreate(Bundle)中执行对应的状态恢复。其他的方法可以在需要时进行实现,当实现这些方法的时候需要注意的是一定要调用父类中的对应方法。

 

Java代码 
  1. <span style="font-size: small;">public class Activity extends ApplicationContext {  
  2.      protected void onCreate(Bundle icicle);  
  3.      protected void onStart();  
  4.      protected void onRestart();  
  5.      protected void onResume();  
  6.      protected void onFreeze(Bundle outIcicle);  
  7.      protected void onPause();  
  8.      protected void onStop();  
  9.      protected void onDestroy();  
  10.  }   
  11.   
  12.    
  13. </span>  

 

 

 

一般来说activity的生命周期变化看起来比较象下面的表格:

 

(此处译者进行了大块的修改,请参考原文阅读下面表格)


 

方法

描述

Killable?

下一方法

onCreate()

Activity初次创建时被调用,你应该在这里进行一般的静态设置:创建view、将数据绑定到list等等。如果activity之前存在冻结状态,那么此状态将在Bundle中提供。

如果activity首次创建,本方法后将会调用onStart(),如果activity是停止后重新显示,则将调用onRestart()。

No

onStart() or onRestart()

 

onStart()

当activity对用户即将可见的时候调用。

其后调用onRestart()或onResume()(框架是否进行选择性调用onResume()仅仅是猜测)

No

onRestart() or onResume()

onRestart()

当activity从停止状态重新启动时调用。其后调用onResume()。

No

onResume()

 

onResume()

当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它。

如果其他的activity在它的上方恢复显示,则将调用onFreeze()。

No

onFreeze()

onFreeze()

当你的activity被暂停而其他的activity恢复与用户交互的时候这个方法会被调用(在其他activity显示之前),你可以使用这个方法保存你当前的用户状态(一般来说是当前实例的用户状态)。暂停之后,为了回收资源供给前景activity,系统会在需要的时间停止(或者kill)你的应用。以后如果你的activity启动一个新的实例重新与用户进行交互,你保存在这里的状态都将通过onCreate()方法传递给新的实例。

其后总是调用onPause()方法。

No

onPause()

onPause()

当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。

如果activity重新回到前景时将调用onResume(), 如果对用户彻底不可见则会调用onStop()。

Yes

onResume() or
onStop()

onStop()

当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。

当activity重新回到前景与用户交互时调用onRestart(),如果activity将退出则调用onDestory()。

Yes

onStart() or
onDestroy()

onDestroy()

在你的activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况(对activity直接调用finish()方法或者系统为了节省空间而临时销毁此activity的实例,你可以通过isFinishing()的返回值来区分这两种情况)。

Yes

nothing


①: 这个表格本人觉得还有些值得商榷的地方,建议作为参考阅读,不管是原文还是译文。

 

注意上表中“Killable”这一列 —— 对于那些标记killable的方法,当这些方法结束后,activity的进程可能在任何时间被系统kill而不再执行activity中的任何代码。因此你应该利用onFreeze()(保存你当前UI的状态)和onPause()(将所有的修改写回持久存储),这样activity才能在被kill的时候正确的保存当前的状态。如果需要了解一个进程的生命周期与他所执行的activity之间的关系 参见 进程生命周期 部分。

 

       对于那些标记killable的方法,从这些方法启动开始直到返回之前,activity的进程都不回被系统kill。举个例子,一个activity在onPause()方法返回后处于killable的状态,这种状态会一直持续到onResume()方法开始执行。

 

配置改变

如果设备的配置(在Resources.Configuration中进行了定义)发生改变,那么所有用户界面上的东西都需要进行更新,以适应新的配置。因为Activity是与用户交互的最主要的机制,它包含了处理配置改变的专门支持。

 

       除非你特殊指定,否则当配置发生改变(比如屏幕方向、语言、输入设备等等的改变)时你当前的activity都将被销毁,这销毁是通过一个正常的activity生命周期过程(onFreeze(Bundle), onPause(), onStop(), 和 onDestroy())进行的。如果activity之前正在前景画面,当这个实例的onDestroy()调用完成后将会启动这个activity的一个新的实例,并将前面那个实例中onFreeze(Bundle)所保存的内容传递给新的实例。

 

因为任何的应用资源(包括layout文件)都有可能由于任何配置值而改变。因此处理配置改变的唯一安全的方法就是重新获取所有的资源,包括layout、绘图资源(原文drawables)、字符串资源。由于activity已经如何保存自己的状态并从这些状态中重建自身,所以activity重新启动自身来获得新的配置将是一个非常便利的途径。

 

       在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的onConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。

 

启动Activity并获得结果

startActivity(Intent)方法可以用来启动一个新的activity,这个activity将被放置在activity栈的栈顶。这个方法只有一个参数

Android学习路线_入门篇(一)编写简单的APP Android学习入门的目标就是能够编写出一个完整的APP,有可交互的界面,有基本的功能,有本地的数据库,有与后台的数据交换。在本文我们会了解到如何在AndroidStudio中新建、运行、打包一个APP,一个最简单的APP基本的要素有哪些。 阅读详情

相关推荐

安卓APP(2)——安卓的工程目录文件夹介绍和安卓APP启动过程

安卓APP(2)——安卓的工程目录文件夹介绍和安卓APP启动过程

weixin_50546241的博客 1800

实现获取appPackage和appActivity的方法

基本介绍: appPackage:简单来说是App开发者提供的名称。 appActivity:简单来说是App提供的各种不同的功能。每个程序都有个MainActivity,就是打开程序时显示在屏幕的活动。 appPackage和appActivity是desired capabilities中非常重要的两个参数,在使用appium进行自动化测试时我们常常会用到这两个参数,那么如何获取这两个...

白清羽的博客 9237

S32K3 eMIOS使用介绍(PWM输出与输入捕获)——基于MCAL

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm的输出及输入捕获。

HeFlyYoung的博客 2万+

获取android appActivity的四种常用方法

=========不积跬步无以至千里========== 在进行Android的app UI自动化时,从Appium启动制定package是通过获取指定的android activity实现的,那么如何获取目标Activity就成为了启动一个Appium Session的第一步,先总结方法如下: 方法一 从Appium指定安装包 这个方法为最简单粗暴,即下载好了待测package后,在app...

CosetteQi 3万+

从示波器波形看懂死区:手把手教你调ST MCU的PWM,避免三相桥直通炸管

本文详细解析了如何通过示波器波形判断PWM死区时间,并手把手教你调整STM32高级定时器寄存器,避免三相逆变桥直通炸管。文章涵盖死区时间的本质与风险、STM32配置详解、示波器调试技巧及FOC系统中的特殊考量,帮助工程师优化电机驱动性能与安全性。

weixin_30315723的博客 733

Hierarchical Flow Partition(Top-down&&Bottom-up)

hierarchy flow是将设计切分成多个block,分别处理单个block,然后完成后,将它们进行拼接以完成最终的chip。一般划分为三个阶段:chip planning;physical budget就是pin assignmenthierarchy flow实现的方法有两种,一种是top-down,另一种是bottom-up,无论是哪种,都是都要通过flatten的方法分别全局范围进行优化实现。

qq_39493558的博客 3062

Android第2讲:活动(Activity)

活动 Android中有四个常用的组件:活动、服务、广播接收器、内容提供者。 1. 活动概述 1.1 创建活动 1.2 活动的生命周期 主要三种状态 7中方法 三个嵌套循环 1.3 Back和Home按钮的区别 2.多活动之间的跳转 2.1 登录案例 2.2 启动下一个活动 2.3 参数传递 2.4 返回上一个活动 2.5 活动任务与返回栈 ...

weixin_47323733的博客 1205

[华为ensp]双核心的园区网

(给部分只会emm......借鉴的朋友提个醒,在group-member e0/0/2 to e0/0/20是所选,所以到了p l t那会给2-20端口都配置上trunk,别紧张,不是你问题)完成上述配置后,PC1可以ping通HTTP2服务器,Client1可以访问HTTP2服务器的HTTP站点,如果不能就要检查上述是否正确。本次实验主要目的是采用双核心的冗余网络,采用MSTP和VRRP技术,在核心层交换机上配置SC1上配置OSPF协议。SC1交换机上配置VRRP。在SC1上配置DHCP。

2301_78859499的博客 1416

[977]adb查看App的appPackage和appActivity

上方将所有进程显示出来,活动进程很多比较难找,这里知道package名称,可以在结果中进行查找,得到appActivity的值为MainActivity。通过这个信息我们知道,对于这个包,上方desired_caps字典中appPackage的值应填写为 com.baidu.search。在连好手机的情况下点击这个按钮,界面上就会显示出当前手机的页面(如果是锁屏状态则显示黑屏)左上角一共四个按钮,作用分别是打开本地文件、dump页面、dump压缩格式的页面、保存;2、在命令窗口中输入,

周小董 5859

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 825

Linux下CUDA 11.8与vllm的完美搭配:从环境配置到避坑指南

本文详细介绍了在Linux系统中为CUDA 11.8环境部署vLLM的完整实战指南。针对cu118与vLLM的版本兼容性核心问题,提供了从Python、PyTorch版本选择,到关键依赖vllm-nccl-cu11的安装避坑,以及环境调优、生产级容器化部署的全面解决方案,帮助开发者高效构建稳定的大模型推理服务。

weixin_29095049的博客 308

java类安卓app 简介_android.app.Activity 的介绍

文章可随意转载,但务必注明源地址发现当前Android的资料不是很多,而且对于Activity的介绍也很少,所以把官方文档的android.app.Activity的介绍翻译了一下,加入了一些自己的理解。各位如果觉得我自己理解的不对,请无视。欢迎邮件讨论。android.apppublic classandroid.app.ActivityActivity是用户唯一可以看得到的东西。几乎所有的ac...

weixin_35924353的博客 588

SAP 52策略测试简介

我们看下下层物料的需求,可以看到物料的需求已经跑出来了,我们双击计划订单,发现是没有办法将计划订单转换为采购申请的,这里是否还记得我们在前面创建主数据的时候独立集中我们填写的是1,所以物料继承了上层物料的策略,所以不能将计划订单进行转换。我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。可以看到下层物料的计划订单就可以转采购申请了,到这里可以看到52策略和50策略的计划独立需求完全是一样的。

我小时候很黑的博客 1270

android.app.Activity 的介绍(转)

转自marshal.hird@gmail.com 发现当前Android的资料不是很多,而且对于Activity的介绍也很少,所以把官方文档的android.app.Activity的介绍翻译了一下,加入了一些自己的理解。各位如果觉得我自己理解的不对,请无视。欢迎邮件讨论。 android.app public class android.app.Activity jav...

weixin_30707875的博客 282

在STM32F103RBT6微控制器上利用USB虚拟Com端口技术,高效实现ADC数据传输:详细操作步骤与示例代码解析

以上就是在STM32F103RBT6上使用USB虚拟Com端口实现ADC数据传输的全部内容。虽然过程中有很多步骤和细节需要注意,但只要按照步骤来,理解每一段代码的作用,就完全可以掌握这个过程。在实际应用中,我们可能需要根据实际需要修改一些代码,如调整ADC的参数,改变数据的处理方式等。但是,只要理解了这个过程,我们就可以很灵活地进行修改。希望这篇文章对你有所帮助。如果你有任何疑问,欢迎在评论区留言,我会尽我所能进行解答。

qq_38334677的博客 1168

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

安卓系统APP开发简介

2.1 安卓系统的概念安卓系统性能。现今的安卓系统自身有蓝牙、无线网的连接性能,摄影、拍照等相关的功能,并且具备有数据信息的传输与下载功能,对应的软件能够直接进行对应的安装、虚拟键盘转变等对应的性能,远程打印、指纹支付体系等相关先进技术的加入。安卓是现如今使用最多也是范围最广的一个操作系统,其自身有一定的开放性质以及性能完备的特征,让当下的安卓系统配适的智能手机越来越多,不仅如此更是带动了安卓体系自身的深入进步与发展。安卓系统的架构。

hukejishu的博客 1730

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android App 加载过程介绍:从 startActivity() 到 Activity.onCreate()

设备启动后会启动 init 进程(init main),此进程会根据 init.rc 文件进行启动后的相关调用(文件位置),主要是生成许多硬件相关的守护进程,比如 android debug 守护进程,USB 守护进程等,还会启动大名鼎鼎的 ‘zygote’ 进程,它会初始化一个非常原始的 Dalvik VM,并且会提前加载一些 framework 或已安装应用的通用类,之后会进入就绪状态,等待通...

BillionLeeGogogo 1096

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

cordova 安卓文件多选_安卓开发起步:创建第一个安卓app

安卓手机是当今世界使用最多的手机,安卓app也无处不在。本文演示如何开始开发第一个安卓app。开发前准备在正式开发之前,需要先完成下面的准备工作:安装jdk8或者jdk11安装android studio创建项目启动android studio,点击Create New Project:然后需要选择一个项目模板,这里选择Empty Activity后点击Next:项目名称填写Androi...

weixin_39711914的博客 123

android退出app代码,Android应用退出代码各种方式

1. 点击按钮最小化app返回到home//并不会退出app,只是最小化findViewById(R.id.button3).setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){Intentintent=newIntent(Intent.ACTION_MAIN);intent.addCategory(In...

weixin_35975177的博客 3011
上一篇: android sdk+eclipse+adt 配置与开发
下一篇: Java 7新I/O特性解析
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值