系统会经过该 Activity,系统会经过该 Activity

Activity

图片 1

正文内容

  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
生命周期
有的对具有生命周期回调方法开展了演说。

以下讲演均出自Android官网的支付文档

完成用户界面

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

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

使用视图定义布局的最广泛格局是看重保存在您的利用资源内的 XML
布局文件。那样一来,您就足以将用户界面的宏图与概念 Activity
行为的源代码分开维护。 您可以经过 setContentView() 将布局设置为
Activity 的 UI,从而传递布局的资源 ID。但是,您也足以在 Activity
代码中开立异 View,并因此将新 View 插入 ViewGroup 来成立视图层次,然后通过将根 ViewGroup 传递到 setContentView() 来使用该布局。

如需了然有关创制用户界面的音讯,请参阅用户界面文档。

1.简述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> 元素添加为 <application>要素的子项。例如:

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

你还是能在此因素中参加多少个其余特色,以定义 Activity 标签、Activity
图标或风格主旨等用于安装 Activity UI
风格的性质。 android:name 属性是绝无仅有必需的质量—它指定
Activity
的类名。应用一旦公布,即不应更改此类名,否则,可能会损坏诸如应用飞速方式等片段效益(请阅读博客小说 Things
That Cannot
Change
 [不可能更改的情节])。

请参阅 <activity> 元素参考文档,掌握有关在清单文件中宣示
Activity 的详细音讯。

2.创建Activity

要成立 Activity,您必须创建 Activity
的子类(或选取其存世子类)。您须要在子类中贯彻 Activity
在其生命周期的各样气象之间转移时(例如创立 Activity、停止 Activity、恢复生机Activity 或销毁 Activity 时)系统调用的回调方法。
八个最根本的回调方法是:

  • onCreate()
    您必须完结此措施。系统会在开创您的 Activity
    时调用此格局。您应该在达成内起首化 Activity 的必不可少组件。
    最重点的是,您必须在此办法内调用 setContentView(),以定义 Activity
    用户界面的布局。
  • onPause()
    系统将此措施作为用户距离 Activity 的首先个信号(但并不三番五次意味着
    Activity 会被灭绝)举办调用。
    您常常应该在此办法内肯定在此时此刻用户会话截止后依然有效的其它改动(因为用户可能不会再次来到)。

您还应拔取二种其他生命周期回调方法,以便提供流畅的 Activity
间用户体验,以及处理导致你的 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
过滤器
文档。

3.贯彻用户界面

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

你可以应用 Android
提供的大队人马现成视图设计和团伙您的布局。“小部件”是提供按钮、文本字段、复选框或单独是一幅图像等显示器视觉(交互式)元素的视图。
“布局”是衍生自 ViewGroup
的视图,为其子视图提供唯一布局模型,例如线性布局、网格布局或相对布局。
您还足以为 View 类和 ViewGroup
类创立子类(或使用其存世子类)来机关成立小部件和布局,然后将它们选拔于你的
Activity 布局。

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

如需精通有关创立用户界面的新闻,请参阅用户界面文档。

启动 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 会复苏执行。

4.在清单文件中注脚Activity

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

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

您还足以在此因素中进入多少个其他特色,以定义 Activity 标签、Activity
图标或风格焦点等用于安装 Activity UI 风格的特性。 android:name
属性是绝无仅有必需的属性—它指定 Activity
的类名。应用一旦公布,即不应更改此类名,否则,可能会毁掉诸如应用飞速形式等部分效应。

请参阅<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
过滤器
文档。

(1)使用 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


您可以由此调用 Activity 的 finish() 方法来终止该
Activity。您仍是可以透过调用 finishActivity() 为止你此前启动的另一个
Activity。

:在大多数景况下,您不应使用这么些艺术显式为止 Activity。
正如下文有关 Activity 生命周期的局地所述,Android 系统会为你管理
Activity 的生命周期,因而你无需终止自己的 Activity。
调用那个办法或者对预期的用户体验爆发不良影响,因而只应在您确实不想让用户重回此
Activity 实例时使用。

5.启动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
的生命周期对开发强大而又利落的使用主要。 Activity
的生命周期会一向遭逢 Activity 与其他Activity、其职分及再次回到栈的关联性的熏陶。

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

继续
此 Activity 位于屏幕前台并持有用户主旨。(有时也将此情状称为“运行中”。)

暂停
另一个 Activity 位于屏幕前台并拥有用户焦点,但此 Activity
仍可知。也就是说,另一个 Activity 呈现在此 Activity 上方,并且该
Activity 部分透明或未覆盖任何屏幕。 暂停的 Activity
处于完全活动状态(Activity 对象保留在内存中,它保留了所有情形和分子音讯,并与窗口管理器保持一而再),但在内存相当不足的状态下,可能会被系统终止。

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

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

6.起动 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,让查询的多少可知被读取。如需了然详细新闻,请参阅情节提供程序文档。

心想事成生命周期回调

当一个 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 的景况做了更详尽的阐发。

7.结束Activity

您可以透过调用 Activity 的 finish() 方法来了却该
Activity。您还足以通过调用 finishActivity() 截止你事先启动的另一个
Activity。

注:在大部场地下,您不应使用这么些办法显式停止 Activity。 正如下文有关
Activity 生命周期的片段所述,Android 系统会为您管理 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,就会产出那种场合)。

图片 3

图 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
在重建时能不能完全復苏其情形就显得相当主要,因为用户在行使应用时平日要求旋转屏幕。

8.管制 Activity 生命周期

通过兑现回调方法管理 Activity
的生命周期对开发强大而又利落的行使紧要。 Activity
的生命周期会一直碰着 Activity 与任何
Activity、其义务及再次回到栈的关联性的熏陶。

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

  • 继续
    此 Activity
    位于显示器前台并保有用户大旨。(有时也将此情景称为“运行中”。)
  • 暂停
    另一个 Activity 位于屏幕前台并有着用户主题,但此 Activity
    仍可见。也就是说,另一个 Activity 突显在此 Activity 上方,并且该
    Activity 部分透明或未覆盖全体显示屏。 暂停的 Activity
    处于完全活动状态(Activity
    对象保留在内存中,它保留了具备意况和成员信息,并与窗口管理器保持连续),但在内存分外不足的情景下,可能会被系统终止。
  • 停止
    该 Activity 被另一个 Activity 完全覆盖(该 Activity
    方今身处“后台”)。 已截至的 Activity 同样仍处于活动状态(Activity
    对象保留在内存中,它保留了装有意况和成员音信,但未与窗口管理器连接)。
    可是,它对用户不再可知,在她处须求内存时可能会被系统终止。

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

拍卖配置变更

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

如果你对 Activity
举行了适宜设计,让它亦可按上述所述处理显示器方向变化带来的重启并还原
Activity 状态,那么在受到 Activity
生命周期中的其余意外事件时,您的利用将持有更强的适应性。

正如上文所述,处理此类重启的特级艺术是采取onSaveInstanceState() 和 onRestoreInstanceState()(或 onCreate())保存并恢复生机Activity 的景况。

如需了然有关运行时爆发的布局变更以及应对方法的详细新闻,请阅读拍卖运行时变更指南。

9.完结申明周期回调

当一个 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
在差距意况之间变化时,您可以兑现这个点子来执行操作。

图片 4

图 1. Activity 生命周期。

表 1
列出了千篇一律的生命周期回调方法,其中对每一种回调方法做了更详细的讲述,并证实了每一种格局在
Activity 整个生命周期内的义务,包蕴在回调方法成功后系统能仍然不能终止
Activity。

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

图片 5

名为“是或不是能事后停下?”的列表示系统是还是不是能在不实施另一行 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 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)

10.保存 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,就会冒出那种景色)。

图片 6

图 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
在重建时是或不是完全復苏其状态就突显相当重大,因为用户在利用使用时平日索要旋转显示屏。

11.甩卖配置变更

稍稍设备配置或者会在运行时暴发变化(例如屏幕方向、键盘可用性及语言)。暴发此类变化时,Android
会重建运行中的
Activity(系统调用onDestroy(),然后马上调用onCreate())。此行为意在通过接纳你提供的备用资源(例如适用于差别屏幕方向和显示器尺寸的差距布局)自动重新加载您的利用来赞助它适应新配置。
假定您对 Activity
举行了适当设计,让它可以按以上所述处理屏幕方向转变带来的重启并还原
Activity 状态,那么在遭受 Activity
生命周期中的其余意外事件时,您的采取将有着更强的适应性。

正如上文所述,处理此类重启的极品情势是采纳onSaveInstanceState()和onRestoreInstanceState()(或onCreate())保存并还原
Activity 的意况。

如需询问关于运行时发出的配置变更以及应对办法的详细新闻,请阅读处理运行时变更指南

12.协调 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官方文档–Activity

相关文章