Android学习笔记 - 《Android开发艺术探索》第一章

来源:互联网 发布:react native 引入js 编辑:程序博客网 时间:2024/06/05 00:40

第一章

1.1 Activity的生命周期全面分析

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

  1. onCreate:Activity生命周期第一个方法,在此方法中我们可以做一些初始化工作,如调用setContentView加载布局资源、初始化Activity所需数据等。

  2. onRestart:表示Activity正在重新启动。一般由用户行为导致(如按Home键),使当前Activity从不可见重新变为可见状态。

  3. onStart:表示Activity正在被启动,即将开始,此时Activity已经可见,但是还没有出现在前台,还无法与用户交互。可理解为Activity已经显示出来,但是我们还看不到。

  4. onResume:表示Activity已经可见,且出现在前台并开始活动。与onStart的区别在于,onStart时Activity还在后台,onResume时Activity已显示到前台。

  5. onPause:表示正在停止,正常情况下,onStop紧接着会被调用。在特殊情况下(如新Activity半透明或者Dialog形式的Activity),如果这个时候回到当前Activity,那么onResume会被调用。在onPause里可以做一些存储数据、停止动画等工作,但不能太耗时,否则会影响新Activity的显示,onPause必须执行完,新Activity的生命周期才会开始执行。

  6. onStop:表示即将停止,可做一些稍微重量级的回收工作,统一不能太耗时。

  7. onDestroy:表示即将被销毁,生命周期最后一个回调,可做一些回收工作和最终的资源释放。

注意:

1) onStart和onStop是从Activity是否可见这个角度来回调;onResume和onPause是从Activity是否位于前台这个角度来回调。

2) Activity A启动Activity B:A_onPause -> B_onCraete -> B_onStart -> B_onResume -> A_onStop

3) Back返回A:B_onPause -> A_onRestart -> A_onStart -> A_onResume -> B_onStop -> B_onDestroy

4) Home键:A_onPause -> A_onStop

5) Home键后重新开启:A_onRestart -> A_onStart -> A_onResume

1.1.2 异常情况下的生命周期

  1. 资源相关的系统配置发生改变导致Activity被杀死并重建(如屏幕旋转)

    代码测试时序:onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

    有待考证:书上说onSaveInstanceState调用时机在onStop之前,与onPause没有既定的时序关系;另外,onRestoreInstanceState调用时机在onStart之后。

    保存和恢复View层次结构:首先Activity调用onSaveInstanceState去保存数据,然后Activity委托Window去保存数据,接着Window委托Activity的顶级容器去保存数据(顶级容器是一个ViewGrou,一般很有可能是DecorView),最后顶级容器委托子元素保存数据,逐层向下。恢复过程类似。

  2. 资源内存不足导致抵优先级Activity被杀死

    Activity优先级:

    1) 前台Activity

    2) 可见非前台

    3) 后台Activity

1.2 Activity的启动模式

1.2.1 Activity的LaunchMode

  1. standard:标准模式,也是系统默认模式。每次启动一个Activity都会重新创建一个新的实例并放入启动者所处的任务栈中。一个任务栈可以有多个实例,每个实例也可以属于不同的任务栈。

    注意:当使用ApplicationContext去启动standard模式的Activity报错,因为standart模式的Activity默认会进入启动它的Activity所属的任务栈中,由于非Activity类型的Context并没有所谓的任务栈,因而出错。

    解决方法:为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK,这样启动时便会为他创建一个新的任务栈。此时待启动Activity实际上是以singleTask模式启动。

  2. singleTop:栈顶复用模式。如果新Activity已位于任务栈的栈顶,那么不会重新创建,同时onNewIntent方法会被回调。若新Activity已存在但不是位于栈顶,则仍会重新创建。

  3. singleTask:栈内复用模式。这是一种单实例模式,只要Activity在启动者所处栈中存在,那么都不会重新创建实例,和singleTop一样,会回调onNewIntent方法。

    注意:此模式默认具有clearTop效果,即启动Activity时,若Activity已存在启动者所处栈中且非位于栈顶,则系统会将Activity上的所有Activity出栈。

  4. singleInstance:单实例模式。加强的singleTask模式。具有此模式的Activity只能单独地位于一个任务栈中。

如何给Activity指定启动模式

1) AndroidMenifest

`android:launchMode="sngleTask"`

2) Intent

    Intent intent = new Intent();    intent.setClass(MainActivity.this, SecondActivity.class);    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    startActivity(intent);

注意:

1) 第二种优先级高于第一种,当两者共存时,以第二种为准;2) 第一种无法设定FLAT_ACTIVITY_CLEAR_TOP标识,第二种无法指定singleInstance模式。

使用命令 adb shell dumpsys activity查看Activity任务栈。

1.2.2 Activity中的Flags

  1. FLAG_ACTIVITY_NEW_TASK:singleTask模式

  2. FLAG_ACTIVITY_SINGLE_TOP:singleTop模式

  3. FLAG_ACTIVITY_CLEAR_TOP:若被启动的Activity采用standard模式,那么它连同它上面的Activity都要出栈,然后系统再创建新的Activity实例并入栈。

  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有该标志的Activity不会出现在历史Activity的列表中。等同于XML中指定:android:excludeFromRecents=”true”.

1.3 IntentFilter的匹配规则

启动Activity的两种方式:

1)显示调用:需指定包名和类名2)隐式调用:需匹配目标组件的IntentFilter所设置的过滤信息,如action、category、data.

匹配规则

  1. action的匹配规则:要求Intent中的action存在且必须和过滤规则中的其中一个action相同。

    可在Intent中使用多个action,只要其中一个存在于过滤规则中,便能匹配成功。

  2. category的匹配规则:要求Intent中的category都必须是过滤规则中已经定义的。

    可在Intent中使用多个category,但每一个都要存在于过滤规则中,才能匹配成功。

  3. data的匹配规则:与action类似,要求Intent中data能够完全匹配过滤规则中的某一data。

0 0
原创粉丝点击