发现当前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. </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栈的栈顶。这种方法仅仅有一个參数http://code.google.com/android/reference/android/conten

android.app.Activity 的介绍的更多相关文章

  1. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法

    在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity ...

  2. 使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决

    在工程ndk22/bin/classes中 运行javah  com.cn.ndk22.Ndk22.Activity ,出现了.h文件 我在bin/classes目录中 ,就是无法访问, : 错误:无 ...

  3. javah编译class文件找不到android.app.Activity的类文件

    在android工程的根目录使用javah生成jni 头文件时候,报找不到android.app.Activity的类文件错误. 无法访问android.app.Activity是说明没有引入andr ...

  4. javascript开发 ios和android app的简单介绍

    先看几个名词解释: nodejs ionic,Cordova,phoneGap,anjularjs react-native,reactjs nodeJs 的介绍参见这里,写的很好http://www ...

  5. android.app.Activity阅读摘要,有时候会不会需要保持一些现场数据呢? 想让系统帮你退出到后台或者挂掉前做些前置保持工作吗,重点参考吧:

    * * @param savedInstanceState If the activity is being re-initialized after * previously being shut ...

  6. javah 错误: 无法访问android.app.Activity问题解决

    cd /Users/musictom/Documents/source/ky/app/build/intermediates/classes/debug javah -jni -classpath / ...

  7. 错误:无法访问android.app.Activity 找不到android.app.Activity的类文件

    视频里面在工程ndk22/bin/classes中 运行javah  com.cn.ndk22.Ndk22.Activity ,出现了.h文件 但是我在bin/classes目录中运行javah 时出 ...

  8. 【转】调用getActionBar()报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar

    解决办法: 第一种方法:修改AndroidManifest.xml中的minSdkVersion=11   第二种方法: 1.导入android-support-v7-appcompat项目,并将其作 ...

  9. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

随机推荐

  1. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...

  2. QT中槽的使用

    一.建立槽和按钮之间的连接 connect(信号发送者,发送的信号,信号接收者,信号接收者的槽函数) 1.例子 connect(ui->pushButton,SIGNAL(clicked(boo ...

  3. params修饰符

    http://msdn.microsoft.com/zh-cn/library/w5zay9db.aspx params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗 ...

  4. 使用flex

    Flex如何处理二义性模式: 1.词法分析器匹配输入时匹配尽可能多的字符串 2.如果两个模式都可以匹配的话,匹配在程序中更早出现的模式 上下文相关的记号 flex提供起始状态(start state) ...

  5. JavaScript中的内存泄漏以及如何处理

    随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...

  6. CSS实现盒子高度撑开且以最高的为高

    前端开发中,常常会有需求两个盒子并排排列,高度以最高的为准,且高度是内容撑开的,类似于这样 如果不是用 table 布局,而是用 div 布局,两个子盒子浮动来实现的话,实际上默认写出来是这样的 此时 ...

  7. unity3d开发环境配置

    1. 首先先下载软件包:http://pan.baidu.com/s/1imYVv  4.2版本2.下载完后,解压会看到两个文件(运行第二个安装包) 3.准备安装,这里直接上图了. 这里全选,里面包括 ...

  8. IPv6 VS IPv4,谈谈升级 IPv6 的必要性

    11月26日,中办.国办印发了<推进互联网协议第六版(IPv6)规模部署行动计划>,提出国内要在 5~10 年的时间形成下一代互联网自主技术体系和产业生态,建成全球最大规模的 IPv6 商 ...

  9. 随笔-SQL的三种存储引擎即三种类型的表

    MYSQL 的环境变量:......server/bin下 引擎(Engine):是电子平台上开发程序或系统的核心组件.利用引擎,开发者可迅速建立.铺设程序所需的功能,或利用其辅助程序的运转.一般而言 ...

  10. Ztree改版 - 将图标字体化 - fontAwesome

    引言 ps:小白可以一看,大神勿打~ 用过 ztree 的盆友们都知道,ztree 功能强大,就功能上来说,追求着“无处不按钮”的体验,但好用不好看.可能有朋友说:“我这棵树只有我自己看,够用就行” ...