Android开发指南之Activity,Android之Activity类别计算葡萄娱乐官方

Activity

Activity是3个施用组件,用户可与其提供的显示屏实行互动。以举行拨打电话,拍片照片,发送电子邮件或查看地图等操作。
每种 Activity
都会获得多个用以绘制其用户界面包车型客车窗口(window)。窗口常常会充满荧屏,但也可小于荧屏并转移在任何窗口之上。
  贰个应用一般由八个相互松散联系的 Activity 组成。
1般会钦赐应用中的有些 Activity 为“主”Activity(Main
Activity),即第一遍开发银行应用时表现给用户的相当 Activity。 而且每一个 Activity
均可运维另三个 Activity,以便执行不一的操作。 每趟新 Activity
运营时,前一 Activity 便会停下,但系统会在仓房(“重回栈”)中保存该
Activity。 当新 Activity
运转时,系统会将其推送到重返栈上,并得到用户宗旨。
重临栈坚守“后进先出”堆栈机制,因而,当用户达成近年来 Activity 并按“重回”
按钮时,系统会从仓库中将其弹出(并销毁),然后还原前一Activity。(任务和重返栈文书档案中对回到栈有更详尽的论述。)
  当1个 Activity 因某些新 Activity 运转而告一段落时,系统会通过该 Activity
的生命周期回调方法文告其那壹处境变化。Activity 因气象变化(系统是创制Activity、截至 Activity、恢复生机 Activity 依旧销毁
Activity)而接受的回调方法或者有几三种,每壹种回调方法都会为你提供执行与该情形变化相应的一定操作的时机。
例如,甘休时,您的 Activity 应释放其余大型对象,例如网络或数据库连接。
当 Activity 复苏时,您能够再次取得所需财富,并还原执行中断的操作。
这个情况转变都以 Activity 生命周期的1部分。
  本文的别的部分演讲有关如何创设和使用 Activity 的基础知识(包蕴对
Activity 生命周期工作章程的宏观论述),以便你不利管理种种 Activity
状态之间的变型。

正文内容

  1. 创建 Activity
    1. 贯彻用户界面
    2. 在清单文件中评释 Activity
  2. 启动 Activity
    1. 起步 Activity 以获取结果
  3. 结束 Activity
  4. 治本 Activity 生命周期
    1. 心想事成生命周期回调
    2. 保存 Activity 状态
    3. 处理配置变更
    4. 协调 Activity

Activity 是贰个使用组件,用户可与其提供的荧屏实行交互,以实施拨打电话、拍戏照片、发送电子邮件或查看地图等操作。
每种 Activity
都会收获三个用来绘制其用户界面包车型大巴窗口。窗口平常会充满显示屏,但也可小于荧屏并生成在其余窗口之上。

2个运用壹般由多个相互松散联系的 Activity 组成。 一般会钦定应用中的某些Activity 为“主”Activity,即首回运转应用时表现给用户的要命 Activity。
而且每一个 Activity 均可运维另二个 Activity,以便执行不1的操作。 每一次新
Activity 运行时,前一 Activity
便会停下,但系统会在库房(“重回栈”)中保留该 Activity。 当新 Activity
运行时,系统会将其推送到重返栈上,并取得用户主旨。
再次来到栈遵守基本的“后进先出”堆栈机制,由此,当用户达成近期 Activity
并按“重临”按钮时,系统会从仓库少将其弹出(并销毁),然后还原前一Activity。 (职务和再次回到栈文书档案中对回到栈有更详实的阐发。)

当1个 Activity 因有个别新 Activity 运营而甘休时,系统会经过该 Activity
的生命周期回调方法通告其这一气象变化。Activity 因场地变化—系统是创造Activity、停止 Activity、苏醒 Activity 照旧销毁 Activity—
而接受的回调方法恐怕有若干种,每1种回调都会为您提供执行与本场面变化相应的特定操作的机遇。
例如,甘休时,您的 Activity 应释放其余大型对象,例如网络或数据库连接。
当 Activity 恢复生机时,您能够重新获得所需财富,并回复执行中断的操作。
那一个情状转变都是 Activity 生命周期的壹有的。

本文的其他部分演讲有关如何创制和行使 Activity 的基础知识(包含对
Activity 生命周期工作情势的1揽子论述),以便你不利管理种种 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
布局文件。那样1来,您就能够将用户界面包车型客车统筹与概念 Activity
行为的源代码分开维护。 您能够透过 setContentView()将布局设置为
Activity 的 UI,从而传递布局的财富 ID。然则,您也得以在 Activity
代码中开立异 View,并通过将新 View 插入 ViewGroup
来创建视图层次,然后经过将根 ViewGroup 传递到
setContentView()来行使该布局。
  如需领会有关创立用户界面包车型大巴信息,请参阅用户界面文档。

金镶玉裹福禄双全用户界面

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

你可以利用 Android
提供的众多现成视图设计和企业您的布局。“小部件”是提供按钮、文本字段、复选框或独自是1幅图像等显示屏视觉(交互式)成分的视图。
“布局”是衍生自 ViewGroup 的视图,为其子视图提供唯壹布局模型,例如线性布局、网格布局或相对布局。
您还足以为 View 类和 ViewGroup 类创造子类(或使用其现有子类)来机关成立小部件和布局,然后将它们接纳于你的
Activity 布局。

运用视图定义布局的最广泛方式是重视保存在您的运用财富内的 XML
布局文件。那样1来,您就可以将用户界面包车型地铁设计与概念 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
的类名。应用1旦发布,即不应更改此类名,不然,大概会毁掉诸如应用急速形式等片段功能(请阅读博客小说
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 属性是唯1必需的品质—它钦定Activity
的类名。应用壹旦公布,即不应更改此类名,不然,或然会破坏诸如应用快速方式等一些意义(请阅读博客作品 Things
That Cannot
Change
 [不可能改变的始末])。

请参阅 <activity> 成分参考文书档案,领悟关于在清单文件中宣示
Activity 的详细音讯。

使用 Intent 过滤器

<activity> 成分还可钦赐各个 Intent 过滤器——使用
<Intent-filter>要素——以宣称别的使用组件激活它的法子。当您使用 Android
SDK 工具成立新利用时,系统自动为你制造的票根 Activity 包罗2个 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 过滤器。 正如前例所示,只应有3个Activity 具有“主”操作和“launcher”类别。 您不想提要求其它应用的 Activity
不应该别的 Intent 过滤器,您能够动用显式 Intent
自行运营它们(下文对此做了阐释)。
  可是,如若你想让 Activity 对衍生自别的应用(以及你的自有利用)的隐式
Intent 作出响应,则必须为 Activity 定义别的 Intent 过滤器。
对于你想要作出响应的每个 Intent 类型,您都必须投入相应的
<Intent-filter>,在那之中囊括二个 <action>要素,还可接纳性地回顾1个
<category> 元素和/或一个 <data> 成分。那些因素内定您的 Activity
能够响应的 Intent 类型。

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

使用 Intent 过滤器

<activity> 成分还可钦点各样Intent
过滤器—使用 <intent-filter> 成分—以宣称别的使用组件激活它的秘诀。

当你使用 Android SDK 工具创设新利用时,系统活动为您创制的存折 Activity
包蕴1个 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 来运行另1个 Activity。Intent 对象会钦点您想启动的现实性 Activity
或描述您想进行的操作类型(系统会为您选用得当的
Activity,甚至是发源其余使用的 Activity)。 Intent
对象还概带领少量供所运营 Activity 使用的数码。
  在您的自有选用内行事时,您平日只必要运营有些已知 Activity。
您能够经过应用类名创立2个显式定义您想运维的 Activity 的 Intent
对象来落到实处此目标。 例如,能够因此以下代码让三个 Activity
运营另一个名称为SignInActivity 的 Activity:

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

唯独,您的施用恐怕还索要动用你的 Activity
数据实施某项操作,例如发送电子邮件、短信或情形更新。
在这种气象下,您的选用本身恐怕不抱有执行此类操作所需的
Activity,因而你能够改为利用设备上其余应用提供的 Activity
为您执行那些操作。 那正是 Intent 对象的真正价值所在——您可以创设3个Intent 对象,对您想进行的操作进行描述,系统会从其它应用运维相应的
Activity。 若是有三个 Activity 能够拍卖
Intent,则用户能够选用要运用哪1个。
例如,倘诺您想同意用户发送电子邮件,可以创立以下 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 来运营另1个 Activity。Intent 对象会钦点您想运维的实际
Activity 或描述您想实行的操作类型(系统会为你采纳适当的
Activity,甚至是根源其余应用的 Activity)。 Intent
对象还恐怕教导少量供所运营 Activity 使用的数额。

在您的自有使用内工作时,您平常只必要运营有些已知 Activity。
您能够经过利用类名成立3个显式定义您想运维的 Activity 的 Intent
对象来达成此指标。 例如,能够通过以下代码让三个 Activity
运维另三个名称为 SignInActivity 的 Activity:

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

而是,您的运用或然还索要利用你的 Activity
数据进行某项操作,例如发送电子邮件、短信或景况更新。
在那种景观下,您的选用自己可能不拥有执行此类操作所需的
Activity,由此你能够改为利用设备上别样使用提供的 Activity
为你执行这几个操作。 那正是 Intent 对象的着实价值所在 — 您能够创造3个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()
方法中应用的主干逻辑。第3个原则检查请求是还是不是成功(要是成功,则resultCode
将为RESULT_OK以及此结果响应的乞请是或不是已知 —
在此境况下,requestCode与随 startActivityForResult()
发送的第一个参数相称。 代码通过查询 Intent中回到的数据(data
参数)从该处开首拍卖 Activity 结果。
  实际情状是,ContentResolver 对2个内容提供程序执行查询,后者再次来到四个
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() 结束你在此之前运维的另1个Activity。

:在多数气象下,您不应使用那么些点子显式截至 Activity。
正如下文有关 Activity 生命周期的有的所述,Android 系统会为您管理
Activity 的生命周期,因而你无需终止本人的 Activity。
调用那么些艺术只怕对预期的用户体验发生不良影响,因而只应在你确实不想让用户再次来到此
Activity 实例时选择。

管制 Activity 生命周期

通过落成回调方法管理 Activity
的生命周期对开发强大而又利落的行使首要。 Activity
的生命周期会直接面临 Activity 与其他Activity、其职责及重回栈的关联性的熏陶。

Activity 基本上以二种状态存在:

  • Resumed

此 Activity
位于显示屏前台并持有用户主题。(有时也将此处境叫做“运转中”。)

  • Paused

另1个 Activity 位于荧屏前台并富有用户主题,但此 Activity
仍可知。也便是说,另二个 Activity 突显在此 Activity 上方,并且该
Activity 部分透明或未覆盖全部荧屏。 已中断的 Activity 处于完全
Activity 状态(Activity
对象保留在内部存款和储蓄器中,它保留了富有景况和分子音信,并与窗口管理器保持三番五次),但在内部存款和储蓄器格外不足的意况下,可能会被系统终止。

  • Stopped

该 Activity 被另1个 Activity 完全覆盖(该 Activity 如今位居“后台”)。
已告一段落的 Activity 同样仍居于 Activity 状态(Activity
对象保留在内部存款和储蓄器中,它保留了有着意况和分子新闻,但未与窗口管理器连接)。
但是,它对用户不再可知,在他处索要内部存款和储蓄器时大概会被系统终止。

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

管理 Activity 生命周期


因而达成回调方法管理 Activity
的生命周期对开发强大而又利落的应用关键。 Activity
的生命周期会一贯面临 Activity 与别的Activity、其职务及再次回到栈的关联性的影响。

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

继续
此 Activity 位于显示器前台并具有用户主题。(有时也将此情况称为“运维中”。)

暂停
另3个 Activity 位于显示屏前台并有着用户大旨,但此 Activity
仍可知。也便是说,另二个 Activity 展现在此 Activity 上方,并且该
Activity 部分透明或未覆盖全部荧屏。 暂停的 Activity
处于完全活动状态(Activity 对象保留在内部存款和储蓄器中,它保留了全数情形和成员音讯,并与窗口管理器保持延续),但在内部存款和储蓄器非凡不足的气象下,恐怕会被系统终止。

停止
该 Activity 被另二个 Activity 完全覆盖(该 Activity 如今位于“后台”)。
已终止的 Activity
同样仍处于活动状态(Activity 对象保留在内部存款和储蓄器中,它保留了富有情况和成员消息,但与窗口管理器连接)。
但是,它对用户不再可见,在她处索要内部存款和储蓄器时也许会被系统终止。

假如 Activity
处于中断或甘休状态,系统可经过须要其得了(调用其 finish() 方法)或直接终止其经过,将其从内部存款和储蓄器中删除。(将其得了或截至后)再度打开
Activity 时,必须重建。

落到实处生命周期回调

当3个 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 并与其交互。
    例如,当3个新 Activity 运转,并且此 Activity 不再可知时,系统会调用
    onStop()。您能够在调用那八个格局之间保留向用户展现 Activity
    所需的能源。 例如,您能够在 onStart() 中注册一个
    BroadcastReceiver 以监察影响 UI
    的转变,并在用户不大概再观察你呈现的内容时在 onStop()
    大校其收回注册。在 Activity 的成套生命周期,当 Activity
    在对用户可知和潜伏二种景况中交替变化时,系统只怕会一再调用
    onStart()onStop()
  • Activity 的前台湾学生命周期产生在 onResume() 调用与 onPause()
    调用之间。在那段日子,Activity 位于显示屏上的持有别的 Activity
    以前,并有所用户输入主题。 Activity
    可反复员和转业入和转出前台—例如,当设备转入休眠状态或出现对话框时,系统会调用
    onPause()
    由于此境况大概时时发出变动,由此这七个方法中应运用适度轻量级的代码,以制止因变更速度慢而让用户等待。

图 一 表达了那个循环以及 Activity
在气象转变时期恐怕由此的路线。矩形表示回调方法,当 Activity
在分化意况之间转变时,您能够兑现这么些主意来执行操作。

葡萄娱乐官方 1

图1. Activity生命周期

表 一列出了千篇一律的生命周期回调方法,在那之中对每①种回调方法做了更详尽的描述,并表达了每壹种方法在
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() 方法区分这两种情形。

名叫“是不是能事后停下?”的列表示系统是或不是能在不实施另1行 Activity
代码的意况下,在艺术重临后随时终止承载 Activity 的长河。
有八个格局包涵“是”标记:(onPause()onStop()onDestroy())。由于
onPause() 是那四个点子中的第一个,因此 Activity 创设后,onPause()
必定成为最终调用的主意,然后才能终止进度——如若系统在火急情状下必须复苏内部存款和储蓄器,则恐怕不会调用
onStop()onDestroy()。因而,您应该利用 onPause()
向存款和储蓄设备写入至关心重视要的持久性数据(例如用户编辑)。然而,您应该对
onPause()
调用时期总得保留的信息具有选取,因为该方法中的任何阻挡进程都会妨碍向下一个Activity 的变通并拖慢用户体验。
  在是不是能在后头截至?列中标记为“否”的方式可从系统调用它们的说话起预防承载
Activity 的进度被结束。 由此,在从 onPause() 重临的日子到
onResume()被调用的时光,系统能够告1段落 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
    有3个在后台运营的线程,用于从互连网上下载数据,它只怕会在 onCreate() 中创设该线程,然后在 onDestroy() 中甘休该线程。
  • Activity
    看得出生命周期发生在 onStart() 调用与 onStop() 调用之间。在那段时间,用户能够在荧屏上观望Activity 并与其交互。 例如,当二个新 Activity 运维,并且此 Activity
    不再可知时,系统会调用 onStop()。您能够在调用那多个办法之间保留向用户显示Activity 所需的能源。
    例如,您能够在 onStart() 中注册二个 BroadcastReceiver 以监察和控制影响
    UI
    的变通,并在用户无法再来看您出示的内容时在 onStop() 大校其撤除注册。在
    Activity 的万事生命周期,当 Activity
    在对用户可知和隐形三种情景中交替变化时,系统或然会1再调用 onStart() 和 onStop()

  • Activity
    前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在那段时日,Activity
    位于荧屏上的有着其余 Activity 在此之前,并兼有用户输入主题。 Activity
    可反复员和转业入和转出前台 —
    例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()
    由于此景况大概时时产生变更,由此那五个办法中应选取适度轻量级的代码,以制止因变更速度慢而让用户等待。

图 一 认证了那一个循环以及 Activity
在景况转变时期大概因而的途径。矩形表示回调方法,当 Activity
在不一样情状之间浮动时,您能够兑现那几个主意来施行操作。

葡萄娱乐官方 2

图 1. Activity 生命周期。

表 一列出了壹致的生命周期回调方法,个中对每1种回调方法做了更详细的叙说,并表明了每一种艺术在
Activity 整个生命周期内的岗位,包含在回调方法成功后系统是不是终止
Activity。

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

方法

说明

是还是不是能事后终止?

后接

onCreate()

第3回创造 Activity 时调用。 您应该在此办法中推行全部正规的静态设置 —
成立视图、将数据绑定到列表等等。 系统向此形式传递三个 Bundle
对象,个中涵盖 Activity
的上一状态,但是前提是捕获了该景况(请参阅后文的保存 Activity
状态
)。

平昔后接 onStart()

onStart()

    

onRestart()

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

一味后接 onStart()

onStart()

onStart()

在 Activity 即将对用户可见此前调用。

1旦 Activity 转入前台,则后接 onResume(),若是 Activity
转入隐藏状态,则后接 onStop()

onResume() 

onStop()

    

onResume()

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

始终后接 onPause()

onPause()

onPause()

当系统即将上马再三再四另二个 Activity 时调用。
此方法一般用于确认对持久性数据的未保存更改、结束动画以及任何只怕损耗 CPU
的内容,诸如此类。 它应当12分高效地实施所需操作,因为它回到后,下一个Activity 才能继续执行。

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

onResume() 

onStop()

onStop()

在 Activity 对用户不再可知时调用。如若 Activity 被销毁,或另3个Activity(三个共处 Activity 或新
Activity)继续执行并将其遮住,就也许发生那种意况。

比方 Activity 苏醒与用户的并行,则后接 onRestart(),如果 Activity
被销毁,则后接onDestroy()

onRestart()

onDestroy()

onDestroy()

在 Activity 被销毁前调用。这是 Activity 将收到的末段调用。 当 Activity
甘休(有人对 Activity 调用了 finish()),或种类为节约空间而最近销毁该
Activity 实例时,或许会调用它。
您能够经过 isFinishing() 方法分别那三种意况。

名称为“是还是不是能事后终止?”的列表示系统是或不是能在不实施另1行 Activity
代码的情景下,在主意重返后无时无刻终止承载 Activity 的长河。 有五个艺术带

有“是”标记:(onPause()onStop() 和 onDestroy())。由于 onPause() 是那四个法子中的第3个,由此Activity 创制后,onPause() 必定成为终极调用的不2秘籍,然后才能止住进度 —
要是系统在殷切境况下必须苏醒内部存款和储蓄器,则大概不会调用 onStop() 和 onDestroy()。由此,您应该选取 onPause() 向存储设备写入至关心珍重要的持久性数据(例如用户编辑)。可是,您应该对 onPause() 调用时期必须保留的音信享有取舍,因为该方法中的任何阻碍进程都会妨碍向下二个Activity 的变型并拖慢用户体验。

是还是不是能在此后终止?列中标记为“否”的章程可从系统调用它们的一刻起预防承载
Activity 的进程被终止。
因而,在从 onPause() 再次回到的刻钟到onResume() 被调用的时刻,系统能够告壹段落
Activity。在 onPause() 被重复调用并重返前,将不能再度停下 Activity。

:依照表 一 中的定义属于技术上不可能“终止”的 Activity
仍也许被系统终止 —
但这种意况只有在无别的别的财富的Infiniti情状下才会发生。进程和线程处理文书档案对或者会停下
Activity 的情事做了更详细的阐发。

保存 Activity 状态

管制 Activity 生命周期的引言部分简要谈起,当 Activity
暂停或结束时,Activity 的动静会拿走保留。 确实如此,因为当 Activity
暂停或终止时,Activity 对象仍保存在内部存款和储蓄器中 —
有关其成员和近日情状的保有消息仍居于 Activity 状态。 因此,用户在
Activity 内所做的其他改动都会博得保留,那样壹来,当 Activity
重临前台(当它“继续”)时,这么些改变依旧存在。
  可是,当系统为了复苏内部存款和储蓄器而销毁某项 Activity 时,Activity
对象也会被销毁,因此系统在持续 Activity
时根本不只怕让其情景保持总体,而是必须在用户再次回到Activity时重建 Activity
对象。但用户并不知道系统销毁 Activity
后又对其进展了重建,由此他们很也许认为 Activity 状态并非变化。
在那种情况下,您能够兑现另一个回调方法对关于 Activity
状态的音讯举行保存,以管教有关 Activity
状态的机要音讯获得保留:onSaveInstanceState()
  系统会先调用 onSaveInstanceState(),然后再使 Activity
变得不难销毁。系统会向该格局传递1个 Bundle,您能够在在那之中使用
putString()putInt() 等艺术以 名称-值(key-value)对方式保留有关
Activity 状态的新闻。然后,假如系统终止您的接纳进程,并且用户重回您的
Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate()
onRestoreInstanceState()。您能够应用上述任1方法从 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 所做的别样可见更改。例如,艾德itText
Widget保存用户输入的其它文件,CheckBox
Widget保存复选框的入选或未入选状态。您只需为想要保存其状态的各样Widget提供二个唯1的
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,以便利用可供新显示屏配置利用的备用财富。 单凭那1说辞,您的
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 时,它们都会经历生命周期转变。第3个Activity
暂停并甘休(但即使它在后台照旧可知,则不会停下)时,系统会创设另1个Activity。 借使那个 Activity
共用保存到磁盘或别的地点的多少,必须询问的是,在创制第一个 Activity
前,第3个 Activity 不会全盘终止。更适用地说,运转首个 Activity
的长河与停止第二个 Activity 的进程存在重叠。
  生命周期回调的逐一经过分明概念,当七个 Activity
位于同壹进度,并且由3个 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
时,它们都会感受到生命周期转变。第3个 Activity
暂停并甘休(但倘诺它在后台还是可知,则不会终止)时,同时系统会成立另二个Activity。 假使这个 Activity
共用保存到磁盘或任哪里方的多寡,必须询问的是,在开创第一个 Activity
前,第3个 Activity 不会全盘终止。更适合地说,运转首个 Activity
的历程与停止第几个 Activity 的长河存在重叠。

生命周期回调的依次经过明显定义,当几个 Activity 位于同一进度,并且由贰个Activity 运行另多个 Activity 时,其定义尤其显明。 以下是当 Activity A
运维 Activity B 时1层层操作的发出顺序:

  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)