2.MySQL数据库的着力使用和管制

1.mysql数额存储结构

  1.1由“数据库”——》“表”——》“数据”组成

 
  1.2管制数据库需要采用SQL(结构化查询语言)

    SQL语言分为:

      1 数码查询语言DQL

       遵照指定的三结合、条件说明式或排序检索已存在的数据库中数量,不改变数据库中多少。

       命令:SELECT…FROM…WHERE…

      2 数码操纵语言DML  

       对已经存在的数据库举办元组的插入、删除、修改等操作

       命令:INSERT、UPDATE、DELETE

      3 数据定义语言DDL  

       
成立、修改或删除数据库中各个对象,包括表、视图、索引等。

        命令:CREATE TABLE , CREATE VIEW, CREATE INDEX、ALTER TABLE ,
                    DROP TABLE , DROP VIEW, DROP INDEX 

      4 数据控制语言DCL

       用来予以或注销访问数据库的某种特权、控制数据操纵事务的发生时间及效率、对数据库进行蹲点

       命令:GRANT、REVOKE、COMMIT、ROLLBACK

Activity

2.询问所有数据库

  通过命令行登录数据库,输入首个查看数据库的sql语句

    mysql> show databases;  –默认显示4个数据库

      +——————–+
      | Database |
      +——————–+
      | information_schema |  –mysql元数据,基础数据
      | mysql
|          –mysql配置数据库,其中包含用户信息(用户名和密码,权限管理)
      | performance_schema
|  –mysql数据库软件的运转数据,日志音信,性能数据
      | test |           –测试数据库,空数据库
      +——————–+

正文内容

  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
状态之间的变通。

3,创制数据库

    3.1 sql语句为:create database    数据库名称;

    mysql> create database first;  –first为数据库名称

      Query OK, 1 row affected (0.01 sec)

*    *3.2
成立数据库时设置数据库的字符

     mysql> create database
two    –此时不需输入分号,因为分号意味那语句截止,直接回车

        -> default character set
utf8;  –设置默认字符为utf-8
     Query OK, 1 row affected (0.00 sec)

*  *  3.3
查看数据库的默认字符集

*    *mysql> show create database first;
    –first为数据库名称

    +———-+—————————————————————+
    | Database | Create Database |
    +———-+—————————————————————+
    | first | CREATE DATABASE `first` /*!40100 DEFAULT CHARACTER
SET gbk */ |
    +———-+—————————————————————+
    1 row in set (0.00 sec)

*    *3.4 删除数据库

    mysql> drop database two;      –two为数据库名称

    Query OK, 0 rows affected (0.17 sec)

    3.5 修改数据库的默认字符集

    mysql> alter database first default character set utf8;  
  –修改first数据库的字符为utf-8

    Query OK, 1 row affected (0.00 sec)  

创建 Activity


要创造Activity,您必须创制 Activity 的子类(或应用其存世子类)。您需要在子类中落实
Activity 在其生命周期的种种状态之间变化时(例如创立 Activity、截至Activity、复苏 Activity 或销毁 Activity 时)系统调用的回调方法。
五个最重点的回调方法是:

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

onPause()
系统将此方法作为用户距离 Activity 的第一个信号(但并不连续意味着
Activity 会被灭绝)举办调用。
您平时应该在此方法内肯定在最近用户会话截止后如故有效的别样改动(因为用户可能不会再次来到)。

您还应利用二种其他生命周期回调方法,以便提供流畅的 Activity
间用户体验,以及处理导致你的 Activity 停止甚至被销毁的意料之外中断。
后文的管住 Activity
生命周期
有些对所有生命周期回调方法举办了演讲。

4.表管理

    4.1采用数据库  

      mysql> use first;  –first为数据库名称
      Database changed

    4.2创建表

      mysql> create table student(    –student为表名称
        -> sid int,           –sid为字段名称
编号,int是字段类型  整形
        -> sname varchar(20),     –sname为字段名称
姓名,varchar(20)是字段类型 字符串长度是20
        -> sage int          –sage为字段名称
年龄,int是字段类型,整形
        -> );
      Query OK, 0 rows affected (0.14 sec)

     4.3翻看所有表

    mysql> show tables;

*      +—————–+
      | Tables_in_first |
      +—————–+
      | student |
      +—————–+
      1 row in set (0.00 sec)*

*     *4.4查看一张表的表结构

    mysql> desc
student;    –student表名称

      +——-+————-+——+—–+———+——-+
      | Field | Type | Null | Key | Default | Extra |
      +——-+————-+——+—–+———+——-+
      | sid | int(11) | YES | | NULL | |
      | sname | varchar(20) | YES | | NULL | |
      | sage | int(11) | YES | | NULL | |
      +——-+————-+——+—–+———+——-+
      3 rows in set (0.05 sec)

     4.5删除表

    mysql> drop table
student;

      Query OK, 0 rows affected (0.11 sec)

      4.6修改表

    mysql> alter table
student add column sgender
varchar(2);    –向student表中加进一个sgender的字段,column可以简单

      Query OK, 0 rows affected (0.06 sec)
      Records: 0 Duplicates: 0 Warnings: 0

    

      mysql> alter table student drop
sgender;      –删除student表中sgender那一个字段,column可以简简单单

      Query OK, 0 rows affected (0.06 sec)
      Records: 0 Duplicates: 0 Warnings: 0

      

      mysql> alter table student modify sname
varchar(10);    –修改student表中sname字段的体系为varchar(10)
      Query OK, 0 rows affected (0.08 sec)
      Records: 0 Duplicates: 0 Warnings: 0

      

      mysql> alter table student change sname newsname
varchar(20);    –修改student表中sname字段的名号,变为newsname
      Query OK, 0 rows affected (0.08 sec)
      Records: 0 Duplicates: 0 Warnings: 0

 

落实用户界面

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)

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注