android.app.Activity 的介绍

时间:2022-09-02 18:09:02

发现当前Android的资料不是非常多,并且对于Activity的介绍也非常少。所以把官方文档的android.app.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