《Android开发艺术探索》笔记(一)——Activity的生命周期和启动模式

《Android开发艺术探索》笔记(一)——Activity的生命周期和启动模式

作者:cmad 时间:2016-05-10 分类:Android 评论:2 条 浏览:1542

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

1. 导致Activity重建的配置项
  • orientation 屏幕方向方向改变;

  • locale语言切换;

  • keyboardHidden键盘的显示隐藏;

  • screenSize当编译项的minSdkVersiontargetSdkVersion版本大于13的时候会导致运行时Activity重建;

2. Activity的启动模式LaunchMode
  • standard 标准模式,默认启动模式。在启动的Activity栈中创建新的Activity实例;所以使用applicationContext启动Activity需要设置FLAG_ACTIVITY_NEW_TASK因为applicationContext没有Activity栈,实际相当于Activity的启动模式为singleTask

  • singleTop 栈顶复用模式。 如果启动的Activity位于栈顶则不重新创建Activity实例(此时Activity的onCreateonStart不会被调用),否则重新创建Activity实例并加入Activity栈中。

  • singleTask 栈内复用模式。当栈内已有该Activity的实例则不重新创建实例而是将栈中的Activity实例切换到栈顶同时将栈中该Activity上面的实例全部出栈。

  • singleInstance 单例模式。singleTask的加强版,也具有栈内复用的特性,但是它是创建一个新的单独的任务栈然后将Activity放入这个任务栈,并且该任务栈中只能存在该Activity实例。后续的启动该Activity的请求都不会重新创建而是启动该任务栈的Activity实例,除非该任务栈被销毁。

TaskAffinity 标识任务栈的名字,可以在manifest的Activity节点配置android:taskAffinity:"com.xx.xx"。当Activity启动时默认加入以当前应用包名为栈名的任务栈,如果设置taskAffinity则创建新的任务栈。

注:如果Activity启动模式为standard时该Activity实例加入启动它的任务栈,而不是加入默认包名的任务栈或者自定义TaskAffinity的任务栈。

adb shell dunpsys activity 查看Activity任务栈情况

2.2 Activity的Flags
  • FLAG_ACTIVITY_NEW_TASK 为Activity指定singleTask启动模式

  • FLAG_ACTIVITY_SINGLE_TOP 为Activity指定singleTop启动模式

  • FLAG_ACTIVITY_CLEAR_TOP具有此标记的Activity启动时在同一栈中位于它上面的Activity都将被出栈。一般配合singleTask一起使用,如果是standard模式的话会将栈中连同它和它上面的Activity都被出栈然后创建新的Activity实例入栈。

  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS具有此标记的Activity不会出现在历史Activity列表中。等同于在xml中设置android:excludeFromRecents="true"

注:设置Activity的Flags的优先级别比在xml设置launchMode的优先级别高

3. IntentFilter的匹配规则

当Activity隐式启动的时候需要intent匹配目标组件的IntentFilter中的action、category、data信息。

  • action的匹配规则:

    action是一个字符串。intent可以包含多个action,当其中任何一个可以和IntentFilter中的其中一个action相同则匹配通过。intent中必须至少包含一个action,且action的值区分大小写。
     

  • category的匹配规则

    category是一个字符串。intent可以不包含或者包含一个或多个category,intent中每个category都必须和IntentFilter中的其中一个category相同才能匹配。启动Activity时intent默认会加入android.intent.category.DEFAULT的category,所以隐式调用时必须在IntentFilter中加入android.intent.category.DEFAULT否则匹配不上。
     

  • data的匹配规则

    data的语法如下:


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

    data由两部分组成,mimeType和URI。mimeType指媒体类型,如image/jpeg audio/mpeg4-genericvideo/*等,而URI结构如下:

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

    例:

    content://com.example.project:200/folder/subfolder/etc
    http://www.baidu.com:80/search/info

    Scheme URI模式,比如http、file、content等,如果URI中没有scheme则其他参数无效

    Host URI的主机名,比如www.Google.com,如果host未指定则其他参数无效

    PortURI中的端口号,比如80,仅当URI中指定了scheme和host时改参数才有意义

    Path PathPatternPathPrefix这三个参数表述路径信息,其中path表示完整路径信息;pathPattern也表示完整路径信息,但是它里面可以包含通配符“*”;pathPrefix表示路径前缀信息

    当data信息为如下时

    <data android:mimeType="image/*" />

    data指定了媒体类型为所有类型图片,但是上面没有URI信息,但是这种情况下URI有默认scheme值为content或file,所以intent中的URI部分的scheme必须为content或file时才能匹配,如下:

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

    如下过滤规则时:

    <data android:mimeType="video/mpeg" android:scheme="http" .../>
    <data android:mimeType="audio/mpeg" android:scheme="http" .../>

    intent示例如下:

    intent.setDataAndType(Uri.parse("http://abc"), "video/mpeg");
    或:
    intent.setDataAndType(Uri.parse("http://abc"), "audio/mpeg");

    在隐式启动Activity时可以调用PackageManager的resolveActivity方法或者Intent的resolveActivity方法判断是否匹配到对应的Activity,如果未匹配到则返回null,防止启动Activity的时出现未找到Activity的错误。


感谢@汪乐骏同学赠送的《Android开发艺术探索》一书


相关推荐
更多

  1. 骏骏 2016-5-10 17:54 #1 回复TA

    好屌啊@!!!!

    • 七彩祥云至尊宝 回复TA

      卧槽 我懵逼了

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>