美文网首页
Android开发总结之Activity

Android开发总结之Activity

作者: WangGavin | 来源:发表于2019-01-24 10:33 被阅读17次

    1 Activity 是什么

    GUI,界面,与用户交互的可视接口。
    当然Fragment,View也是,不过我把它看作是控件,Activity是开发中最基本的容器(窗口)。

    2 Activity任务栈

    目的是便于管理Activity生命周期。
    新启动的Activity会压入栈顶,而处于栈顶的Activty处于Active活跃状态,即可以和用户做交互(可见可交互)。压在下面的Activity则处于可见不可交互,或不可见不可交互状态,并且系统可能会因为内存不足原因优先回收掉任务栈最下面的Activity,所以也有被回收状态。

    3 Activity4种形态

    • Active:Activity处于栈顶
    • Paused:可见但不可交互
    • Stopped:不可见
    • Killed: 系统回收

    4 Activity生命周期

    4.1 正常情况下:

    • onCreate():可做初始化
    • onStart():处于可见不可交互状态
    • onResume():处于可见可交互状态
    • onPause():即将处于可见不可交互状态
    • onStop():即将处于停止或被新Activity覆盖掉
    • onDestroy():即将被销毁,可做一些资源释放
    • onRestart():正在重新启动

    4.1.1 通常流程:

    • 启动一个新Activity A:
      • A.onCreate()->A.onStart()->A.onResume()
    • 当前界面A跳转到另一个新界面B:
      • A:onPause()->onStop()
      • B:onCreate()->onStart()->onResume()
    • 当前界面B返回:
      • B:onPause()->onStop()->onDestroy()
      • A:onRestart()->onResume()
    • 当前界面A弹出一对话框:
      • A:onPause()
    • 当前界面A弹出的对话框消失:
      • A:onResume()

    4.2 异常情况下:

    1.资源相关的系统配置发生改变导致Activty被杀死并重新创建
    2.资源内存不足导致低优先级的Activity被杀死

    扩展:进程优先级

    • 前台:处于前台和用户交互的activity或者和前台进程Activity绑定的Service所处的进程
    • 可见:处于可见,但不处于前台,用户不可以交互的进程
    • 服务:后台开启的Service服务
    • 后台:点击了Home,前台进程变为后台进程

    当Activity异常被回收的情况下,系统会调用onSaveIntanceState(Bundle),重新启动时会调用onRestoreInstanceState(Bundle),所以可以在Bundle做一些数据保存和恢复的工作。

    • onSaveIntanceState():保存当前状态数据
    • onRestoreInstanceState:恢复之前保存的数据

    数据恢复:onCreate()与onRestoreInstanceState()区别:

    onCreate()需要判空,onRestoreInstanceState不需要。

    5 Activity启动模式

    启动模式简单来说就是定义Activity实例与Activity任务栈的关联方式。

    目的:

    • 让某些Activity可以启动一个新的任务栈
    • 让activity复用,而不是启动一次就重新创建一个实例

    设置方式:

    • 通过Manitest文件配置,比如通过设置指定Activity的android:launchMode="standard"属性
    • Intent设置Flag标志
      • FLAG_ACTIVITY_NEW_TASK:指定为singleTask模式
      • FLAG_ACTIVITY_SINGLE_TOP:指定为singleTop模式
      • FLAG_ACTIVITY_CLEAR_TOP:标识此Activity,当它启动时,在同一个任务栈中位于它上面的Activity都要出栈
      • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:标识此Activity不会出现在历史Activity的列表中

    有哪些启动模式?

    • standard 标准模式:总会为activity创建一个新的实例,并将该实例添加到当前task栈中,这种方式不会启动新的Task栈,只是将新的 Activity添加到原有的Task栈中。
    • singleTop:栈顶复用模式,这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被回调。
    • singleTask:栈内复用模式。如果系统会寻找Activity想要的任务栈,如果没有则创建一个任务栈,然后放入实例Activity;如果任务栈存在,且已有实例,则系统会将它调到栈顶,在它之上的activity会被弹出,如果实例不存在,则和singTop一样。
    • singleInstance:单实例模式,此种模式的Activity只能单独的位于一个任务栈中

    5.1 什么是Activity所需的任务栈?

    TaskAffinity(任务相关性),这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的名字。所有我们可以通过设置TaskAffinity为每个Activity单独指定任务栈。

    6 IntentFilter的匹配规则

    启动Activity就两种,显示调用和隐式调用。

    6.1 显示调用

    即在Intent中,显示传入要跳转的组件类名。这种方式比较简单直接,但也造成了关联耦合。

    6.2 隐式调用

    这样调用方式的好处是我不必知道我的目标组件具体的名字,只要有组件满足我设置的过滤条件即可找到我想要的组件。这种方式广泛应用在模块化开发,解决了模块之间的跳转问题。

    隐式调用需要Intent能够匹配目标组件的IntentFilter中设置的过滤信息,如果不匹配将无法启动目标组件。IntentFilter中的过滤信息包括action、category、data

    • 匹配组件规则:一个组件中可以配置多个IntentFilter,只有intent匹配其中一个IntentFilter即可启动。
    • 匹配IntentFilter规则
      • action的匹配规则:action是个字符串,区分大小写。一个过滤规则中可以有多个action,只要Intent中的action设置有,且能够和过滤规则中的任何一个action相同即可匹配成功。系统已预定义了一些常见的action,需要使用系统的组件时会用到。
      • categary的匹配规则:一个intentFilter可以有多个category,但是要匹配intentFilter,那么intent可以无category,如果有则每个category都必须匹配intentFilter里的category。因为startActivity里系统会自动加上"android.intent.category.DEFAULT"这个category,所以intent可以不加category也可以匹配上intentFilter。所以如果组件要能够隐式调用,intentFilter里必须加上这个默认category。
      • data的匹配规则:data与action类似,如果过滤规则中定义了data,那么Intent中必须定义可匹配的data.

    6.2.1 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,则data中URI的scheme的默认值为file和content,所以Intent中URI的scheme也必须为file或content才能匹配到。

    类似URI的结构,就是匹配URI的。

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

    6.2.2 隐式调用判断匹配成功与否?

    使用PackageManager的两种方法判空。

    public abstract List<ResolveInfo> queryIntentActivities(Intent intent,int flags);
    public abstract ResolveInfo resolveActivity(Intent intent,int flags);
    

    第二个flag参数使用MATCH_DEFAULT_ONLY时,表示仅仅匹配那些在intent-filter中声明了android.intent.category.DEFAULT这个category的组件。

    相关文章

      网友评论

          本文标题:Android开发总结之Activity

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