Activity

本文内容

  1. 创建 Activity
    1. 落实用户界面
    2. 在清单文件中声称 Activity
  2. 启动 Activity
    1. 起步 Activity 以赢得结果
  3. 结束 Activity
  4. 管制 Activity 生命周期
    1. 落实生命周期回调
    2. 保存 Activity 状态
    3. 处理配置变更
    4. 协调 Activity

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

一个利用一般由五个相互松散联系的 Activity 组成。 一般会指定应用中的某个
Activity 为“主”Activity,即第一次开行应用时表现给用户的十分 Activity。
而且每个 Activity 均可启动另一个 Activity,以便执行不同的操作。 每一回新
Activity 启动时,前一 Activity
便会告一段落,但系统会在库房(“再次回到栈”)中保存该 Activity。 当新 Activity
启动时,系统会将其推送到重返栈上,并收获用户主题。
再次回到栈遵循基本的“后进先出”堆栈机制,由此,当用户完成近期 Activity
并按“再次回到”按钮时,系统会从仓库师长其弹出(并销毁),然后还原前一
Activity。 (职责和重返栈文档中对回到栈有更详尽的阐释。)

当一个 Activity 因某个新 Activity 启动而停止时,系统会透过该 Activity
的生命周期回调方法通告其这一境况变化。Activity 因场合变化—系统是创建Activity、结束 Activity、苏醒 Activity 依然销毁 Activity—
而接受的回调方法或者有好多种,每一种回调都会为您提供执行与这场地变化相应的特定操作的空子。
例如,截至时,您的 Activity 应释放其他大型对象,例如网络或数据库连接。
当 Activity 复苏时,您可以另行赢得所需资源,并复苏执行中断的操作。
这么些境况转变都是 Activity 生命周期的一片段。

正文的另外部分讲演有关如何创立和动用 Activity 的基础知识(包括对
Activity 生命周期工作形式的两全论述),以便你不利管理各类 Activity
状态之间的变动。

创建 Activity


要开创
Activity,您必须创建 Activity 的子类(或利用其现有子类)。您需要在子类中实现
Activity 在其生命周期的各个场合之间变化时(例如成立 Activity、截至Activity、恢复生机 Activity 或销毁 Activity 时)系统调用的回调方法。
六个最根本的回调方法是:

onCreate()
你必须贯彻此办法。系统会在创制您的 Activity
时调用此措施。您应该在落实内起始化 Activity 的必需组件。
最重大的是,您必须在此方法内调用setContentView(),以定义 Activity
用户界面的布局。

onPause()
系统将此模式作为用户距离 Activity 的首先个信号(但并不连续意味着
Activity 会被灭绝)举办调用。
您平日应该在此办法内肯定在此时此刻用户会话截至后依旧有效的此外改动(因为用户可能不会重返)。

您还应利用三种其他生命周期回调方法,以便提供流畅的 Activity
间用户体验,以及处理导致你的 Activity 截止甚至被灭绝的意料之外中断。
后文的管制 Activity
生命周期
一对对具备生命周期回调方法开展了阐释。

心想事成用户界面

Activity 的用户界面是由层级式视图 — 衍生自 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 的详细消息。

使用 Intent 过滤器

<activity> 元素还可指定各样Intent
过滤器—使用 <intent-filter> 元素—以宣称其他使用组件激活它的办法。

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

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

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

假诺你打算让使用成为独立运用,不容许任何使用激活其
Activity,则您不需要其他此外 Intent 过滤器。 正如前例所示,只应有一个
Activity 具有“主”操作和“launcher”连串。 您不想提供给另外使用的 Activity
不应有其他 Intent 过滤器,您可以采取显式 Intent
自行启动它们(下文对此做了演讲)。

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

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

启动 Activity


你可以通过调用 startActivity(),并将其传递给描述您想启动的 Activity
的 Intent 来启动另一个 Activity。Intent 对象会指定您想启动的具体
Activity 或描述您想进行的操作类型(系统会为您选取恰当的
Activity,甚至是根源其他使用的 Activity)。 Intent
对象还可能指点少量供所启动 Activity 使用的数额。

在你的自有使用内工作时,您不时只需要启动某个已知 Activity。
您可以透过利用类名创造一个显式定义您想启动的 Activity 的 Intent
对象来贯彻此目的。 例如,可以通过以下代码让一个 Activity
启动另一个名为 SignInActivity 的 Activity:

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

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

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

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

起步 Activity 以博得结果

偶尔,您或许需要从起步的 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
的生命周期对开发强大而又利落的采取关键。 Activity
的生命周期会间接面临 Activity 与任何
Activity、其职责及再次来到栈的关联性的影响。

Activity 基本上以三种情形存在:

继续
此 Activity 位于屏幕前台并有着用户主题。(有时也将此情况叫做“运行中”。)

暂停
另一个 Activity 位于屏幕前台并具有用户大旨,但此 Activity
仍可见。也就是说,另一个 Activity 展现在此 Activity 上方,并且该
Activity 部分透明或未覆盖全部屏幕。 暂停的 Activity
处于完全活动状态(Activity 对象保留在内存中,它保留了具备情状和分子音信,并与窗口管理器保持连续),但在内存卓殊不足的情状下,可能会被系统终止。

停止
该 Activity 被另一个 Activity 完全覆盖(该 Activity 近来位居“后台”)。
已告一段落的 Activity
同样仍居于活动状态(Activity 对象保留在内存中,它保留了具备状况和成员消息,但与窗口管理器连接)。
可是,它对用户不再可见,在她处需要内存时可能会被系统终止。

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

心想事成生命周期回调

当一个 Activity
转入和转出上述不同意况时,系统会经过各样回调方法向其发出通告。
所有回调方法都是沟通,您可以在 Activity
状态爆发变化时替代这个关系来执行相应操作。 以下框架 Activity
包括每一个主干生命周期方法:

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

  

:正如以上示例所示,您在落实这一个生命周期方法时务必始终先调用超类实现,然后再举行另外操作。

那一个艺术共同定义 Activity 的全套生命周期。您可以因而落实这个办法监控
Activity 生命周期中的三个嵌套循环:

  • Activity
    漫天生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的
    Activity
    应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其他资源。例如,如若您的
    Activity
    有一个在后台运行的线程,用于从网络上下载数据,它恐怕会在 onCreate() 中创设该线程,然后在 onDestroy() 中截至该线程。
  • Activity
    可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时日,用户可以在屏幕上收看
    Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity
    不再可见时,系统会调用 onStop()。您可以在调用这五个主意之间保留向用户展现Activity 所需的资源。
    例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监察影响
    UI
    的更动,并在用户不可以再看到你映现的情节时在 onStop() 上校其收回注册。在
    Activity 的百分之百生命周期,当 Activity
    在对用户可见和隐藏两种状况中交替变化时,系统或许会频繁调用 onStart() 和 onStop()

  • Activity
    前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity
    位于屏幕上的有着其他 Activity 在此以前,并负有用户输入要旨。 Activity
    可反复转入和转出前台 —
    例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()
    由于此情景恐怕时时发生转移,由此这两个法子中应接纳适度轻量级的代码,以制止因变更速度慢而让用户等待。

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

图片 1

图 1. Activity 生命周期。

表 1
列出了一如既往的生命周期回调方法,其中对每一种回调方法做了更详尽的描述,并表明了每一种方法在
Activity 整个生命周期内的职位,包括在回调方法成功后系统是否终止
Activity。

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

方法

说明

是不是能事后截止?

后接

onCreate()

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

一味后接 onStart()

onStart()

    

onRestart()

在 Activity 已告一段落并即将重新启航前调用。

一味后接 onStart()

onStart()

onStart()

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

倘诺 Activity 转入前台,则后接 onResume(),假若 Activity
转入隐藏状态,则后接 onStop()

onResume() 

onStop()

    

onResume()

在 Activity 即将起始与用户举行互动在此以前调用。 此时,Activity 处于
Activity 堆栈的顶层,并装有用户输入主题。

始终后接 onPause()

onPause()

onPause()

当系统即将上马继续另一个 Activity 时调用。
此方法一般用于确认对持久性数据的未保存更改、结束动画以及其余可能损耗 CPU
的始末,诸如此类。 它应该充足连忙地推行所需操作,因为它回到后,下一个
Activity 才能继续执行。

假诺 Activity 重临前台,则后接 onResume(),如若 Activity
转入对用户不可见状态,则后接onStop()

onResume() 

onStop()

onStop()

在 Activity 对用户不再可见时调用。倘使 Activity 被灭绝,或另一个
Activity(一个共处 Activity 或新
Activity)继续执行并将其遮住,就可能暴发这种气象。

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

onRestart()

onDestroy()

onDestroy()

在 Activity 被灭绝前调用。那是 Activity 将接受的尾声调用。 当 Activity
截止(有人对 Activity 调用了 finish()),或系统为节约空间而暂时销毁该
Activity 实例时,可能会调用它。
您可以通过 isFinishing() 方法分别那二种状态。

名为“是否能事后结束?”的列表示系统是否能在不执行另一行 Activity
代码的气象下,在方法重临后时刻终止承载 Activity 的进程。 有六个办法带

有“是”标记:(onPause()onStop() 和 onDestroy())。由于 onPause() 是这七个主意中的第一个,因此Activity 创设后,onPause() 必定成为最终调用的方法,然后才能止住进程 —
假使系统在紧急情形下必须復苏内存,则可能不会调用 onStop() 和 onDestroy()。因而,您应该使用 onPause() 向存储设备写入至关重要的持久性数据(例如用户编辑)。不过,您应该对 onPause() 调用期间总得保留的音信具有选用,因为该方法中的任何阻碍过程都会妨碍向下一个
Activity 的变通并拖慢用户体验。

是不是能在随后截至?列中标记为“否”的章程可从系统调用它们的说话起预防承载
Activity 的过程被截止。
由此,在从 onPause() 重临的岁月到onResume() 被调用的时间,系统可以告一段落
Activity。在 onPause() 被再一次调用并回到前,将无法再度停下 Activity。

:遵照表 1 中的定义属于技术上不能“终止”的 Activity
仍可能被系统终止 —
但这种气象只有在无任何其他资源的出色气象下才会生出。进程和线程处理文档对可能会停下
Activity 的图景做了更详尽的阐发。

保存 Activity 状态

管理 Activity
生命周期
的引言部分简要提及,当
Activity 暂停或终止时,Activity 的事态会取得保留。 确实如此,因为当
Activity 暂停或终止时,Activity 对象仍保存在内存中 —
有关其成员和当前景观的具备音信仍处于活动状态。 由此,用户在 Activity
内所做的另外改动都会拿走保留,这样一来,当 Activity
再次来到前台(当它“继续”)时,这个改动依旧存在。

只是,当系统为了復苏内存而销毁某项 Activity
时,Activity 对象也会被灭绝,因而系统在持续 Activity
时根本不能让其场合保持完全,而是必须在用户重返 Activity
时重建 Activity 对象。但用户并不知道系统销毁 Activity
后又对其进展了重建,由此他们很可能以为 Activity 状态并非变化。
在这种景观下,您可以兑现另一个回调方法对关于 Activity
状态的信息举办保存,以保证有关 Activity
状态的显要音讯获取保留:onSaveInstanceState()

系统会先调用 onSaveInstanceState(),然后再使 Activity
变得容易销毁。系统会向该措施传递一个 Bundle,您可以在中间使用 putString() 和putInt() 等办法以名称-值对格局保留有关
Activity 状态的音讯。然后,假如系统终止您的施用进程,并且用户重临您的
Activity,则系统会重建该
Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以应用上述任一方法从 Bundle 提取您保存的境况并回升该
Activity
状态。假使没有动静音讯需要还原,则传递给您的 Bundle 是空值(假设是第一次创立该
Activity,就会并发这种境况)。

图片 2

图 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 的状态。

如需询问关于运行时暴发的配备变更以及应对办法的详细音讯,请阅读拍卖运行时变更指南。

协调 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)

相关文章

网站地图xml地图