Android 学习笔记--Activity

Author Avatar
ChihoPang 1月 13, 2018
  • 在其它设备中阅读本文章

主要知识点有:清单声明、生命周期、启动流程、启动模式和 IntentFilter 的匹配规则,已在思维导图中提供总览。

参考资料

《Android 开发艺术探索》第一章
官方文档

思维导图

img

在清单文件中声明 Activity

定义

在 < application > 元素中添加 < activity > 标签,标签内可包含 < intent-filter > 和 < meta-data > 标签。

标签属性

< activity > 标签属性

Intent 过滤器(intent-filter)

内含 < action >、< category >、< data > 子标签,匹配规则见第五节。

使用应用选择器

隐式启动时,若目标 Activity 存在多种可能性(如浏览器),推荐使用应用选择器的方式打开。
Intent chooser = Intent.createChooser(sendIntent, title);

android:configChanges属性

指定的系统配置变化后,Activity 不重建。常用的有 locale、orientation、keyboardHidden 三个选项。

生命周期

img

Activity 的整个生命周期

onCreate() -> onDestroy() 。您的 Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。

Activity 的可见生命周期

onStart() -> onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。

Activity 的前台生命周期

onResume() -> onPause() 。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

保存 Activity 状态

重写 onSaveInstanceState() 方法可以将需要保存的数据存放在 bundle 中,并且将 bundle 传递给 onCreate() 或 onRestoreInstanceState()。
因为 onSaveInstanceState() 非生命周期,不一定调用,故应该在 onPause() 中存储数据,但不能耗时,否则会影响新 activity 的显示。

特殊情况跳转

  • 第一次启动:onCreate() -> onStart() -> onResume()
  • 打开新 Activity 或切换到桌面:onPause() -> onStop()
  • 回到原 Activity:onRestart() -> onStart() -> onResume()
  • 按 back 回退时:onPause() -> onStop() -> onDestroy()

Activity 的启动流程

尚在研究中,先 mark 一下。
Android源码分析-Activity的启动过程 - 任玉刚 - CSDN博客
Activity启动流程简直丧心病狂!

Activity 的启动模式

相关属性:< activity android:launchMode=“…” />

standard

标准模式(默认)。
每次启动都会重建一个新的实例。该模式标记的 Activity 不能用非 Activity 类型的 Context (如 ApplicationContext)启动,因为此类 context 没有任务栈,启动的 Activity 不能进入启动它的任务栈中。

singleTop

栈顶复用模式。
如果栈顶为目标 Activity 实例,则不会重新创建,同时回调 onNewIntent(),但不会调用 onCreate()、onStart()。
栈内不存在或者栈内实例不在栈顶时,则重新创建实例。

singleTask

栈内复用模式。
单实例模式,如果启动 context 没有任务栈,则新建一个任务栈。
如果 Activity 已经位于栈内,则不会重新创建,而是将其实例顶部其他 Activity 弹出,同时回调 onNewIntent(),但不会调用 onCreate()、onStart()。
栈内不存在时,则重新创建实例。

singleInstance

单实例模式。
独立拥有一个任务栈,如果已经存在实例,则会把后台任务栈切换到前台(包括后台任务栈中其他的 activity)。

任务相关性 TaskAffinity

相关属性:< activity android:taskAffinity=“…” />
指定 Activity 的所需要的任务栈名,不能和包名相同,主要和 singleTask 或 allowTaskReparenting 配对使用。

IntentFilter 匹配规则

过滤信息

action、category、data

intent-filter匹配规则

一个 activity 可以含有多组 intent-filter,一个 Intent 只要能同时匹配任何一组 intent-filter 的全部信息,则匹配成功。

Action 匹配规则

一个 intent-filter 中可有多个 action,只要能匹配 intent-filter 中任意一个,则匹配成功。若 Intent 未指定 action,则匹配失败。

Category 匹配规则

Intent 未指定 category 时,直接匹配成功。
Intent 指定了一或多个 category 时,所有 category 都必须与 intent-filter 的 category 同时匹配,才匹配成功。

Data 匹配规则

data 结构:mimeType(媒体类型) + URI
URI 结构:< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPattern>]
一个 intent-filter 中可有多个 data,只要能匹配 intent-filter 中任意一个,则匹配成功。若 Intent 未指定 data,则匹配失败。