Activity 基础知识--翻译篇

  • 简要概述

Activity是四大组件中唯一与用户直接交互的, 开发者通过调用setContentView方法来展示UI 。

onCreate() : 在这个方法中设置你的UI布局, 做静态初始化工作(初始化UI控件)

onPause() :  当你在离开Activity的时候会被触发调用, 更重要时要记得在这保存你的数据(可通过ContentProvider来保存数据)

如果要使用content.startActivity , 那么这个被启动的Activity一定要在Androidmanifest.xml中声明。如果开发大屏应用Fragment是最佳的选择, 它从3.0开始出来, 如果兼容3.0之前的系统可以使用Support.v4 包

  • 生命周期

Activity 被系统的Activity Stack管理,当一个新的Activity被创建, 那么它将处于Activity Stack的栈顶并成为运行状态, 之前处于栈顶的Activity将自动处于其之下,并且将不会再次回到前台,直到它之前的Activity退出栈。

Activity的状态如下:

1.  如果Activity处于屏幕的前台, 即处于Stack栈顶, 那么他的状态即 活动的或者运行的。

2.  如果Activity失去焦点但是仍然对用户可见(比如,一个非全屏的或者透明的Activity获取到焦点并处于栈顶时), 那么它将处于暂停状态。 处于暂停状态的Activity是完全活着的(它维持所有的状态和成员信息,并仍然保持依附于WindowManager), 但是它可以被系统在极端低内存的情况下杀死。

3.  如果Activity被其他Activity完全覆盖,完全不可见, 那么它将处于停止状态, 它仍然维持着所有的状态和成员信息, 但是它不再对用户可见, 它可能在系统任何时候需要内存的时候杀死。

4.  假如Activity处于暂停或者停止状态, 系统可以删除内存中的Activity并使之Finish , 或者直接杀掉它的进程。 他会被重启并重新恢复所有状态, 当他再次对用户可见的时候。

Activity的生命周期经典图:

下面3个环节在你监控Activity的时候需要注意:

1.  Activity的整个生命周期处于第一次onCreate到最后onDestroy , 开发者需要设置所有的全局状态变量在onCreate的时候, 并释放资源在onDestroy的时候, 假如你在onCreate创建了一个线程在后台工作, 那么你需要在onDestroy的时候结束它 。

2.  Activity的可见生命周期是从onStart开始到onStop结束。 你可以在onStart注册广播, 在onStop取消注册广播。这两个方法可能会被调用多次, 当它再次对用户可见或者隐藏时。

3.  Activity处于前台的生命周期是从onResume开始到onPause结束。 在这段时间内它处于所有Activity栈的前面, 并可以与用户交互。 这两个方法被调用的频率最多,比如:设备休眠时。

所有生命周期的方法 , 必须首先调用super父方法

  • 屏幕旋转

当屏幕旋转或者Configuration配置发生变化的时候, Activity 会跟随变化。 这种变化可能发生在: 语言变化, 屏幕尺寸变化, 屏幕方向变化, 输入法等, 它可能引起当前的Activity被摧毁, 如果这个Activity处于前台对用户可见, 那么它可能会被重新创建, 可以通过onSaveInstanceState来保存并且会在新的Activity中恢复这些状态。 这样做是因为应用的资源文件可以跟随configuration的值来变化, 重新加载,检测所有资源文件是唯一的安全方式来应对configuration的变化。 因为Activity必须已经知道这种状态并根据状态来重新创建它 , 这种一种非常简单的方式来根据configuration来重新创建它。 在某些特殊的案例中, 你可能不需要重新创建Activity 当configuration发生不同变化的时候, 你需要设置Androidmanifest.xml中设置android:configChanges来完成它, 只要你声明了任何配置类型的更改已经有了处理, 它将不会重新创建Activity并调用onConfigurationChanged 方法。

  • 启动Activity与获取Result

通过startActivity来启动一个Activity, 它仅附带一个Intent参数, 这个对象中描述了要启动的Activity。 有些时候你可能需要从要启动的Activity中获取到一个返回结果, 那么需要用startActivityForResult方法来启动Activity, 并使用onActivityResult方法来处理这种结果。 当启动的Activity退出的时候, 需要调用setResult方法来告之结果。

  • 保存持久化数据

当Activity处于onStop或者onDestroy 生命周期时,可能会被随时杀掉, 因此开发者需要在onPause方法这里做数据保存, 实际上, onSaveInstanceState方法会在Activity进入到后台的时候调用,开发者可以利用Bundle来保存动态的状态变量, 当他需要被重新创建的时候这些数据会在onCreate中被接收。 onPause比onSaveInstanceState更适合做数据保存, 因为后者并非是Activity生命周期的一部分, 它并非在各种场景中都会被调用。 要知道这些语义在不同安卓平台中出现细微变化, android.os.Build.VERSION_CODES.HONEYCOMB 相对比之前的安卓平台, Activity不再处于可杀死的状态直到onStop结束, 这会影响onSaveInstanceState的调用。 生命周期的方法不再会被标记为可杀死状态, 在方法执行过程中Activity进程将不再会被系统杀死, 只有有种Activity处于可杀死状态, 比如: onPause方法之后,到onResume之前 。

一般有两种方式来对Activity的数据做持久化保存:

1.  储存在Sqlite中

使用ContentProvider来做数据库存储的时候,

2.  储存在SharePreference中

  • 权限

安卓系统中有许多权限, 比如网络权限, 蓝牙权限, 文件读写权限, 网络权限等。 当使用到这些功能时, 需要在AndroidManifest.xml中声明。使用带权限Intent.FLAG_GRANT_READ_URI_PERMISSION 或者 Intent.FLAG_GRANT_WRITE_URI_PERMISSION的Intent启动Activity时, 这将授予对特定URL的访问Activity, 访问将保留,直到Activity结束 。 自android.os.Build.VERSION_CODES.GINGERBREAD(姜饼) 系统后, 如果Activity已经被创建过, 那么再次启动时, 新的Intent将被传递到onNewIntent方法中

  • 进程生命周期

Android系统会将可能的保存应用进程更久的时间, 但是最终还是要删除旧的进程(时间久的)再内存不足的时候。 Activity的生命周期中, 被删除的进程将紧密依赖其与用户交互的状态, 进程的运行将取决于它的Activity的四种状态:

1.  处于前台的Activity (与用户正在交互且处于屏幕的最上方)是被视为最重要的,如果使用的内存比设备可用的内存要多, 它的进程将被在最后杀死。它需要保证足够的内存来用于用户交互。

2.  处于可见状态的Activity是被认为极为重要的, 并且不会被杀死, 除非是为了保证前台Activity的运行。

3.  处于后台的Activity不再是关键了, 因此系统可以安全的干掉它来保证前台或者可见的进程运行。 当它被干掉到再次创建时, onCreate会持有所有onSaveInstanceState的状态信息。

4.  一个空的进程(没有Activity,或者是一个组件(服务,广播)), 当系统内存低的时候, 将会被迅速回收, 正因为如此, 在做任何脱离Activity之外的后台操作, 需要在Activity广播或者服务的上下文中执行, 使系统知道它需要保持在你的应用进程周围。

有时候Activity需要做独立存在于生命周期的长时间操作, 比如: 要上传一张照片到服务器, 耗时很长的时候用户需要退出它到后台完成, 这时候你的Activity需要开启一个Service来完成它, 这时候系统将会优先处理它, 不管你的Activity是处于停止,暂停还是finished状态。

时间: 2024-12-21 21:56:59

Activity 基础知识--翻译篇的相关文章

SQL数据库基础知识-巩固篇<一>

SQL数据库基础知识-巩固篇<一>... 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用了> MySQL-57 DataBase MS-SQLServer-2000 DataBase SQL的含义:结构化查询语言(Structured Query Language)简称SQL 作用:SQL(Structured Query Language,结构化查询语言)是一种用于操作数据库的语言. 结构化查询语言包含6个部分:一:数

Docker 基础知识-入门篇

1. Docker简介和KVM区别 1.1 docker的三大理念 构建 运输 运行 ps:有点类似于java代码,一次构建到处运行 1.2 docker结构 相关说明:image: 和虚拟机的镜像类似container: 用镜像创建的实例repository: 类似于yum仓库docker client: 命令行输入的docker命令docker server: 启动的docker进程 1.3 docker和kvm的区别 1.虚拟机需要hypervisor这个中间层来进行支持,上面跑的每一个虚

Android学习杂记-Activity基础知识

本文摘录自Tekkaman博客. [Activity介绍] 一个Activity是一个应用程序组件,提供一个屏幕,方便和用户实现交互.每一个activity被给予一个窗口,在上面可以绘制用户接口.在一个Activity创建时,其实现的onCreate(Bundle savedInstanceState)方法将被系统回调,通常在这个方法里调用setContentView(View view)方法加载显示布局文件UI,并利用findViewById方法获取布局UI中的控件,对其修改数据或填充数据.

java基础知识----IO篇

写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,文章依旧以例子为主,因为讲解内容的java书很多了,我觉的学以致用才是真.代码是写出来的,不是看出来的. 最后欢迎大家提出意见和建议. [案例1]创建一个新文件 1 2 3 4 5 6 7 8 9 10 11 import java.io.*; class hello{     public static void main(String[] args) {         File f=new File("D:\\he

Linux基础知识----第一篇:Linux系统常识性了解(欢迎评论指正,随时保持更新)

1.ls -a命令,会列出当前目录下的所有内容(.cache,controller.py); 2..cache中.表示该文件是隐藏文件;controller.py中后缀py表示python脚本; 3.vi .profile表示编译.profile这个隐藏文件,其中文本内容#表示该行内容为注释; 4.00 03 * * * sh /root/refreshBondGoods/run.sh  >>  log.log,表示每天凌晨3点执行run.sh脚本,将日志自动输入到log.log文件中;(有关

python基础知识第二篇

基本数据类型 数字                  整形 int                             ---int                            将字符串转换为数字 num="123" n1=int(num) print(n1) print(type(a)) 查看是什么类型的 num=10 print(type(num)) .               ----bit_length 当前数字的二进制,表示至少用几位来二进制 num=10

python基础知识第九篇(函数)

函数 >>>>>>>>>>> : 使用函数的好处 1.代码重用 2.保持一致性,方便维护 3.可扩展性 定义方法 def test01(): age="sasa,sdda" print(age) return(age) #形参,不调用时不占内存,必须一一对应,缺一不行,多一也不行#实参,定义实际的值,这叫位置参数,一个参数不能传两个值,也可以s=test(x=1,z=2,y=3), def test(x, y, z):

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

[Python学习] 专题四.文件基础知识

        前面讲述了函数.语句和字符串的基础知识,该篇文章主要讲述文件的基础知识(与其他语言非常类似). 一. 文件的基本操作         文件是指存储在外部介质(如磁盘)上数据的集合.文件的操作流程为: 打开文件(读方式\写方式)->读写文件(read\readline\readlines\write\writelines)->关闭文件 1.打开文件 调用函数open打开文件,其函数格式为: file_obj=open(filename[, mode[, buffering]])