系统会经过该 Activity,系统会将其推送到再次来到栈上

Activity

Activity是一个利用组件,用户可与其提供的显示器举行相互。以举行拨打电话,拍摄照片,发送电子邮件或查看地图等操作。
每个 Activity
都会拿走一个用于绘制其用户界面的窗口(window)。窗口平常会充满屏幕,但也可小于显示屏并扭转在任何窗口之上。
  一个应用普通由多个相互松散联系的 Activity 组成。
一般会指定应用中的某个 Activity 为“主”Activity(Main
Activity),即首次启动应用时表现给用户的百般 Activity。 而且每个 Activity
均可启动另一个 Activity,以便执行不一的操作。 每一回新 Activity
启动时,前一 Activity 便会停下,但系统会在库房(“再次来到栈”)中保留该
Activity。 当新 Activity
启动时,系统会将其推送到重临栈上,并获取用户宗旨。
重返栈遵守“后进先出”堆栈机制,由此,当用户落成方今 Activity 并按“重临”
按钮时,系统会从仓库中将其弹出(并销毁),然后还原前一
Activity。(职分和重临栈文档中对回到栈有更详实的阐发。)
  当一个 Activity 因某个新 Activity 启动而终止时,系统会由此该 Activity
的生命周期回调方法布告其这一境况变化。Activity 因气象变化(系统是成立Activity、截至 Activity、苏醒 Activity 如故销毁
Activity)而接受的回调方法可能有几多种,每一种回调方法都会为你提供执行与该意况变化相应的一定操作的机会。
例如,甘休时,您的 Activity 应释放其他大型对象,例如网络或数据库连接。
当 Activity 苏醒时,您可以另行取得所需资源,并复苏执行中断的操作。
这一个情状转变都是 Activity 生命周期的一有些。
  本文的其他部分解说有关怎么着创设和应用 Activity 的基础知识(包罗对
Activity 生命周期工作措施的无微不至阐释),以便你不利管理各类 Activity
状态之间的变通。

本文内容

  1. 创建 Activity
    1. 已毕用户界面
    2. 在清单文件中宣示 Activity
  2. 启动 Activity
    1. 启动 Activity 以得到结果
  3. 结束 Activity
  4. 管制 Activity 生命周期
    1. 兑现生命周期回调
    2. 保存 Activity 状态
    3. 拍卖配置变更
    4. 协调 Activity

Activity 是一个利用组件,用户可与其提供的显示器举办相互,以实施拨打电话、拍摄照片、发送电子邮件或查看地图等操作。
每个 Activity
都会取得一个用来绘制其用户界面的窗口。窗口寻常会充满屏幕,但也可小于显示屏并扭转在任何窗口之上。

一个使用普通由多个相互松散联系的 Activity 组成。 一般会指定应用中的某个
Activity 为“主”Activity,即首次开行应用时表现给用户的格外 Activity。
而且每个 Activity 均可启动另一个 Activity,以便执行不相同的操作。 每一回新
Activity 启动时,前一 Activity
便会终止,但系统会在仓库(“再次回到栈”)中保存该 Activity。 当新 Activity
启动时,系统会将其推送到重临栈上,并收获用户宗旨。
重返栈遵守基本的“后进先出”堆栈机制,由此,当用户完结如今 Activity
并按“再次回到”按钮时,系统会从仓库司令员其弹出(并销毁),然后还原前一
Activity。 (任务和重返栈文档中对回到栈有更详实的阐释。)

当一个 Activity 因某个新 Activity 启动而终止时,系统会经过该 Activity
的生命周期回调方法文告其这一景观变化。Activity 因气象变化—系统是创制Activity、甘休 Activity、苏醒 Activity 如故销毁 Activity—
而接受的回调方法也许有若干种,每一种回调都会为您提供执行与该意况变化相应的特定操作的空子。
例如,停止时,您的 Activity 应释放其余大型对象,例如网络或数据库连接。
当 Activity 復苏时,您可以重新获得所需资源,并回复执行中断的操作。
那些境况转变都是 Activity 生命周期的一片段。

本文的其他部分演讲有关如何创制和行使 Activity 的基础知识(包含对
Activity 生命周期工作方法的健全演讲),以便你不利管理各样 Activity
状态之间的浮动。

创建Activity

要成立 Activity,您必须创立
Activity
的子类(或选用其存世子类)。您要求在子类中贯彻 Activity
在其生命周期的种种场馆之间转变时(例如成立 Activity、甘休 Activity、苏醒Activity 或销毁 Activity 时)系统调用的回调方法。
七个最重大的回调方法是:

onCreate()

您必须完成此方法。系统会在成立您的 Activity
时调用此办法。您应该在贯彻内开首化 Activity 的必不可少组件。
最要害的是,您必须在此格局内调用 setContentView(),以定义 Activity
用户界面的布局。

onPause()

系统将此办法作为用户距离 Activity 的首先个信号(但并不延续意味着
Activity 会被灭绝)举行调用。
您平日应该在此方式内肯定在脚下用户会话甘休后依旧有效的此外变更(因为用户可能不会回去)。

您还应利用两种其余生命周期回调方法,以便提供流畅的 Activity
间用户体验,以及处理导致你的 Activity 为止甚至被灭绝的奇怪中断。
后文的管住 Activity
生命周期
一对对具备生命周期回调方法开展了阐释。

创建 Activity


要制造Activity,您必须创造 Activity 的子类(或应用其存世子类)。您须要在子类中落到实处Activity 在其生命周期的各个景况之间变化时(例如创造 Activity、为止Activity、恢复生机 Activity 或销毁 Activity 时)系统调用的回调方法。
多个最重大的回调方法是:

onCreate()
您必须达成此方式。系统会在创立您的 Activity
时调用此方法。您应该在贯彻内初叶化 Activity 的画龙点睛组件。
最要害的是,您必须在此措施内调用setContentView(),以定义 Activity
用户界面的布局。

onPause()
系统将此办法作为用户距离 Activity 的率先个信号(但并不三番五次意味着
Activity 会被灭绝)进行调用。
您常常应该在此格局内肯定在脚下用户会话截止后照旧有效的任何变更(因为用户可能不会回去)。

你还应接纳两种别的生命周期回调方法,以便提供流畅的 Activity
间用户体验,以及处理导致你的 Activity 甘休甚至被销毁的意想不到中断。
后文的治本 Activity
生命周期
一部分对负有生命周期回调方法开展了演说。

达成用户界面

Activity 的用户界面是由层级式视图(衍生自 View
类的靶子)提供的。每个视图都决定 Activity
窗口内的特定矩形空间,可对用户交互作出响应。
例如,视图可以是在用户触摸时起步某项操作的按钮。
  您可以使用 Android
提供的众多现成视图设计和团组织您的布局。“小工具”(Widget)是提供按钮、文本字段、复选框或一味是一幅图像等显示器视觉(交互式)元素的视图。
“布局”(Layout)是衍生自 ViewGroup
的视图,为其子视图提供唯一布局模型,例如线性布局(Linear
Layout)、网格布局(Grid Layout)或相对布局(Relative Layout)。您仍能为
View
类和
ViewGroup
类成立子类(或利用其存世子类)来机关创设小工具和布局,然后将它们拔取于您的
Activity 布局。
  利用视图定义布局的最广泛方法是依靠保存在你的运用资源内的 XML
布局文件。那样一来,您就可以将用户界面的布署性与概念 Activity
行为的源代码分开维护。 您可以通过 setContentView()将布局设置为
Activity 的 UI,从而传递布局的资源 ID。可是,您也足以在 Activity
代码中开立异 View,并透过将新 View 插入 ViewGroup
来创立视图层次,然后通过将根 ViewGroup 传递到
setContentView()来使用该布局。
  如需明白关于创建用户界面的音讯,请参阅用户界面文档。

贯彻用户界面

Activity 的用户界面是由层级式视图 — 衍生自 View 类的目的 —
提供的。每个视图都控制 Activity
窗口内的一定矩形空间,可对用户交互作出响应。
例如,视图可以是在用户触摸时启动某项操作的按钮。

您可以采取 Android
提供的不在少数现成视图设计和社团您的布局。“小部件”是提供按钮、文本字段、复选框或独自是一幅图像等屏幕视觉(交互式)元素的视图。
“布局”是衍生自 ViewGroup 的视图,为其子视图提供唯一布局模型,例如线性布局、网格布局或绝对布局。
您还足以为 View 类和 ViewGroup 类创设子类(或使用其现有子类)来机关创制小部件和布局,然后将它们选用于你的
Activity 布局。

行使视图定义布局的最普遍方法是凭借保存在您的选拔资源内的 XML
布局文件。那样一来,您就足以将用户界面的筹划与概念 Activity
行为的源代码分开维护。 您可以由此 setContentView() 将布局设置为
Activity 的 UI,从而传递布局的资源 ID。不过,您也可以在 Activity
代码中开立异 View,并经过将新 View 插入 ViewGroup 来创设视图层次,然后通过将根 ViewGroup 传递到 setContentView() 来使用该布局。

如需通晓有关成立用户界面的信息,请参阅用户界面文档。

在清单文件中扬言 Activity

务必在清单文件中宣示您的 Activity,这样系统才能访问它。 要注明您的
Activity,请打开你的清单文件,并将<activity>要素添加为 <application>
元素的子项。例如:

<manifest ... >
    <application ... >
      <activity android:name=".ExampleActivity" />
      ...  
   </application ... >
    ...
</manifest >

你仍能在此因素中投入多少个其他特色,以定义 Activity 标签、Activity
图标或风格主旨等用于安装 Activity UI 风格的属性。android:name
特性是唯一的必不可少特性—它指定 Activity
的类名。应用一旦发表,即不应更改此类名,否则,可能会毁掉诸如应用快速形式等一些功用(请阅读博客文章
Things That Cannot
Change

[不可以改变的始末])。
请参阅 <activity> 元素参考文档,驾驭有关在清单文件中声称 Activity
的详细音讯。

在清单文件中宣示 Activity

您必须在清单文件中声称您的 Activity,那样系统才能访问它。 要讲明您的
Activity,请打开你的清单文件,并将 <activity> 元素添加为 <application>要素的子项。例如:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

你仍能在此因素中投入多少个其余特色,以定义 Activity 标签、Activity
图标或风格主旨等用于安装 Activity UI
风格的习性。 android:name 属性是绝无仅有必需的性质—它指定
Activity
的类名。应用一旦公布,即不应更改此类名,否则,可能会损坏诸如应用飞快格局等一些效果(请阅读博客文章 Things
That Cannot
Change
 [无法改变的内容])。

请参阅 <activity> 元素参考文档,驾驭关于在清单文件中扬言
Activity 的详细新闻。

使用 Intent 过滤器

<activity> 元素还可指定各样 Intent 过滤器——使用
<Intent-filter>要素——以宣称其余使用组件激活它的艺术。当你使用 Android
SDK 工具创造新利用时,系统活动为你成立的票根 Activity 包涵一个 Intent
过滤器,其中申明了该 Activity 响应“主”操作且应松手“launcher”系列内。
Intent 过滤器的始末与以下所示类似:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> 
      <intent-filter>        
          <action android:name="android.intent.action.MAIN" />   
          <category android:name="android.intent.category.LAUNCHER" />  
      </intent-filter>
</activity>

<action>要素指定这是选拔的“主”入口点。<category> 元素指定此 Activity
应列入系统的利用启动器内(以便用户启动该 Activity)。
  假若你打算让使用成为独立行使,不允许任何应用激活其
Activity,则您不须要其它其他 Intent 过滤器。 正如前例所示,只应有一个
Activity 具有“主”操作和“launcher”体系。 您不想提需求其余使用的 Activity
不应该其余 Intent 过滤器,您可以动用显式 Intent
自行启动它们(下文对此做了阐释)。
  不过,假设你想让 Activity 对衍生自其他使用(以及你的自有应用)的隐式
Intent 作出响应,则必须为 Activity 定义其余 Intent 过滤器。
对于你想要作出响应的每一个 Intent 类型,您都必须加入相应的
<Intent-filter>,其中囊括一个 <action>要素,还可选取性地概括一个
<category> 元素和/或一个 <data> 元素。那么些要素指定您的 Activity
可以响应的 Intent 类型。

如需精通有关您的 Activity 怎么着响应 Intent 的详细新闻,请参阅Intent 和
Intent
过滤器
文档。

使用 Intent 过滤器

<activity> 元素还可指定种种Intent
过滤器—使用 <intent-filter> 元素—以宣称其余应用组件激活它的方法。

当您使用 Android SDK 工具创制新应用时,系统活动为您成立的存折 Activity
包涵一个 Intent 过滤器,其中表明了该 Activity
响应“主”操作且应放权“launcher”体系内。 Intent 过滤器的内容如下所示:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<action> 元素指定那是使用的“主”入口点。<category> 元素指定此
Activity 应列入系统的选用启动器内(以便用户启动该 Activity)。

如若您打算让动用成为独立行使,分化意其余使用激活其
Activity,则您不必要其他此外 Intent 过滤器。 正如前例所示,只应有一个
Activity 具有“主”操作和“launcher”系列。 您不想提须要别的使用的 Activity
不应当其余 Intent 过滤器,您可以选拔显式 Intent
自行启动它们(下文对此做了解说)。

但是,如果你想让 Activity 对衍生自其余应用(以及你的自有采纳)的隐式
Intent 作出响应,则必须为 Activity 定义其他 Intent 过滤器。
对于你想要作出响应的每一个 Intent
类型,您都必须进入相应的 <intent-filter>,其中囊括一个 <action> 元素,还可选用性地概括一个 <category> 元素和/或一个<data> 元素。这么些要素指定您的
Activity 可以响应的 Intent 类型。

如需询问关于您的 Activity 怎么着响应 Intent 的详细音信,请参阅 Intent 和
Intent
过滤器
文档。

启动 Activity

您能够因而调用 startActivity(),并将其传递给描述您想启动的 Activity 的
Intent 来启动另一个 Activity。Intent 对象会指定您想启动的切实 Activity
或描述您想进行的操作类型(系统会为你选拔适用的
Activity,甚至是发源其余应用的 Activity)。 Intent
对象还可能带领少量供所启动 Activity 使用的数码。
  在你的自有使用内工作时,您不时只须要启动某个已知 Activity。
您能够透过动用类名创建一个显式定义您想启动的 Activity 的 Intent
对象来完毕此目标。 例如,可以经过以下代码让一个 Activity
启动另一个名为SignInActivity 的 Activity:

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

不过,您的利用可能还需要运用你的 Activity
数据举行某项操作,例如发送电子邮件、短信或气象更新。
在那种场合下,您的行使自身或许不有所履行此类操作所需的
Activity,因而你可以改为利用设备上别样应用提供的 Activity
为你执行那几个操作。 那便是 Intent 对象的真的价值所在——您可以创立一个
Intent 对象,对您想举办的操作举办描述,系统会从任何应用启动相应的
Activity。 如若有多少个 Activity 可以拍卖
Intent,则用户可以选择要采纳哪一个。
例如,如若你想同意用户发送电子邮件,能够创立以下 Intent 对象:

 Intent intent = new Intent(Intent.ACTION_SEND);
 intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
 startActivity(intent);

添加到 Intent 中的 EXTRA_EMAIL extra
是一个字符串数组,其中蕴蓄应将电子邮件发送到的电子邮件地址。
当电子邮件接纳响应此 Intent 时,它会读取 extra
中提供的字符串数组,并将它们放入电子邮件撰写窗体的“收件人”字段。
在那种气象下,电子邮件选用的 Activity 启动,并且当用户完结操作时,您的
Activity 会復苏执行。

启动 Activity


您可以因而调用 startActivity(),并将其传递给描述您想启动的 Activity
的 Intent 来启动另一个 Activity。Intent 对象会指定您想启动的有血有肉
Activity 或描述您想举办的操作类型(系统会为您采取适当的
Activity,甚至是来源于其余使用的 Activity)。 Intent
对象还可能指点少量供所启动 Activity 使用的多少。

在您的自有应用内工作时,您寻常只必要启动某个已知 Activity。
您可以因而使用类名创设一个显式定义您想启动的 Activity 的 Intent
对象来落成此目的。 例如,可以透过以下代码让一个 Activity
启动另一个名为 SignInActivity 的 Activity:

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

但是,您的施用可能还亟需选拔你的 Activity
数据实施某项操作,例如发送电子邮件、短信或状态更新。
在这种景观下,您的接纳自身或者不拥有履行此类操作所需的
Activity,由此你可以改为利用设备上别样使用提供的 Activity
为你执行那个操作。 这便是 Intent 对象的的确价值所在 — 您能够创设一个
Intent 对象,对您想举办的操作进行描述,系统会从任何应用启动相应的
Activity。 借使有多少个 Activity 可以拍卖
Intent,则用户可以挑选要运用哪一个。
例如,假使你想同意用户发送电子邮件,可以创建以下 Intent:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);

添加到 Intent 中的 EXTRA_EMAIL extra
是一个字符串数组,其中富含应将电子邮件发送到的电子邮件地址。
当电子邮件接纳响应此 Intent 时,它会读取 extra
中提供的字符串数组,并将它们放入电子邮件撰写窗体的“收件人”字段。
在那种气象下,电子邮件接纳的 Activity 启动,并且当用户完结操作时,您的
Activity 会恢复生机执行。

初始 Activity 以博取结果

突发性,您或许要求从起步的 Activity 得到结果。在那种景观下,请通过调用
startActivityForResult()(而非startActivity())来启动 Activity。
要想在随之接受后续 Activity 的结果,请已毕
onActivityResult()回调方法。 当后续 Activity 落成时,它会动用 Intent
向您的 onActivityResult() 方法返回结果。
  例如,您可能希望用户挑选其中一位联系人,以便你的 Activity
对该联系人中的音信举办某项操作。 您可以透过以下代码成立此类 Intent
并处理结果:

private void pickContact() {
        // Create an intent to "pick" a contact, as defined by the content provider URI
        Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
        startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        // Perform a query to the contact's content provider for the contact's name
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact's name...
        }    
    }
}

上例突显的是,您在拍卖 Activity 结果时应该在 onActivityResult()
方法中行使的骨干逻辑。第三个标准化检查请求是还是不是中标(若是成功,则resultCode
将为RESULT_OK以及此结果响应的呼吁是或不是已知 —
在此情景下,requestCode与随 startActivityForResult()
发送的第四个参数匹配。 代码通过查询 Intent中回到的数目(data
参数)从该处初始拍卖 Activity 结果。
  实际情况是,ContentResolver 对一个情节提供程序执行查询,后者再次来到一个
Cursor,让查询的数码可见被读取。如需了然详细新闻,请参阅内容提供程序文档。

如需询问关于 Intent 用法的详细音信,请参阅Intent 和 Intent
过滤器
文档。

开行 Activity 以博得结果

有时候,您可能须要从启动的 Activity
获得结果。在那种情景下,请通过调用 startActivityForResult()(而非 startActivity())来启动
Activity。 要想在紧接着接受后续 Activity
的结果,请落成 onActivityResult() 回调方法。 当后续 Activity
完毕时,它会利用 Intent 向您的 onActivityResult() 方法重回结果。

例如,您或许希望用户接纳其中一位联系人,以便你的 Activity
对该联系人中的消息进行某项操作。 您可以因而以下代码创造此类 Intent
并处理结果:

private void pickContact() {
    // Create an intent to "pick" a contact, as defined by the content provider URI
    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        // Perform a query to the contact's content provider for the contact's name
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact's name...
        }
    }
}

上例突显的是,您在处理 Activity
结果时应当在 onActivityResult() 方法中利用的中坚逻辑。
第三个条件检查请求是或不是中标(即便成功,则resultCode将为 RESULT_OK)以及此结果响应的央求是不是已知

在此情景下,requestCode与随 startActivityForResult() 发送的第一个参数匹配。
代码通过查询Intent 中回到的多少(data 参数)从该处开端拍卖 Activity
结果。

其实况形是,ContentResolver 对一个内容提供程序执行查询,后者重临一个 Cursor,让查询的数据可见被读取。如需询问详细音讯,请参阅内容提供程序文档。

如需询问关于 Intent 用法的详细音讯,请参阅 Intent 和 Intent
过滤器
文档。

结束 Activity

你可以通过调用 Activity 的 finish() 方法来收场该
Activity。您还足以因此调用 finishActivity() 停止你事先启动的另一个
Activity。

注:在大部场馆下,您不应使用那个措施显式截止 Activity。
正如下文有关 Activity 生命周期的有些所述,Android 系统会为你管理
Activity 的生命周期,由此你无需落成自己的 Activity。
调用那几个办法也许对预期的用户体验暴发不良影响,由此只应在您确实不想让用户重临此
Activity 实例时使用。

结束 Activity


您能够透过调用 Activity 的 finish() 方法来截至该
Activity。您还足以经过调用 finishActivity() 停止你事先启动的另一个
Activity。

:在多数景观下,您不应使用那么些措施显式甘休 Activity。
正如下文有关 Activity 生命周期的一对所述,Android 系统会为您管理
Activity 的生命周期,由此你无需终止自己的 Activity。
调用那几个办法或者对预期的用户体验发生不良影响,由此只应在你确实不想让用户再次回到此
Activity 实例时利用。

管住 Activity 生命周期

经过达成回调方法管理 Activity
的生命周期对开发强大而又利落的接纳关键。 Activity
的生命周期会一向遭遇 Activity 与其余Activity、其义务及重返栈的关联性的熏陶。

Activity 基本上以两种情景存在:

  • Resumed

此 Activity
位于显示屏前台并兼有用户主旨。(有时也将此情状叫做“运行中”。)

  • Paused

另一个 Activity 位于显示器前台并持有用户主题,但此 Activity
仍可知。也就是说,另一个 Activity 呈现在此 Activity 上方,并且该
Activity 部分透明或未覆盖所有显示屏。 已中断的 Activity 处于完全
Activity 状态(Activity
对象保留在内存中,它保留了装有景况和成员消息,并与窗口管理器保持三番五次),但在内存非凡不足的状态下,可能会被系统终止。

  • Stopped

该 Activity 被另一个 Activity 完全覆盖(该 Activity 目前位居“后台”)。
已偃旗息鼓的 Activity 同样仍居于 Activity 状态(Activity
对象保留在内存中,它保留了具有意况和分子音讯,但未与窗口管理器连接)。
但是,它对用户不再可知,在他处索要内存时可能会被系统终止。

比方 Activity 处于停顿或为止状态,系统可通过须要其得了(调用其
finish()
方法)或直接终止其经过,将其从内存中删除。(将其得了或终止后)再度打开
Activity 时,必须重建。

管住 Activity 生命周期


经过落成回调方法管理 Activity
的生命周期对开发强大而又利落的选拔关键。 Activity
的生命周期会直接面临 Activity 与其他Activity、其职责及再次来到栈的关联性的影响。

Activity 基本上以二种处境存在:

继续
此 Activity 位于屏幕前台并拥有用户大旨。(有时也将此情形叫做“运行中”。)

暂停
另一个 Activity 位于显示器前台并持有用户主题,但此 Activity
仍可知。也就是说,另一个 Activity 突显在此 Activity 上方,并且该
Activity 部分透明或未覆盖所有屏幕。 暂停的 Activity
处于完全活动状态(Activity 对象保留在内存中,它保留了具有景况和成员新闻,并与窗口管理器保持一连),但在内存很是不足的意况下,可能会被系统终止。

停止
该 Activity 被另一个 Activity 完全覆盖(该 Activity 近来位于“后台”)。
已终止的 Activity
同样仍居于活动状态(Activity 对象保留在内存中,它保留了具备情形和分子新闻,但与窗口管理器连接)。
然而,它对用户不再可知,在他处要求内存时可能会被系统终止。

即便 Activity
处于停顿或终止状态,系统可透过要求其得了(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其得了或终止后)再一次打开
Activity 时,必须重建。

兑现生命周期回调

当一个 Activity
转入和转出上述分化景观时,系统会由此各个回调方法向其暴发布告。
所有回调方法都是维系,您可以在 Activity
状态发生变化时替代那个关系来实施相应操作。 以下框架 Activity
包涵每一个中坚生命周期方法:

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }    
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume(); 
       // The activity has become visible (it is now "resumed").
    }
    @Override protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }    
    @Override protected void onStop() {
        super.onStop(); 
       // The activity is no longer visible (it is now "stopped")
    } 
    @Override protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

这一个艺术共同定义 Activity 的全部生命周期。您可以通过完结那些方法监控
Activity 生命周期中的七个嵌套循环:

  • Activity 的凡事生命周期发生在 onCreate() 调用与 onDestroy()
    调用之间。您的 Activity 应在onCreate()
    中实践“全局”状态设置(例如定义布局),并释放 onDestroy()
    中的所有其他资源。例如,如果你的 Activity
    有一个在后台运行的线程,用于从网络上下载数据,它恐怕会在
    onCreate() 中开创该线程,然后在 onDestroy() 中截至该线程。
  • Activity 的可知生命周期暴发在 onStart() 调用与 onStop()
    调用之间。在那段时间,用户可以在显示器上看出 Activity 并与其交互。
    例如,当一个新 Activity 启动,并且此 Activity 不再可知时,系统会调用
    onStop()。您可以在调用那八个点子之间保留向用户显示 Activity
    所需的资源。 例如,您可以在 onStart() 中注册一个
    BroadcastReceiver 以监督影响 UI
    的转移,并在用户无法再收看你体现的始末时在 onStop()
    准将其收回注册。在 Activity 的一切生命周期,当 Activity
    在对用户可知和隐身三种状态中交替变化时,系统可能会反复调用
    onStart()onStop()
  • Activity 的前台生命周期暴发在 onResume() 调用与 onPause()
    调用之间。在那段日子,Activity 位于显示器上的具有其他 Activity
    从前,并兼有用户输入主题。 Activity
    可反复转入和转出前台—例如,当设备转入休眠状态或出现对话框时,系统会调用
    onPause()
    由于此情景恐怕时时发出转移,因而那五个措施中应使用适度轻量级的代码,以防止因变更速度慢而让用户等待。

图 1 评释了那几个循环以及 Activity
在状态转变时期可能由此的不二法门。矩形表示回调方法,当 Activity
在分歧情状之间变更时,您可以兑现那些艺术来进行操作。

图片 1

图1. Activity生命周期

表 1
列出了平等的生命周期回调方法,其中对每一种回调方法做了更详实的讲述,并证实了每一种艺术在
Activity 整个生命周期内的职分,包含在回调方法成功后系统能不能终止
Activity。

方法 描述 是否能事后终止 后接
onCreate 首次创建 Activity 时调用。 您应该在此方法中执行所有正常的静态设置— 创建视图、将数据绑定到列表等等。系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态(请参阅后文的保存 Activity 状态)。始终后接 onStart() onStart()
onRestart 在 Activity 已停止并即将再次启动前调用。始终后接 onStart() onStart()
onStart 在 Activity 即将对用户可见之前调用。如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。 onResume()onStop()
onResume 在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接 onPause()。 onPause()
onPause 当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接onStop()。 onResume()onStop()
onStop Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。如果 Activity 恢复与用户的交互,则后接onRestart(),如果 Activity 被销毁,则后接onDestroy()。 onRestart()onDestroy()
onDestroy 在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人调用 Activity 上的 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过 isFinishing() 方法区分这两种情形。

名为“是不是能事后终止?”的列表示系统是还是不是能在不执行另一行 Activity
代码的场合下,在措施重回后随时终止承载 Activity 的历程。
有七个格局包蕴“是”标记:(onPause()onStop()onDestroy())。由于
onPause() 是那多少个办法中的第三个,因而 Activity 创制后,onPause()
必定成为最终调用的方法,然后才能终止进度——倘诺系统在火急意况下必须苏醒内存,则可能不会调用
onStop()onDestroy()。由此,您应该利用 onPause()
向存储设备写入至关紧要的持久性数据(例如用户编辑)。不过,您应该对
onPause()
调用时期必须保留的音信享有取舍,因为该方法中的任何拦截进度都会妨碍向下一个
Activity 的变通并拖慢用户体验。
  在是还是不是能在事后终止?列中标记为“否”的艺术可从系统调用它们的一刻起预防承载
Activity 的历程被停止。 由此,在从 onPause() 重回的时日到
onResume()被调用的光阴,系统可以告一段落 Activity。在 onPause()
被再度调用并重返前,将不可以再一次停下 Activity。

注:根据表 1 中的定义属于技术上不可能“终止”的 Activity
仍可能被系统终止——但那种情状只有在无任何其余资源的然而情形下才会爆发。进度和线程处理文档对可能会甘休Activity 的情形做了更详实的演说。

心想事成生命周期回调

当一个 Activity
转入和转出上述差距景况时,系统会通过各样回调方法向其暴发通报。
所有回调方法都是关联,您可以在 Activity
状态爆发变化时替代那几个关系来执行相应操作。 以下框架 Activity
包罗每一个中坚生命周期方法:

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

  

:正如以上示例所示,您在贯彻这个生命周期方法时务必始终先调用超类完结,然后再实施此外操作。

那些点子共同定义 Activity 的全套生命周期。您可以透过落到实处那几个措施监控
Activity 生命周期中的多少个嵌套循环:

  • Activity
    全体生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的
    Activity
    应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其他资源。例如,借使你的
    Activity
    有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创制该线程,然后在 onDestroy() 中为止该线程。
  • Activity
    可知生命周期发生在 onStart() 调用与 onStop() 调用之间。在那段时日,用户可以在显示器上收看
    Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity
    不再可知时,系统会调用 onStop()。您可以在调用这三个方法之间保留向用户浮现Activity 所需的资源。
    例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响
    UI
    的变型,并在用户不可能再看到你浮现的情节时在 onStop() 少校其打消注册。在
    Activity 的全体生命周期,当 Activity
    在对用户可知和藏身三种意况中交替变化时,系统或者会反复调用 onStart() 和 onStop()

  • Activity
    前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在那段日子,Activity
    位于屏幕上的具备其余 Activity 从前,并负有用户输入宗旨。 Activity
    可反复转入和转出前台 —
    例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()
    由于此景况恐怕时时发出变更,因而这多少个点子中应采纳适度轻量级的代码,以幸免因变更速度慢而让用户等待。

图 1 认证了那么些循环以及 Activity
在意况转变时期可能通过的路子。矩形表示回调方法,当 Activity
在不相同景观之间浮动时,您可以落成那个主意来施行操作。

图片 2

图 1. Activity 生命周期。

表 1
列出了一致的生命周期回调方法,其中对每一种回调方法做了更详实的叙述,并证实了每一种办法在
Activity 整个生命周期内的地点,包涵在回调方法成功后系统能不能终止
Activity。

表 1. Activity 生命周期回调方法汇总表。

方法

说明

是或不是能事后甘休?

后接

onCreate()

首次创设 Activity 时调用。 您应该在此方法中履行所有正规的静态设置 —
创建视图、将数据绑定到列表等等。 系统向此措施传递一个 Bundle
对象,其中带有 Activity
的上一状态,可是前提是捕获了该景况(请参阅后文的保存 Activity
状态
)。

平素后接 onStart()

onStart()

    

onRestart()

在 Activity 已终止并即将重新启动前调用。

一味后接 onStart()

onStart()

onStart()

在 Activity 即将对用户可知从前调用。

若果 Activity 转入前台,则后接 onResume(),如果 Activity
转入隐藏状态,则后接 onStop()

onResume() 

onStop()

    

onResume()

在 Activity 即将上马与用户展开互动以前调用。 此时,Activity 处于
Activity 堆栈的顶层,并装有用户输入宗旨。

一向后接 onPause()

onPause()

onPause()

当系统即将上马屡次三番另一个 Activity 时调用。
此方法一般用于确认对持久性数据的未保存更改、停止动画以及任何可能损耗 CPU
的情节,诸如此类。 它应有尤其连忙地实践所需操作,因为它回到后,下一个
Activity 才能继续执行。

设若 Activity 再次来到前台,则后接 onResume(),若是 Activity
转入对用户不可知状态,则后接onStop()

onResume() 

onStop()

onStop()

在 Activity 对用户不再可知时调用。假若 Activity 被灭绝,或另一个
Activity(一个存活 Activity 或新
Activity)继续执行并将其覆盖,就可能暴发这种状态。

若果 Activity 复苏与用户的相互,则后接 onRestart(),如果 Activity
被销毁,则后接onDestroy()

onRestart()

onDestroy()

onDestroy()

在 Activity 被灭绝前调用。那是 Activity 将收取的末梢调用。 当 Activity
甘休(有人对 Activity 调用了 finish()),或种类为节约空间而临时销毁该
Activity 实例时,可能会调用它。
您可以由此 isFinishing() 方法分别那三种情状。

名为“是不是能事后为止?”的列表示系统是还是不是能在不执行另一行 Activity
代码的景色下,在艺术再次回到后无时无刻终止承载 Activity 的历程。 有八个主意带

有“是”标记:(onPause()onStop() 和 onDestroy())。由于 onPause() 是那四个措施中的首个,因而Activity 创造后,onPause() 必定成为最终调用的不二法门,然后才能止住进度 —
如若系统在殷切景况下必须復苏内存,则可能不会调用 onStop() 和 onDestroy()。由此,您应该运用 onPause() 向存储设备写入至关主要的持久性数据(例如用户编辑)。不过,您应该对 onPause() 调用时期总得保留的新闻享有取舍,因为该方法中的任何拦截进度都会妨碍向下一个
Activity 的成形并拖慢用户体验。

是还是不是能在未来甘休?列中标记为“否”的章程可从系统调用它们的说话起预防承载
Activity 的进度被截止。
由此,在从 onPause() 重临的时辰到onResume() 被调用的时刻,系统可以告一段落
Activity。在 onPause() 被另行调用并再次回到前,将无法再度停下 Activity。

:按照表 1 中的定义属于技术上不可能“终止”的 Activity
仍可能被系统终止 —
但那种情景唯有在无其他其余资源的极端情形下才会发出。进程和线程处理文档对可能会停下
Activity 的场地做了更详尽的阐发。

保存 Activity 状态

管制 Activity 生命周期的引言部分简要提及,当 Activity
暂停或甘休时,Activity 的情事会博得保留。 确实如此,因为当 Activity
暂停或甘休时,Activity 对象仍保留在内存中 —
有关其成员和当下情状的具备音信仍处于 Activity 状态。 因而,用户在
Activity 内所做的其余改变都会取得保留,那样一来,当 Activity
再次回到前台(当它“继续”)时,这一个改变如故存在。
  但是,当系统为了复苏内存而销毁某项 Activity 时,Activity
对象也会被销毁,因而系统在持续 Activity
时根本不能让其景况保持完全,而是必须在用户再次来到Activity时重建 Activity
对象。但用户并不知道系统销毁 Activity
后又对其开展了重建,因而他们很可能觉得 Activity 状态并非变化。
在那种情形下,您可以兑现另一个回调方法对关于 Activity
状态的信息举办保存,以担保有关 Activity
状态的重中之重信息得到保留:onSaveInstanceState()
  系统会先调用 onSaveInstanceState(),然后再使 Activity
变得不难销毁。系统会向该措施传递一个 Bundle,您可以在中间使用
putString()putInt() 等办法以 名称-值(key-value)对格局保留有关
Activity 状态的新闻。然后,借使系统终止您的利用进程,并且用户再次来到您的
Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate()
onRestoreInstanceState()。您可以使用上述任一方法从 Bundle
提取您保存的动静并復苏该 Activity
状态。若是没有动静音信需求还原,则传递给你的 Bundle
是空值(假诺是首次创制该 Activity,就会油可是生那种景色)。

图片 3

**图 2. **在二种情况下,Activity
重获用户大旨时可保持状态完好:系统在销毁 Activity 后重建
Activity,Activity 必须復苏以前封存的情况;系统停止 Activity 后继续执行
Activity,并且 Activity 状态保持完全。

注:不能有限帮衬系统会在销毁您的 Activity 前调用
onSaveInstanceState(),因为存在不要求保留情状的情况(例如用户选择“重临”
按钮离开你的 Activity 时,因为用户的作为是在显式关闭 Activity)。
若是系统调用 onSaveInstanceState(),它会在调用 onStop()
以前,并且可能会在调用 onPause() 从前开展调用。

而是,就算你怎么都不做,也不达成 onSaveInstanceState(),Activity 类的
onSaveInstanceState() 默许完结也会卷土重来部分 Activity
状态。具体地讲,默许完成会为布局中的每个 View 调用相应的
onSaveInstanceState()
方法,让各类视图都能提供有关自己的应保存新闻。Android
框架中大概各类Widget都会依照要求贯彻此办法,以便在重建 Activity
时自动保存和回复对 UI 所做的别样可知更改。例如,EditText
Widget保存用户输入的其余文件,CheckBox
Widget保存复选框的入选或未入选状态。您只需为想要保存其状态的各样Widget提供一个唯一的
ID(通过 android:id 属性)。如若Widget没有 ID,则系统不可能保存其情景。

你还能经过将 android:saveEnabled 属性设置为 “false” 或通过调用
setSaveEnabled()
方法显式阻止布局内的视图保存其意况。您寻常不应将该属性禁用,但一旦您想以分裂形式复苏Activity UI 的动静,就可能必要那样做。

尽管 onSaveInstanceState() 的默许完毕会保留有关您的Activity UI
的有用音讯,您或许仍需替代它以保存越来越多音讯。例如,您可能须要保留在
Activity 生命周期内发生了转移的成员值(它们或者与 UI
中还原的值有涉及,但默许景况下系统不会东山再起储存这么些 UI 值的积极分子)。

由于 onSaveInstanceState() 的默认已毕推动保存 UI 的图景,
因而一旦你为了保存更加多景况音信而重写该办法,应始终先调用
onSaveInstanceState() 的超类完成,然后再实施另外操作。同样,即便您代表
onRestoreInstanceState()
方法,也应调用它的超类完结,以便默许完毕能够东山再起视图状态。

注:由于不能有限支撑系统会调用
onSaveInstanceState(),因而你只应运用它来记录 Activity 的弹指态(UI
的情事)—切勿使用它来储存持久性数据,而应利用 onPause() 在用户距离
Activity 后存储持久性数据(例如应封存到数据库的数码)。

你只需旋转设备,让屏幕方向暴发变化,就能使得地测试你的利用的意况苏醒能力。
当显示器方向转变时,系统会销毁天公地道建
Activity,以便利用可供新显示屏配置使用的备用资源。 单凭这一说辞,您的
Activity
在重建时能或不能完全复苏其景况就显示更加主要,因为用户在应用使用时通常需求旋转屏幕。

保存 Activity 状态

管制 Activity
生命周期
的引言部分简要提及,当
Activity 暂停或终止时,Activity 的情事会得到保留。 确实如此,因为当
Activity 暂停或终止时,Activity 对象仍保留在内存中 —
有关其成员和脚下场地的所有音讯仍处在活动状态。 由此,用户在 Activity
内所做的别样改动都会博得保留,那样一来,当 Activity
重临前台(当它“继续”)时,这几个改动依然存在。

不过,当系统为了还原内存而销毁某项 Activity
时,Activity 对象也会被灭绝,由此系统在三番一遍 Activity
时根本无法让其状态保持完好,而是必须在用户再次来到 Activity
时重建 Activity 对象。但用户并不知道系统销毁 Activity
后又对其展开了重建,因此他们很可能认为 Activity 状态并非变化。
在那种气象下,您可以兑现另一个回调方法对有关 Activity
状态的音讯进行保存,以担保有关 Activity
状态的要紧信息获取保留:onSaveInstanceState()

系统会先调用 onSaveInstanceState(),然后再使 Activity
变得简单销毁。系统会向该格局传递一个 Bundle,您可以在中间使用 putString() 和putInt() 等方法以名称-值对方式保留有关
Activity 状态的音讯。然后,即使系统终止您的行使进度,并且用户重临您的
Activity,则系统会重建该
Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以运用上述任一方法从 Bundle 提取您保存的情况并上升该
Activity
状态。倘使没有动静音信要求苏醒,则传递给您的 Bundle 是空值(若是是首次创造该
Activity,就会油可是生那种场所)。

图片 4

图 2. 在三种情形下,Activity
重获用户宗旨时可保持状态完好:系统在销毁 Activity 后重建
Activity,Activity 必须恢复生机从前封存的图景;系统停止 Activity 后继续执行
Activity,并且 Activity 状态保持完全。

:不可以有限支撑系统会在销毁您的 Activity
前调用 onSaveInstanceState(),因为存在不必要保留意况的意况(例如用户使用“重回”按钮离开你的
Activity 时,因为用户的表现是在显式关闭
Activity)。 若是系统调用 onSaveInstanceState(),它会在调用 onStop() 从前,并且可能会在调用onPause() 此前举行调用。

然则,尽管你什么都不做,也不兑现 onSaveInstanceState()Activity 类的 onSaveInstanceState() 默许落成也会还原部分
Activity
状态。具体地讲,默许达成会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让各样视图都能提供关于自己的应保存音信。Android
框架中大致每个小部件都会根据需求完毕此措施,以便在重建 Activity
时自动保存和死灰复燃对 UI
所做的别的可知更改。例如,EditText 小部件保存用户输入的任何公文,CheckBox 小部件保存复选框的入选或未入选状态。您只需为想要保存其场馆的每个小部件提供一个唯一的
ID(通过 android:id 属性)。固然小部件没有
ID,则系统不能保存其情状。

您仍是可以透过将android:saveEnabled 属性设置为"false" 或透过调用setSaveEnabled() 方法显式阻止布局内的视图保存其意况。您日常不应将该属性停用,但倘诺您想以差别方法恢复生机Activity UI 的景色,就可能必要这么做。

尽管 onSaveInstanceState() 的默许已毕会保留有关您的Activity UI
的有用新闻,您可能仍需替换它以保留更加多音讯。例如,您或许须求保留在
Activity 生命周期内暴发了变化的成员值(它们或者与 UI
中恢复生机的值有涉嫌,但默许情形下系统不会死灰复燃储存这么些 UI 值的成员)。

由于 onSaveInstanceState() 的默许落成推动保存 UI
的意况,因而一旦您为了保留更加多情形新闻而替换该方法,应始终先调用 onSaveInstanceState() 的超类完成,然后再实践别的操作。
同样,假若你替换onRestoreInstanceState() 方法,也应调用它的超类完结,以便默许落成可以还原视图状态。

:由于不能保险系统会调用 onSaveInstanceState(),由此你只应运用它来记录
Activity 的弹指态(UI 的境况)—
切勿使用它来存储持久性数据,而应选择 onPause() 在用户距离 Activity
后存储持久性数据(例如应封存到数据库的数码)。

您只需旋转设备,让屏幕方向暴发变化,就能管用地测试你的使用的动静回涨能力。
当显示屏方向转变时,系统会销毁不分轩轾建
Activity,以便利用可供新屏幕配置利用的备用资源。 单凭这一理由,您的
Activity
在重建时能或不能完全恢复生机其状态就显示非凡首要,因为用户在动用使用时平时索要旋转显示屏。

拍卖配置变更

有点设备配备或者会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。
暴发此类变化时,Android 会重建运行中的 Activity(系统调用
onDestroy(),然后随即调用
onCreate())。此行为目的在于通过行使你提供的备用资源(例如适用于分歧显示屏方向和显示屏尺寸的例外布局)自动重新加载您的拔取来帮忙它适应新安顿。
  借使你对 Activity
进行了恰当设计,让它亦可按上述所述处理显示器方向变化带来的重启并回复
Activity 状态,那么在遭到 Activity
生命周期中的其他意外事件时,您的使用将有所更强的适应性。
正如上文所述,处理此类重启的特等办法 是行使 onSaveInstanceState()
onRestoreInstanceState()(或onCreate())保存并上涨 Activity
的情形。
  如需精晓有关运行时暴发的布署变更以及应对格局的详细音信,请阅读拍卖运行时变更指南。

拍卖配置变更

稍许设备配备或者会在运作时爆发变化(例如显示器方向、键盘可用性及言语)。
暴发此类变化时,Android 会重建运行中的
Activity(系统调用onDestroy(),然后马上调用 onCreate())。此行为目的在于通过利用你提供的备用资源(例如适用于差别显示屏方向和显示器尺寸的不比布局)自动重新加载您的运用来赞助它适应新配置。

如果你对 Activity
举行了适度设计,让它亦可按上述所述处理屏幕方向变化带来的重启并恢复Activity 状态,那么在惨遭 Activity
生命周期中的其他意外事件时,您的行使将所有更强的适应性。

正如上文所述,处理此类重启的特等办法是使用onSaveInstanceState() 和 onRestoreInstanceState()(或 onCreate())保存并回涨Activity 的意况。

如需询问关于运行时暴发的布局变更以及应对形式的详细音信,请阅读处理运行时变更指南。

协调 Activity

当一个 Activity 启动另一个 Activity 时,它们都会经历生命周期转变。第二个Activity
暂停并终止(但借使它在后台仍旧可知,则不会停下)时,系统会创立另一个
Activity。 即使这个 Activity
共用保存到磁盘或任啥地点方的多少,必须精通的是,在成立首个 Activity
前,首个 Activity 不会完全止住。更适于地说,启动第三个 Activity
的经过与停止第四个 Activity 的历程存在重叠。
  生命周期回调的一一经过明确定义,当四个 Activity
位于同一进度,并且由一个 Activity 启动另一个 Activity
时,其定义尤其引人侧目。 以下是当 Activity A 启动 Activity B
时一层层操作的爆发顺序:

  1. Activity A 的 onPause() 方法执行。
  2. Activity B 的 onCreate()onStart()onResume()
    方法依次执行。(Activity B 现在有着用户大旨。)
  3. 接下来,倘使 Activity A 在屏幕上不再可知,则其 onStop() 方法执行。

你可以选用那种可预测的生命周期回调顺序管理从一个 Activity 到另一个
Activity 的音信变更。 例如,若是您必须在第二个 Activity
甘休时向数据库写入数据,以便下一个 Activity 能够读取该数量,则应在
onPause() 而不是 onStop() 执行时期向数据库写入数据。

协调 Activity

当一个 Activity 启动另一个 Activity
时,它们都会体会到生命周期转变。第四个 Activity
暂停并终止(但如若它在后台依旧可知,则不会为止)时,同时系统会创立另一个
Activity。 如若这一个 Activity
共用保存到磁盘或其余地点的数目,必须通晓的是,在开创第四个 Activity
前,第三个 Activity 不会完全为止。更方便地说,启动第一个 Activity
的历程与停止第四个 Activity 的长河存在重叠。

生命周期回调的相继经过明确概念,当四个 Activity 位于同一进程,并且由一个
Activity 启动另一个 Activity 时,其定义尤其引人侧目。 以下是当 Activity A
启动 Activity B 时一名目繁多操作的产生顺序:

  1. Activity A 的 onPause() 方法执行。
  2. Activity B
    的 onCreate()onStart() 和 onResume() 方法依次执行。(Activity
    B 现在颇具用户主旨。)
  3. 接下来,假如 Activity A 在显示屏上不再可见,则其 onStop() 方法执行。

您可以采纳那种可预测的生命周期回调顺序管理从一个 Activity 到另一个
Activity 的新闻变化。 例如,借使您必须在首先个 Activity
甘休时向数据库写入数据,以便下一个 Activity
能够读取该数据,则应在 onPause() 而不是 onStop() 执行时期向数据库写入数据。

 

摘自Android官方文档:https://developer.android.google.cn/guide/components/activities.html

 

Activity系列文章:

Android之Activity连串总计(一)–Activity概览

Android之Activity系列统计(二)–职责和重返栈

Android
旋转显示器–处理Activity与AsyncTask的一流解决方案
(处理运行时变更)

 Activity之概览显示屏(Overview
Screen)

相关文章