Android技术知识Android开发移动开发

Android 开发艺术探索 - 读书笔记之第一章 Activi

2016-04-14  本文已影响120人  Mitnick

1.1 Activity 的生命周期全面分析

1.1.1 典型情况下的生命周期分析

1.1.2 异常情况下的生命周期分析

  1. 资源相关的系统配置发生改变导致 Activity 被杀死并重启(比如横竖屏切换),这时候会在 onDestroy 前调用 onSaveInstanceState,在 onCreate 后调用 onRestoreInstanceState。要注意两点问题:
  1. 内存不足导致低优先级的 Activity 被杀死
    指定在某种情况下,系统不会重启 Activity,可以给 configChanges 属性添加值,常见的有:
项目 含义
locale 切换了系统语言
orientation 屏幕方向变化
keyboardHidden 键盘的可访问性发生了改变,比如用户调出了键盘
screenSize api 13 以上(min 和 target 大于13)屏幕方向切换不会重启,否则重启

1.2 Activity 的启动模式

1.2.1 Activity 的 LaunchMode

四种启动模式,解决了一下几个问题:

  1. 标准模式,重新创建目标 Activity,并加入启动它的 Activity 的任务栈中,所以非 Activity 类型的 Context 启动标准模式的 Activity 会报错,这时只要指定 FLAG_ACTIVITY_NEW_TASK 标记位

  2. singleTop,栈顶复用,启动栈顶的 Activity 不会重新创建,且 onNewIntent 方法会被调用

  3. singleTask,栈内复用

  1. singleInstance,单实例模式,启动时系统直接为其创建新的任务栈(无需配置 TaskAffinity),也就是永远不会重复创建该活动的实例

使用 adb shell dumpsys activity 命令查看设备的任务栈

1.2.2 启动 Activity 的 Flags(Intent 的标志位)

通过 intent.setFlags(Intent.FLAG_ACTIVITY_*) 来动态指定启动模式

标记 作用
FLAG_ACTIVITY_NEW_TASK 使用 singleTask 模式
FLAG_ACTIVITY_SINGLE_TOP 使用 singleTop 模式
FLAG_ACTIVITY_CLEAR_TOP 位于它上面的 Activity 出栈,与 singleTask 搭配使用
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 不保留此Activity 的启动历史,等效在 XML 中指定 android:excludeFromRecents="true"

1.3 IntentFilter 的匹配规则

用于 Activity 的隐式启动,例如你点击一个 http url,系统会弹出对话框要你选择使用哪一种浏览器;IntentFilter 的过滤信息有 action,category,data。

<activity android:name=".ui.MainActivity">
  <intent-filter>
      <action android:name="**" />
      <category android:name="**" />
      <data 
          android:scheme="**"
          android:host="**"
          android:port="**"
          android:path="**"
          android:pathPattern="**"
          android:pathPrefix="**"
          android:mimeType="**" />
  </intent-filter>
</activity>
  1. action 表示一个 Activity 能干什么
    比如发送,共享,打电话等等;一个 action 表示一个动作,一个 Intent 中会加入若干个 action,表示它要干什么,没有同时具备这些能力的 activity 会被过滤掉;如果一个 Intent 没有 action,那没人知道它要干什么,也就无法匹配这个 Intent。

  2. category 表示一个 Activity 是什么
    比如可以标记一个 Activity 是地图,浏览器,日历等等;一个 Intent 中不加 category,系统也会给他一个默认的 category,即 category.DEFAULT;其他情况也是与 action 类似的。

  3. data 表示一个 Activity 可以响应那些类型的资源,具体就是 URI;
    别看 data 的属性那么多,其实可以分为两个部分,mimeType 和 URI;一个 URI 的结构就是

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

若没有主动指定 URI,那么默认就是 content 和 file,即本地文件。
例如百度的 APP 会对 www.baidu.com 的链接响应,MP3
播放器会对 MP3 格式的文件响应,迅雷下载器会对特定的 URI 响应等等。

上一篇下一篇

猜你喜欢

热点阅读