系统会透过该 Activity,系统会由此该 Activity

Activity

Activity是一个施用组件,用户可与其提供的屏幕进行相互。以举办拨打电话,拍录照片,发送电子邮件或查看地图等操作。
各个 Activity
都会获取三个用于绘制其用户界面的窗口(window)。窗口平日会充满显示器,但也可小于显示器并扭转在其它窗口之上。
  2个采纳一般由七个互相松散联系的 Activity 组成。
一般会内定应用中的某些 Activity 为“主”Activity(Main
Activity),即第二回开行应用时展现给用户的格外 Activity。 而且每一个 Activity
均可开行另2个 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 均可开行另3个 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 的第1个信号(但并不两次三番意味着
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 过滤器。 正如前例所示,只应有3个Activity 具有“主”操作和“launcher”系列。 您不想提需要其余使用的 Activity
不该其余 Intent 过滤器,您可以动用显式 Intent
自行运营它们(下文对此做了阐释)。
  然则,如若您想让 Activity 对衍生自其他使用(以及你的自有采用)的隐式
Intent 作出响应,则必须为 Activity 定义其余 Intent 过滤器。
对于你想要作出响应的每贰个 Intent 类型,您都无法不投入相应的
<Intent-filter>,其中包括3个 <action>要素,还可选取性地回顾2个
<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>,其中包含3个 <action> 成分,还可采纳性地回顾三个 <category> 元素和/或一个<data> 成分。那几个要素钦命您的
Activity 可以响应的 Intent 类型。

如需了然有关您的 Activity 怎么样响应 Intent 的详细音信,请参阅 Intent 和
Intent
过滤器
文档。

启动 Activity

你可以经过调用 startActivity(),并将其传递给描述您想运维的 Activity 的
Intent 来运营另一个 Activity。Intent 对象会钦定您想运转的切实可行 Activity
或描述您想进行的操作类型(系统会为你采取适合的
Activity,甚至是源于其余使用的 Activity)。 Intent
对象还可能辅导少量供所运转 Activity 使用的数量。
  在你的自有使用内行事时,您不时只需求运行有个别已知 Activity。
您可以因此拔取类名成立贰个显式定义您想运行的 Activity 的 Intent
对象来达成此目标。 例如,可以透过以下代码让3个 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
是3个字符串数组,其中蕴涵应将电子邮件发送到的电子邮件地址。
当电子邮件接纳响应此 Intent 时,它会读取 extra
中提供的字符串数组,并将它们放入电子邮件撰写窗体的“收件人”字段。
在那种意况下,电子邮件采用的 Activity 运转,并且当用户已毕操作时,您的
Activity 会復苏执行。

启动 Activity


你可以经过调用 startActivity(),并将其传递给描述您想运行的 Activity
的 Intent 来运转另1个 Activity。Intent 对象会内定您想运维的具体
Activity 或描述您想举办的操作类型(系统会为你选取适合的
Activity,甚至是源于其他应用的 Activity)。 Intent
对象还只怕指点少量供所运行 Activity 使用的数目。

在您的自有应用内工作时,您平常只要求运维有些已知 Activity。
您可以通过使用类名创制1个显式定义您想运维的 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 对七个内容提供程序执行查询,后者重返1个 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
仍可知。约等于说,另2个 Activity 呈现在此 Activity 上方,并且该
Activity 部分透明或未覆盖全部屏幕。 暂停的 Activity
处于完全活动状态(Activity 对象保留在内存中,它保留了有着情形和分子消息,并与窗口管理器保持延续),但在内存卓殊不足的场所下,大概会被系统终止。

停止
该 Activity 被另三个 Activity 完全覆盖(该 Activity 近年来位于“后台”)。
已终止的 Activity
同样仍居于活动状态(Activity 对象保留在内存中,它保留了全体情状和成员音讯,但与窗口管理器连接)。
不过,它对用户不再可知,在他处索要内存时大概会被系统终止。

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

落成生命周期回调

当一个 Activity
转入和转出上述不相同情形时,系统会透过种种回调方法向其发生通报。
全体回调方法都以关系,您能够在 Activity
状态发生变化时替代那几个关系来实施相应操作。 以下框架 Activity
包含每2个中坚生命周期方法:

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 并与其交互。
    例如,当3个新 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 的境况做了更详细的阐释。

落到实处生命周期回调

当2个 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 被灭绝,或另1个Activity(2个现有 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 所做的任何可知更改。例如,艾德itText
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

当2个 Activity 运维另一个 Activity 时,它们都会经历生命周期转变。第3个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 的新闻变更。 例如,若是你必须在第3个 Activity
截止时向数据库写入数据,以便下贰个 Activity 可以读取该数量,则应在
onPause() 而不是 onStop() 执行时期向数据库写入数据。

协调 Activity

当1个 Activity 运营另二个 Activity
时,它们都会体会到生命周期转变。第③个 Activity
暂停并截止(但假设它在后台依然可知,则不会终止)时,同时系统会成立另3个Activity。 假如这几个 Activity
共用保存到磁盘或其余地方的多寡,必须询问的是,在成立第1个 Activity
前,第一个 Activity 不会全盘止住。更适用地说,运行第二个 Activity
的历程与截至第四个 Activity 的长河存在重叠。

生命周期回调的一一经过明显定义,当四个 Activity 位于同一进度,并且由一个Activity 运维另3个 Activity 时,其定义越发鲜明。 以下是当 Activity A
运行 Activity B 时一文山会海操作的发生顺序:

  1. Activity A 的 onPause() 方法执行。
  2. Activity B
    的 onCreate()onStart() 和 onResume() 方法依次执行。(Activity
    B 以后具备用户核心。)
  3. 下一场,假设 Activity A 在显示屏上不再可知,则其 onStop() 方法执行。

您可以应用那种可预测的生命周期回调顺序管理从3个 Activity 到另壹个Activity 的新闻变更。 例如,若是你必须在第1个 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)