1. 典型情况下生命周期分析

  • (1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart方法就会被调用。

  • (2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause -> onStop,但是如果新Activity采用了透明主题,那么onStop方法不会被回调。当用户再次回到原来的Activity时,回调如下:onRestart -> onStart -> onResume。

  • (3)onStart和onStop对应,它们是从Activity是否可见这个角度来回调的;onPause和onResume方法对应,它们是从Activity是否位于前台这个角度来回调的。

  • (4)从Activity A进入到Activity B,回调顺序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在onPause方法中做重量级的操作。

2. 异常情况下生命周期分析

  • (1)onSaveInstanceState方法只会出现在Activity被异常终止的情况下,它的调用时机是在onStop之前,它和onPause方法没有既定的时序关系,可能在它之前,也可能在它之后。当Activity被重新创建的时候,onRestoreInstanceState会被回调,它的调用时机是onStart之后。

    系统只会在Activity即将被销毁并且有机会重新显示的情况下才会去调用onSaveInstanceState方法。

    当Activity在异常情况下需要重新创建时,系统会默认为我们保存当前Activity的视图结构,并且在Activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、listview滚动的位置等,这些view相关的状态系统都会默认为我们恢复。具体针对某一个view系统能为我们恢复哪些数据可以查看view的源码中的onSaveInstanceState和onRestoreInstanceState方法。

  • (2)Activity按优先级的分类

    前台Activity;可见但非前台Activity;后台Activity

  • (3)android:configChanges="xxx"属性,常用的主要有下面三个选项:

    local:设备的本地位置发生了变化,一般指切换了系统语言;

    keyboardHidden:键盘的可访问性发生了变化,比如用户调出了键盘;

    orientation:屏幕方向发生了变化,比如旋转了手机屏幕。

    配置了android:configChanges="xxx"属性之后,Activity就不会在对应变化发生时重新创建,而是调用Activity的onConfigurationChanged方法。

1.2 Activity的启动模式

1.2.1 启动模式

  • (1)当任务栈中没有任何Activity的时候,系统就会回收这个任务栈。

  • (2)从非Activity类型的Context(例如ApplicationContext、Service等)中以standard模式启动新的Activity是不行的,因为这类context并没有任务栈,所以需要为待启动Activity指定FLAG_ACTIVITY_NEW_TASK标志位。

  • (3)任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。

  • (4)参数TaskAffinity用来指定Activity所需要的任务栈,意为任务相关性。默认情况下,所有Activity所需的任务栈的名字为应用的包名。TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义。

    当TaskAffinity和singleTask启动模式配对使用的时候,它是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中;

    当TaskAffinity和allowTaskReparenting结合的时候,当一个应用A启动了应用B的某个Activity C后,如果Activity C的allowTaskReparenting属性设置为true的话,那么当应用B被启动后,系统会发现Activity C所需的任务栈存在了,就将Activity C从A的任务栈中转移到B的任务栈中。

  • (5)singleTask模式的具体分析:当一个具有singleTask启动模式的Activity请求启动之后,系统首先会寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建Activity的实例把它放到栈中;如果存在Activity所需的任务栈,这时候要看栈中是否有Activity实例存在,如果有,那么系统就会把该Activity实例调到栈顶,并调用它的onNewIntent方法(它之上的Activity会被迫出栈,所以singleTask模式具有FLAG_ACTIVITY_CLEAR_TOP效果);如果Activity实例不存在,那么就创建Activity实例并把它压入栈中。

  • (6)设置启动模式既可以使用xml属性android:launchMode,也可以使用代码intent.addFlags()。区别在于限定范围不同,前者无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,而后者无法为Activity指定singleInstance模式。

1.3 IntentFilter的匹配规则

  • (1)IntentFilter中的过滤信息有action、category、data,为了匹配过滤列表,需要同时匹配过滤列表中的action、category、data信息,否则匹配失败。一个过滤列表中的action、category、data可以有多个,所有的action、category、data分别构成不同类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action类别、category类别和data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。此外,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intenf-filter即可成功启动对应的Activity。
<intent-filter>
<action android:name="com.ryg.charpter_1.c" />
<action android:name="com.ryg.charpter_1.d" /> <category android:name="com.ryg.category.c" />
<category android:name="com.ryg.category.d" />
<category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" />
</intent-filter>
  • (2)action匹配规则

    只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功,action匹配区分大小写。

  • (3)category匹配规则

    Intent中如果有category那么所有的category都必须和过滤规则中的其中一个category相同,如果没有category的话那么就是默认的category,即android.intent.category.DEFAULT,所以为了Activity能够接收隐式调用,配置多个category的时候必须加上默认的category。

  • (4)data匹配规则

    data的结构很复杂,语法大致如下:

<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />

主要由mimeType和URI组成,其中mimeType代表媒体类型,而URI的结构也复杂,大致如下:

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

例如content://com.example.project:200/folder/subfolder/etc

scheme、host、port分别表示URI的模式、主机名和端口号,其中如果scheme或者host未指定那么URI就无效。

path、pathPattern、pathPrefix都是表示路径信息,其中path表示完整的路径信息,pathPrefix表示路径的前缀信息;pathPattern表示完整的路径,但是它里面包含了通配符(*)。

data匹配规则:Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。

URI有默认的scheme!

如果过滤规则中的mimeType指定为image/或者text/等这种类型的话,那么即使过滤规则中没有指定URI,URI有默认的scheme是content和file!如果过滤规则中指定了scheme的话那就不是默认的scheme了。

//URI有默认值
<intent-filter>
<data android:mimeType="image/*"/>
...
</intent-filter>
//URI默认值被覆盖
<intent-filter>
<data android:mimeType="image/*" android:scheme="http" .../>
...
</intent-filter>

如果要为Intent指定完整的data,必须要调用setDataAndType方法!

不能先调用setData然后调用setType,因为这两个方法会彼此清除对方的值。

intent.setDataAndType(Uri.parse("file://abc"), "image/png");

data的下面两种写法作用是一样的:

<intent-filter>
<data android:scheme="file" android:host="www.github.com"/>
</intent-filter> <intent-filter>
<data android:scheme="file"/>
<data android:host="www.github.com"/>
</intent-filter>

如何判断是否有Activity能够匹配我们的隐式Intent?

(1)PackageManager的resolveActivity方法或者Intent的resolveActivity方法:如果找不到就会返回null

(2)PackageManager的queryIntentActivities方法:它返回所有成功匹配的Activity信息

针对Service和BroadcastReceiver等组件,PackageManager同样提供了类似的方法去获取成功匹配的组件信息,例如queryIntentServices、queryBroadcastReceivers等方法

有一类action和category比较重要,它们在一起用来标明这是一个入口Activity,并且会出现在系统的应用列表中。

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

[Android]《Android艺术开发探索》第一章读书笔记的更多相关文章

  1. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  2. Android深度探索--HAL与驱动开发----第四章读书笔记

    1. 下载.编译.测试源代码 创建存放下载文件的目录(repo) 下载repo脚本文件 创建用于存放源代码的目录 开始下载源代码. 2. 源代码目录含义摘要 Abi 应用程序二进制接口 Device ...

  3. 20135320赵瀚青LINUX第一章读书笔记

    第一章-Linux内核简介 Unix的历史 依旧被认为是最强大和最优秀的系统 由一个失败的操作系统Multics中产生 被移植到PDP-11型机中 由其他组织进一步开发 重写了虚拟内存系统,最终官方版 ...

  4. 《Ansible自动化运维:技术与佳实践》第一章读书笔记

    Ansible 架构及特点 第一章主要讲的是 Ansible 架构及特点,主要包含以下内容: Ansible 软件 Ansible 架构模式 Ansible 特性 Ansible 软件 Ansible ...

  5. 《从Paxos到Zookeeper:分布式一致性原理与实践》第一章读书笔记

    第一章主要介绍了计算机系统从集中式向分布式系统演变过程中面临的挑战,并简要介绍了ACID.CAP和BASE等经典分布式理论,主要包含以下内容: 集中式的特点 分布式的特点 分布式环境的各种问题 ACI ...

  6. Android深度探索--HAL与驱动开发----第一章读书笔记

    1. Android的系统架构有四层,它的发展目前来说 是比较成熟的,流行于目前的市场.其架构包括四层(linux内核.C/C++代码库.Android SDK API.应用程序). 2. 驱动是直接 ...

  7. Android深度探索--HAL与驱动开发----第五章读书笔记

    第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...

  8. Android深度探索--HAL与驱动开发----第六章读书笔记

    Linux驱动程序与其他类型的Linux程序一样拥有自己的规则,下面给出一个编写基本的Linux驱动的一般步骤: (1)建立Linux驱动的骨架(装载和卸载Linux驱动): (2)注册和注销设备文件 ...

  9. Android深度探索--HAL与驱动开发----第三章读书笔记

    1. 什么是Git? Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开 ...

随机推荐

  1. [原创]Java在线编辑word文档调用PageOffice实现并发控制

    1.功能介绍 PageOffice的并发控制功能用来解决多个用户在线编辑同一篇文档可能造成的互相覆盖修改结果的技术难题. B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面 ...

  2. EmbarassedBirds全体开发人员落泪

    Github (李昆乘,赖展飞) 现阶段还在开发后期,API调试过程中. 本周无法上线. 全体开发人员留下眼泪. 贴上几个功能图, 给大家尝尝鲜吧! 现阶段仍在API调试 因为队员李昆乘经常出去玩没有 ...

  3. labview初步理解

    1.labview是NI公司开发的一款以图形方式开发程序(G语言)的程序开发环境软件.它的作用与VS一样,是一种程序开发环境.只是vs是以文本语言开发环境而已. 2.labview最广泛应用于开发测试 ...

  4. hdu-5780 gcd(数学)

    题目链接: gcd Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others) Pro ...

  5. dd备份文件系统

    1.实现dd的备份: 使用gzip压缩: dd if=/dev/hdb | gzip > /local/path/image.gz 说明:/dev/hdb 是硬盘整盘.对不同的硬盘,可能是 /d ...

  6. final修饰变量

    final修饰基本类型变量 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变 final修饰引用类型变量 当使用final修饰引用类型变量时,它保存的仅仅是一 ...

  7. express使用https

    目录 申请免费ssl证书 修改express的./bin/www 申请免费ssl证书 直接去阿里云申请一个免费的ssl,选择neginx下载证书就可以了,解压得到一个xxx.key.xxx.crt文件 ...

  8. POJ2253(djkstra求最长最短边)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32257   Accepted: 10396 Descrip ...

  9. Selenium实战脚本集—新浪微博发送QQ每日焦点

    Selenium实战脚本集-新浪微博发送QQ每日焦点 http://www.spasvo.com/ceshi/open/kygncsgj/Selenium/201549150822.html 背景 很 ...

  10. 《Java多线程编程核心技术》读后感(十三)

    类InheritableThreadLocal的使用 使用类InheritableThreadLocal可以在子线程中取得父线程继承下来的值 值继承 package Third; import jav ...