葡京在线官网Android之Activity种类计算,Android开荒指南之Activity

Activity

Activity是三个应用组件,用户可与其提供的显示屏举办互动。以实行拨打电话,拍录照片,发送电子邮件或查看地图等操作。
每种 Activity
都会获得一个用以绘制其用户界面包车型大巴窗口(window)。窗口常常会充满荧屏,但也可小于显示器并转移在此外窗口之上。
  三个选取一般由多少个互相松散联系的 Activity 组成。
一般会钦点应用中的有个别 Activity 为“主”Activity(Main
Activity),即第一遍开发银行应用时表现给用户的不行 Activity。 而且每一个 Activity
均可运营另五个 Activity,以便实施区别的操作。 每一回新 Activity
运维时,前一 Activity 便会终止,但系统会在仓房(“重临栈”)中保存该
Activity。 当新 Activity
运转时,系统会将其推送到重回栈上,并获得用户核心。
再次回到栈遵守“后进先出”货仓机制,因而,当用户完结近期 Activity 并按“重返”
按键时,系统会从仓库团长其弹出(并销毁),然后还原前一Activity。(职责和重临栈文书档案中对回到栈有更详实的阐释。)
  当1个 Activity 因某些新 Activity 运营而告1段落时,系统会因而该 Activity
的生命周期回调方法文告其那①景色变化。Activity 因情形变化(系统是开创
Activity、结束 Activity、苏醒 Activity 照旧销毁
Activity)而接受的回调方法大概有好些个样,每1种回调方法都会为您提供实施与该意况变化相应的特定操作的时机。
举个例子,结束时,您的 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 是3个用到组件,用户可与其提供的荧屏举办相互,以举行拨打电话、拍录照片、发送电子邮件或查看地图等操作。
每一个 Activity
都会收获二个用以绘制其用户分界面包车型客车窗口。窗口常常会充满显示器,但也可小于荧屏并转移在别的窗口之上。

三个施用一般由两个相互松散联系的 Activity 组成。 一般会钦赐应用中的有些Activity 为“主”Activity,即第贰遍运维应用时表现给用户的相当 Activity。
而且各个 Activity 均可运维另3个 Activity,以便推行不1的操作。 每一遍新
Activity 运行时,前壹 Activity
便会停下,但系统会在仓房(“再次回到栈”)中保留该 Activity。 当新 Activity
运维时,系统会将其推送到再次来到栈上,并得到用户主题。
重返栈服从基本的“后进先出”货仓机制,因而,当用户达成近年来 Activity
并按“重返”开关时,系统会从饭馆中将其弹出(并销毁),然后还原前一Activity。 (职责和重回栈文书档案中对回到栈有更详尽的阐发。)

当八个 Activity 因有些新 Activity 运营而告一段落时,系统会由此该 Activity
的生命周期回调方法布告其那1情景变化。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 的第1个连续信号(但并不一连意味着
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)是提供按键、文本字段、复选框或独自是1幅图像等显示屏视觉(交互式)成分的视图。
“布局”(Layout)是衍生自 ViewGroup
的视图,为其子视图提供唯1布局模型,举个例子线性布局(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 的视图,为其子视图提供唯1布局模型,比如线性布局、网格布局或相对布局。
您还足感觉 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
Logo或风格核心等用于安装 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
Logo或风格宗旨等用于安装 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
包括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 过滤器。
对于你想要作出响应的每2个 Intent
类型,您都必须插手相应的 <intent-filter>,当中囊括3个 <action> 成分,还可选择性地总结1个 <category> 元素和/或一个<data> 成分。这一个要素钦赐您的
Activity 可以响应的 Intent 类型。

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

启动 Activity

您能够经过调用 startActivity(),并将其传递给描述您想运转的 Activity 的
Intent 来运转另1个 Activity。Intent 对象会钦赐您想运转的切实 Activity
或描述您想举办的操作类型(系统会为您选择适用的
Activity,乃至是发源其余使用的 Activity)。 Intent
对象还也许指导一点点供所运维 Activity 使用的数码。
  在你的自有应用内行事时,您不时只须要运维某些已知 Activity。
您能够透过动用类名创设一个显式定义您想运营的 Activity 的 Intent
对象来完结此目标。 举个例子,能够经过以下代码让1个 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


你能够透过调用 startActivity(),并将其传递给描述您想运行的 Activity
的 Intent 来运转另多少个 Activity。Intent 对象会钦赐您想运转的现实性
Activity 或描述您想进行的操作类型(系统会为您选拔适当的
Activity,乃至是来源于别的使用的 Activity)。 Intent
对象还恐怕教导少些供所运转 Activity 使用的多少。

在你的自有选取内行事时,您不时只供给运维有个别已知 Activity。
您能够通过应用类名创设3个显式定义您想运维的 Activity 的 Intent
对象来得以达成此目的。 比如,能够透过以下代码让一个 Activity
运营另3个名字为 SignInActivity 的 Activity:

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

可是,您的施用大概还索要动用你的 Activity
数据实践某项操作,比方发送电子邮件、短信或景况更新。
在那种气象下,您的选取本人大概不抱有实行此类操作所需的
Activity,由此你能够改为利用设备上别样应用提供的 Activity
为您实行那几个操作。 那正是 Intent 对象的真正价值所在 — 您可以创设1个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 对3个剧情提供程序实践查询,后者再次来到二个
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() 方法中运用的着力逻辑。
第1个标准检查请求是不是成功(假使成功,则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 时,必须重建。

兑现生命周期回调

当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
    有1个在后台运营的线程,用于从网络上下载数据,它只怕会在
    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()
    由于此情景可能时时发出调换,由此那多少个点子中应选用适度轻量级的代码,以制止因改变速度慢而让用户等待。

图 一 验证了那几个循环以及 Activity
在场所调换时期恐怕因而的门路。矩形表示回调方法,当 Activity
在分歧景况之间变化时,您能够兑现那些措施来推行操作。

葡京在线官网 1

图一. Activity生命周期

表 1列出了1如既往的生命周期回调方法,个中对每一种回调方法做了更详尽的叙说,并表达了每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() 方法区分这两种情形。

名称叫“是还是不是能事后甘休?”的列表示系统是或不是能在不实施另1行 Activity
代码的图景下,在艺术重临后随时终止承载 Activity 的历程。
有多少个点子包涵“是”标记:(onPause()onStop()onDestroy())。由于
onPause() 是那四个措施中的第一个,因而 Activity 成立后,onPause()
必定成为最后调用的艺术,然后才干止住进度——如若系统在殷切境况下必须苏醒内部存款和储蓄器,则也许不会调用
onStop()onDestroy()。因而,您应该选取 onPause()
向存储设备写入至关心注重要的持久性数据(举例用户编辑)。不过,您应该对
onPause()
调用期间必须保留的音信享有采用,因为该方法中的任何阻碍进度都会妨碍向下三个Activity 的改变并拖慢用户体验。
  在是还是不是能在之后结束?列中标志为“否”的秘籍可从系统调用它们的少时起防范承载
Activity 的进度被甘休。 因而,在从 onPause() 重临的岁月到
onResume()被调用的时间,系统能够告壹段落 Activity。在 onPause()
被另行调用并回到前,将无法再度停下 Activity。

注:依据表 一 中的定义属于才能上无法“终止”的 Activity
仍恐怕被系统终止——但那种情状只有在无别的别的财富的相当处境下才会发出。进度和线程管理文书档案对大概会告一段落
Activity 的情事做了更详细的论述。

贯彻生命周期回调

当1个 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 并与其交互。 比方,当1个新 Activity 运行,并且此 Activity
    不再可知时,系统会调用 onStop()。您能够在调用那四个方法之间保留向用户体现Activity 所需的能源。
    比方,您能够在 onStart() 中注册一个 BroadcastReceiver 以监督影响
    UI
    的更改,并在用户不或然再看到你体现的剧情时在 onStop() 元帅其收回注册。在
    Activity 的成套生命周期,当 Activity
    在对用户可知和潜伏三种意况中交替变化时,系统或然会频仍调用 onStart() 和 onStop()

  • Activity
    前台湾学生命周期发生在 onResume() 调用与 onPause() 调用之间。在那段日子,Activity
    位于显示屏上的兼具别的 Activity 在此以前,并有所用户输入大旨。 Activity
    可反复员和转业入和转出前台 —
    举个例子,当设备转入休眠状态或出现对话框时,系统会调用 onPause()
    由于此意况只怕时时产生变动,由此那三个法子中应运用适度轻量级的代码,以免止因改变速度慢而让用户等待。

图 一 表明了那个循环以及 Activity
在气象转换时期只怕由此的门径。矩形表示回调方法,当 Activity
在分化处境之间转换时,您能够兑现那个办法来实行操作。

葡京在线官网 2

图 1. Activity 生命周期。

表 1列出了千篇一律的生命周期回调方法,个中对每1种回调方法做了更详实的描述,并证实了每1种方法在
Activity 整个生命周期内的地点,包含在回调方法成功后系统是不是终止
Activity。

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

方法

说明

是或不是能事后甘休?

后接

onCreate()

第三遍创设 Activity 时调用。 您应该在此格局中执行全部正规的静态设置 —
创制视图、将数据绑定到列表等等。 系统向此办法传递3个 Bundle
对象,在那之中累积 Activity
的上1状态,不过前提是捕获了该情状(请参阅后文的保存 Activity
状态
)。

始终后接 onStart()

onStart()

    

onRestart()

在 Activity 已告1段落并将在重新运营前调用。

一味后接 onStart()

onStart()

onStart()

在 Activity 将在对用户可知此前调用。

尽管 Activity 转入前台,则后接 onResume(),假使 Activity
转入隐藏状态,则后接 onStop()

onResume() 

onStop()

    

onResume()

在 Activity 将在上马与用户进行互动以前调用。 此时,Activity 处于
Activity 仓库的顶层,并兼有用户输入焦点。

始终后接 onPause()

onPause()

onPause()

当系统就要起头接二连三另3个 Activity 时调用。
此方法一般用于确认对持久性数据的未保存更换、截至动画以及别的或然损耗 CPU
的故事情节,诸如此类。 它应当11分飞快地实施所需操作,因为它回到后,下一个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() 是那多个办法中的第3个,由此Activity 创造后,onPause() 必定成为最终调用的不贰秘诀,然后才干终止进程 —
假若系统在殷切情形下必须恢复内部存款和储蓄器,则或然不会调用 onStop() 和 onDestroy()。因而,您应该使用 onPause() 向存款和储蓄设备写入至关心器重要的持久性数据(举个例子用户编辑)。不过,您应该对 onPause() 调用时期总得保留的新闻具有取舍,因为该方法中的任何阻拦进度都会妨碍向下三个Activity 的更改并拖慢用户体验。

是还是不是能在后来结束?列中标志为“否”的措施可从系统调用它们的少时起防卫承载
Activity 的历程被截至。
由此,在从 onPause() 再次回到的时辰到onResume() 被调用的时刻,系统能够告一段落
Activity。在 onPause() 被再一次调用并回到前,将不可能再一次停下 Activity。

:遵照表 壹 中的定义属于才能上无法“终止”的 Activity
仍大概被系统终止 —
但那种气象只有在无任何别的财富的杰出气象下才会生出。经过和线程管理文书档案对大概会截至Activity 的事态做了更详实的演说。

保存 Activity 状态

管住 Activity 生命周期的引言部分简要谈起,当 Activity
暂停或终止时,Activity 的景象会赢得保留。 确实如此,因为当 Activity
暂停或终止时,Activity 对象仍保留在内部存款和储蓄器中 —
有关其成员和当下景况的持有新闻仍居于 Activity 状态。 因而,用户在
Activity 内所做的别的改换都会赚取保留,那样1来,当 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提供3个唯一的
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()。您可以利用上述任1方法从 Bundle 提取您保存的状态并回复该
Activity
状态。假如未有动静新闻需求还原,则传递给你的 Bundle 是空值(要是是第3回创立该
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 小部件保存复选框的入选或未入选状态。您只需为想要保存其场馆包车型地铁各样小部件提供1个唯1的
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
前,第3个 Activity 不会全盘停下。更确切地说,运维第3个 Activity
的进度与结束第3个 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 运转另2个 Activity
时,它们都会感受到生命周期转换。第二个 Activity
暂停并终止(但万一它在后台如故可知,则不会终止)时,同时系统会创立另2个Activity。 假使那么些 Activity
共用保存到磁盘或任哪里方的数额,必须精晓的是,在制造第一个 Activity
前,第一个 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() 施行期间向数据库写入数据。

 

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

 

Activity类别作品:

Android之Activity连串总括(1)–Activity大概浏览

Android之Activity类别总括(2)–任务和重回栈

Android
旋转荧屏–管理Activity与AsyncTask的一流消除方案
(处理运营时退换)

 Activity之大概浏览显示器(Overview
Screen)

相关文章