美文网首页
Android开发艺术探索阅读笔记(第一章)

Android开发艺术探索阅读笔记(第一章)

作者: mumuxi_ | 来源:发表于2020-11-19 23:24 被阅读0次

第一章 Activity的生命周期和启动模式

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

1.1 activity 典型情况下的生命周期分析
有用户正常参与的情况下所发生的Activity生命周期的变化

  • onCreate : 表示Activity正在被创建。
  • onRestart : 当前Activity从不可见重新变为可见状态时。
  • onStart : 边事Activity 正在被启动,此时已经可见,但是还没有出现在前台,无法与用户交互。
  • onResume : 表示Acitivity可见并且出现在前台开始活动。
  • onPause : onPause执行完,新Activity的onResume才会执行,由于这个原因,不能再onPause 方法中做耗时操作而使得新Activity尽快地显示出来并切换到前台;此时Activity仍然可见,但是无法交互。(拉起透明主题Activity,Dialog出现时就只会回到onPause ,不回调 onStop,此时activity 可见,但无法与用户进行交互)
  • onStop :表示Activity即将停止,并且不可见,可以做一些稍微重量级的工作,同样不能太耗时。
  • onDestroy : 表示Activity即将被销毁,可以做一些回收工作和最终的资源释放。
0_1314838777He6C.png

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

  • 资源相关的系统配置发生改变导致的Activity被杀死并重新创建,例如手机发生屏幕旋转。
    给Activity添加android:configchanges属性可以让Activity在屏幕旋转的时候不重新创建。
  • 资源内存不足导致低优先级的Activity被杀死,Activity优先级从高到低:
    (1)前台Activity------正在和用户交互的Activity,优先级最高。
    (2)可见但非前台Activity------比如Activity中弹出一个对话框,导致Activity科技那但是位于后台无法和用户进行交互。
    (3) 后台Activity------已经被暂停的Activity,比如执行了onStop,优先级最高。
    如果一个进程中没有四大组件在执行,那么这个进程很快被系统杀死。最好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易被系统杀死。

2. Activity 启动模式

Activity默认启动模式,多次启动同一个Activity, 系统会重复创建多个实例。因此提供启动模式,让开发选择,来解决这个问题。

2.1 Activity 的 LauncherMode
(1)Standard:标准模式,也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
(2)singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数可以取出当前请求的信息。需要注意的是这个Activity的onCreate 、onStart 不会被系统调用,因为它没有发生改变。如果新Activity的实例已存在但不是位于栈顶,那么新Activity仍然会重新创建。
(3)singleTask:栈内复用模式。这是一种单实例模式,如果Activity在一个栈中已经存在,那么多次启动此Activity都不会创建实例,也会回调onNewIntent()方法。singleTask默认具有clearTop的效果,加入任务栈的情况是ADBC ,此时Activity D 以singleTask的方式请求启动,会把Activity BC先出栈,于是最终栈内的情况是AD。
(4)singleInstance:加强的singleTask模式,除了具备singleTask模式所有特性外,具有这种模式的Activity只能单独位于一个任务栈中。

taskAffinity 属性
taskAffinity,可以翻译为任务相关性。这个参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名,当 Activity 设置了 taskAffinity 属性,那么这个 Activity 在被创建时就会运行在和 taskAffinity 名字相同的任务栈中,如果没有,则新建 taskAffinity 指定的任务栈,并将 Activity 放入该栈中。另外,taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

如何给Activity指定启动模式?有两种方法,第一种是通过清单文件为Activity指定

<activity android:name=".SecondActivity"
            android:launchMode="singleTask"/>

另一种启情况就是通过intent的标志位为Activity指定启动模式

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

这两种方式都可以为Activity指定启动模式,但是二者还是有一些区别的,首先,优先级第二种比第一种高,\color{red}{两种同时存在的时候,以第二种为准},其次,上述两种方式在限定范围内有所不同,比如,第一种方式无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方式无法指定singleInstance模式

2.2 Activity 的 Flags

Activity的Flags有很多,这里主要是分析一些常用的标记位,标记位的作用很多,有些标志位可以设置Activity的启动模式,比如FLAG_ ACTIVITY _ NEW _ TASK,还有一些直接影响Activity的运行状态,比如FLAG_ ACTIVITY_ CLEAR_ TOP,下面我们来说下一些常用的标记位,剩下的读者可以去看下官方文档,大部分的情况下,Activity不需要设置标记位,因此对于标记位理解即可,在使用标记位的时候,要注意有些标记位是系统内部使用的,应用不需要去设置这些以防出问题。

FLAG_ ACTIVITY_ NEW _ TASK

这个标志位的作用是为Activity指向‘singleTask’启动模式,其效果和XML中指定该模式相同

FLAG_ ACTIVITY_ SINGLE _ TOP

这个标志位的作用是为Activity指向‘singleTop’启动模式,其效果和XML中指定该模式相同

FLAG_ ACTIVITY_ CLEAR _ TOP

具有此标记位的Activity,当他启动时,在同一个任务栈中所有位于他上面的Activity都要出栈,这个模式一般需要和FLAG_ ACTIVITY_ NEW _ TASK配合使用,在这种情况下,被启动的Activity的实例如果已经存在,那么系统就会调用它的onNewIntent,如果被启动的Activity采用标准模式,那么他连同他之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶

FLAG_ ACTIVITY_ EXCLUDE_ FROM _ RECENTS

具有此标记位的Activity,不会出现在历史Activity的列表当中,当某种情况下我们不希望用户通过历史列表回到我们的Activity的时候就使用这个标记位了,他等同于在XML中指定Activity的属性:android:excludeFromRecents="true"

3. IntentFilter匹配规则

我们知道,启动Activity分为两种,显示调用和隐式调用,二者的区别这里就不多讲了,显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,而隐式意图则不需要明确指定调用信息,原则上一个intent不应该即是显式调用又是隐式调用,如果二者共存的话以显式调用为主,显式调用很简单,这里主要介绍隐式调用,隐式调用需要intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity,IntentFilter中的过滤信息有action,category,data,下面是一个过滤规则的实例:

       <activity
            android:name=".CodeActivity"
            android:configChanges="screenLayout"
            android:launchMode="singleTask"
            android:taskAffinity="com.liuguilin.activitysample1">
            <intent-filter>
                <action android:name="com.liuguilin.activitysample.c" />
                <action android:name="com.liuguilin.activitysample.d" />

                <category android:name="com.liuguilin.category.c" />
                <category android:name="com.liuguilin.category.d" />

                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>

为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data信息,否则匹配失败,一个过滤列表中的action,category,data可以有多个,所有的action,category,data分别构成不同类别,同一类型的信息共同约束当前类别的匹配过程,只有一个intent同时匹配action类别,category类别,data类别才算是匹配完成,只有完全匹配才能成功启动目标Activity,另外一点,一个Activity钟可以有多个intent-filter,一个intent只要能匹配一组intent-filter即可成功启动Activity。

  • 1.action的匹配规则

action是一个字符串,系统预定了一些action,同时我们也可以在应用中定义自己的action,action的匹配规则是intent中的action必须能够和过滤规则中的action匹配,这里说的匹配是指action的字符串值完全一样,一个过滤规则中的可以有多个action,那么只要intent中的action能够和过滤规则匹配成功,针对上面的过滤规则,需要注意的是,intent如果没有指定action,那么匹配失败,总结一下,action的匹配需求就是intent中的action存在且必和过滤规则一样的action,这里需要注意的是他和category匹配规则的不同,另外,action区分大小写,大小写不同的字符串匹配也会失败

  • 2.category的匹配规则

category是一个字符串,系统预定义了一些category,同时我们也可以在应用中定义自己的category。category的匹配规则和action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。换句话说,Intent如果出现了category,不管有几个category,对于每个category来说,它必须是过滤规则中已经定义的category。当然,Intent中可以没有category,如果没有category的话,按照上面的描述,这个Intent仍然可以匹配成功。这里要注意下它和action匹配过程的不同,action
是要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,而category要求Intent可以没有category,但是如果你一旦有category,不管有几个,每个都要能和过滤规则中的任何一个category相同。为了匹配前面的过滤规则中的category,我们可出下面的Intent,intent.addcategory (“com.ryg.category.c”)或者Intent.addcategory (“com rcategory.d)亦或者不设category。为什么不设置category也可以匹配呢?原因是系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以这个category就可以匹配前面的过滤规则中的第三个category。同时,为了我们的activity能够接收隐式调用,就必须在intent-filter中指定“android intent categor.DEFAULT”这个category,原因刚才已经说明了。

  • 3.data匹配规则

https://blog.csdn.net/lixpjita39/article/details/78201689

相关文章

  • 安卓艺术开发与探索第一章读书笔记

    《Android开发艺术探索》第一章笔记 最近把《Android开发艺术探索》这本书深读了一遍,看这本书,真的收获...

  • Android 开发艺术探索学习笔记(一)

    结合 官方文档 阅读《Android 开发艺术探索》时所做的学习笔记。本篇记录第一章。 Activity 生命周期...

  • Android开发艺术探索 第15章 Android性能优化 读

    正式开始前,推荐一下Android开发艺术探索的其他笔记 Android开发艺术探索 读书笔记目录下面正文开始。 ...

  • IPC笔记

    一、说明 笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android...

  • View事件体系笔记

    一、说明 笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android...

  • Activity笔记

    一、说明 笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android...

  • 常见问题和性能优化

    一、说明 笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android...

  • 常用功能

    一、说明 笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android...

  • View的工作原理笔记

    一、说明 笔记主要是《Android开发艺术探索》的阅读笔记和自己的理解,笔记中部分内容引自《Android...

  • 控件架构与自定义控件

    声明:本笔记是本人阅读徐宜生的《Android群英传》和《Android开发艺术探索》 Android控件框架 A...

网友评论

      本文标题:Android开发艺术探索阅读笔记(第一章)

      本文链接:https://www.haomeiwen.com/subject/bxyriktx.html