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
在不同景观之间变化时,您可以实现这个模式来推行操作。

2018正版葡京赌侠诗 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,就会并发这种境况)。

2018正版葡京赌侠诗 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()2018正版葡京赌侠诗, 方法执行。

你能够使用这种可预测的生命周期回调顺序管理从一个 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地图