huazi

huazi

《Android开发艺术探索》笔记-第1章

1. Activity 生命周期的全面分析#

正常生命周期

  • onCreate: 表示 Activity 正在被创建
  • onReStart: 表示 Activity 正在被重新启动。一般情况,当前 Activity 动不可见变成可见状态时,onReStart 就会被调用。当前 Activity 执行 onPause 和 onStop 暂停后,又回到了这个 Activity 后就会调用这个方法。
  • onStart: 表示 Activity 正在被启动,这是 Activity 已经可见了,但是还没有出现在前台,还无法交互。可以理解为 Activity 已经显示出来,但是还看不到。
  • onResume: 表示 Activity 已经可见了,并且出现在前台开始活动。onStart 和 onResume 都表示可见,但是 onStart 的时候 Activity 还在后台,onResume 的时候 Activity 显示在前台
  • onPause: 表示 Activity 正在停止。此时可以做一些存储数据,停止动画的操作,但是不能太耗时,因为这会影响 Activity 的显示,oPause 必须先执行完,新的 Activity 的 onResume 才会执行。
  • onStop: 表示 Activity 即将停止,可以做一些重量级的回收操作,同样不能太耗时
  • onDestory: 表示 Activity 即将被销毁,这是 Activity 生命周期的最后一个回调,可以做一下回收工作和资源释放

当前 Activity 打开新的 Activity 采用了透明主题,那么当前 Activity 不会回调 onStop。

onStart 和 onStop 是从是都可见角度来回调的,onResume 和 onPause 是从是否在前台的角度来回调的,初次之外,实际使用中没有太大的区别。

在新的 Activity 启动前,栈顶的 Activity 需要先 onPause 后,新的 Activity 才能启动。

onPause 和 onStop 都不能做耗时操作,尤其是 onPause,因此尽量在 onStop 中做操作。

正常情况,当系统配置发生变化后,Activity 会被销毁。Activity 在异常情况下终止时,系统会调用 onSaveInstanceState 来保存当前 Activity 的状态,回调时机是在 onStop 之前,当 Activity 被重建后,系统会调用 onRestoreInstanceState, 时序上来说在 onStart 之后。

每个 View 都有 onSaveInstanceState 和 onRestoreInstanceState 方法,看它的实现就能知道他能为 view 恢复哪些数据。

系统只会在异常终止的时候调用 onSaveInstanceState 和 onRestoreInstanceState 存储和恢复数据,其他情况不会。

2. Activity 的启动模式#

  • standard: 标准模式,每启动一个 Activity 就新建一个实例,然后入栈,默认进入启动它的 Activity 所属的任务栈
  • singleTop: 栈顶复用模式,如果新的 Activity 已经在栈顶,那么 Activity 不会被重新创建,同时调用 onNewIntent 方法
  • singleTask: 栈内复用模式,只要 Activity 在一个栈中存在,那么多次启动此 Activity 就不会重新创建实例,调用 onNewIntent 方法。如果不存在,系统会现寻找所需的任务栈,如果任务栈不存在会创建任务栈人后入栈,如果任务栈存在,会先看栈内是否有实例,有就调到栈顶,没有就创建实例入栈。
  • singleInstance: 单实例模式,跟 singleTask 类似,还加了一点就是,此种模式的 Activity 只能单独的位于一个任务栈中。由于栈内复用的特性,后续不会再创建新的 Activity。

可以通过 TaskAffinity 配置任务栈名字,默认情况任务栈名字为包名。

任务栈 A 为前台任务栈,任务栈 B 为后台,此时按返回键,任务栈 A 先出栈,然后任务栈 B 出栈,最后回到桌面。

问题:分享到第三方应用,使用什么启动方式?

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS flag 表示此 Activity 不会出现在历史的 Activity 列表中,等同于 android="true"

3. IntentFilter 的匹配规则#

启动 Activity 分为显式调用和隐式调用,显式调用需要明确指定被启动对象的信息,包括类名和包名。隐式调用则不需要。

IntentFliter 过滤信息有 action, category, data

  • action: Intent 中的 action 必须和过滤规则的中的 action 匹配,字符串完全一致,区分大小写。
  • category: startActivity 时系统会默认加上一个 android.intent.category.DEAFAULT,所以 intent 中可以不存在 category,但如果存在就必须匹配其中一个
  • data: 过滤规则中定义了 datam,那么 Intent 中必须也要定义可匹配的 data; data 由两部分组成,mimeType 和 URI,如果没有指定 URI,URI 但默认值为 content 和 file(schema)
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。