• Activity的生命周期& 启动模式


    1.Activity的生命周期

    生命周期这个事情,是android工程师最基础的知识,所以今天要讲的是一些不一样的东西。

    1.1 OnStart,OnResume,OnPause,OnStop 他们的区别是什么?

    OnStart & OnStop, 这一对发生的时候,页面已经显示,但是处于backgroud的状态,所以用户无法看到。

    OnResume & OnPause,发生在用户可以看到页面,也就是从后台到前台。

    OnPause->OnStop,如果下个页面是透明的,OnStop不会被呼叫。

    1.2 OnCreate  怎么区分第一次加载还是Activity重启后,再次加载?

    但activity被回收以后,会在onSaveInstance的回调里面写入bundle的值,
    所以被回收的activity,在页面重启以后,会在onCreate里面把bundle的值带回来。
    通过demo可以证实1)Activity会创建新的实例 2)局部变量需要保存才能恢复,但static的变量
    是保存在进程里面,所以不需要保存,一直存在。
    里有一个新问题,app的进程有没有被杀掉?也就是applicaiton是否也存在这种case。
    当系统的内存不足的时候,按照优先级排序,app的可能会被系统回收,然后再次启动的时候,
    系统会创建一个新application,然后启动刚才的activity,这样用户就会感觉app没有被杀掉一样,
    crash时候,有些app会重启,也是一样的道理。

    1.3 setContentView 做了那些操作

    1)AppConpantActivity的code:setConentView会由ApplicationDelegate作为代理进行管理

    然后,会在ApplicationDelegateimplV9的版本中实现setConentView的方法。这个方法有2个核心View

    subDecor & mDecorContentView, 这2个就是一般来说activity布局的外壳,或者说window里面包含的内容。

    subDecor >> titlebar+mDecortentView >> customLayout

    2)Activity,普通的activity是最早的一个实现,其实1)的applicationDeleage的方式就是参考老的实现(普通activity的方式)

    phonewindow >> mDecor>>titlebar+mContentParentView >>customlayout

    1.4 OnPause,onStop,OnDestory的资源回收的动作,有什么注意的地方?

    OnPause 执行后,B页面的OnCreate->OnStart->OnResume才会被执行,然后是A页面的OnStop

    所以这里在OnPause里面执行了很多耗时的操作是为导致下个页面加载时间过长。

    OnPause:停止动画,sersor等消耗CPU资源的操作。释放camera是合适的地方,应为下个页面可能也会使用这个设备。(同理其他设备类的资源也需要释放)。

    broadcastreceiver y而是一个合适的地方,释放监听。

    不能做的事情:耗时的操作比如文件读写,以及数据库的保存等。

    OnStop:执行一些保存的动作等,比如数据库的操作

    OnDestory:最终的资源,内存的释放。主要处理会发生内存泄露的地方。but,这个方法在activity直接被系统kill的时候不会回调。

    2.Activity的launchmode & Flags

    2.1 基本知识

    4大启动模式,也是最基本的知识,。

    只有activity可以启动其他的

    application 启动activity,由于没有历史栈,需要加flag:FLAG_ACTIVITY_NEW_TASK

    这样这个activity会存在一个新task

    FLAG_ACTIVITY_NEW_TASK:这个标志同singtask launchmode的效果一样。

    FLAG_ACTIVITY_SINGLE_TOP:这个标志同singletop 效果一样。

    FLAG_ACTIVITY_CLEAR_TOP: 会把在task 栈上面的activity,出栈。

    2.2 为什么有2种启动模式?

    2种启动模式是相互弥补的形式。LaunchmodesingleInstance是在manifiest里面定义特有的属性,flag无法做到。

    Falg的作用,就是在目标activity launchmode不明确的情况下(比如隐式启动),我可以给目标Activity一个明确的启动方式,从而控制外部activity的行为。

    2.3这2种启动模式各有什么优缺点

    Launchmode:固定,结果明确,缺少灵活

    Flags:控制非本APPActivity行为,不好控制

    2.4 优先级那个高

    Flags优先级高,原因还是start到其他appactivity的时候,我怎么规范这个非本appactivity的行为。或者说flag是通过一种可控的方式,去开启其他app的activity

    2.5 startActivities的作用和使用方式

    同单个activity行为类似。Intent[3] = {A,B,C}假设是这3个页面的intent

    最终的结果是,会启动Cactivitybut A & B没有被启动。

    但是当back返回的时候,B会被onCreate,然后再返回,A会被create

    2.6 Launchmode的使用场景

    StandardAlarmClock,页面可以多次使用,每个都是独立的。

    SingleTop:书签页面,主要是书签页面可以有多个,但是在返回的时候,不应该看到多个。因为它的内容是一个,但是它也不能是singletask,这样会把browser页面清除掉。

    SingleTask:主页面,一般来说就是首页,首页不需要回到历史页面。

    SingleInstance:只有单一页面,不如闹钟起来页面。有且只允许存在一个页面

    3.intentFilter

    我们的代码,在startactivity的时候,要传intent,但是一般我们都是

    Intent(Context packageContext, Class<?> cls) 使用这个定义。这个就是我们所谓的显示调用。

    intentFilter是用于隐式调用的,显示调用&隐式调用同时存在,将以显示调用为准

    intentFilter有三个部分组成:action,category,& data

    一个activity可以有几组intentFilter,只要匹配一个,就可以启动activity

    但是必须同时瞒住action,category & data的匹配,才能保证activity被启动。

    同一个intentFilter可以有几个action,只要满足一个就可以,同理category & data也是。

    Action:action的字串,必须完全一致,才能算作匹配。

    Category:category可以有多个,但是每一个都必须同 intentFilter的某一个匹配。Category也可以为空,这样系统会默认为我们加上action.intent.category.DEFAULT 这样就要求每个支持隐式调用的activity,都必须有action.intent.category.DEFAULT

    Data:data的匹配规则跟action相似。只要匹配一个元素,但是必须使用setdataandType 方法来设定。Setdata & setType这2个方法是互斥的。

    当我们在使用隐式启动activity的时候,可以先使用PackageManager的resolveActivity 或者Intent的resolveActivity,在查询的时候,需要加flag:MATCH_DEFAULT_ONLY

    还有一个特殊的页面:action = android.intent.action.MAIN  category=android.intent.category.LAUNCH缺一不可

    1.显示匹配

    两种方式,简单来说就是

    setClassName(@NonNull Context packageContext,@NonNull String className)

    setClassName(@NonNull String packageName, @NonNull String className)

    2个方法其实本质上是一个方法,第一个方法的参数content可以getpackage,所以本质上还是packagename+classname的方式唯一定位activity的注册位置。

    这个就是显示调用。

    显示调用 > 隐式调用

    2. 隐式调用

    既然有显示调用,对应隐式调用。使用场景:

    Case 1:比如UC浏览器,一般手机厂商都会有默认的浏览器,但是我怎么让用户在点击链接的时候可以选择UC浏览器。这个时候就是intentfilter匹配的时候。

    同样这个场景,一个用户装了QQ浏览器,百度浏览器等等,需要让用户自己选择使用那个浏览器。

    Case 2:用户需要打开camerabutcamera的应用一般厂商都会做定制,所以activity的名字根本不确定,但是打开camera的服务,一般应用只需要唤起camera activity就可以,这个适合通过action+category的方式更适合。

    Intent6大属性,ComponentActionDataCategory,Extras,Flags

    Component:用于显示调用,上节已经说明了

    Extras,用于传递参数

    Flags,定义启动模式,之前章节也已经讲述。

    ActionDataCategory就是我们要讲的IntentFilter

    Action:

    Action

    描述

    备注

    ACTION_MAIN

    launcher使用,一般app不应该有这个action

    TV盒子,沙发桌面

    ACTION_VIEW

    最常用的action,一般activity使用这个,传递data

    ACTION_EDIT

    显示可编辑的数据

    ACTION_PICK

    选择数据

    ACTION_CHOOSER

    显示一个Activity选择器

    ACTION_DIAL

    显示拨号界面(号码放在data里面)

    ACITON_CALL

    直接打电话

    ACTION_SEND

    直接发短信

    ACTION_SEARCH

    搜索本地

    ACTION_WEB_SEARCH

    Web搜索

    上面是基本的Action的内容,基本aciton是和data一起使用

    Data:一般数据类型是2种,Uri & mimetype,这2个要同时设置需要调用

    注意:若要同时设置 URI MIME 类型,请勿调用 setData() setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI MIME 类型。

    Uri一般表示数据,尤其表示数据库地址,这个最合适

    Mime-typeContent-Type: text/HTML

    Uri MIME Type 和套路都是从浏览器的概念里面来的。Why

    Google是搞搜索起家的,所以它骨子里就是要搞web,浏览器等东西,或者说概念才是最符合它的思维方式。

    Category:是附件信息,所以一般的类型不需要这个东西(默认defaultandroid.intent.category.DEFAULT

  • 相关阅读:
    Laravel 初始化
    ant design pro 左上角 logo 修改
    请求到服务端后是怎么处理的
    Websocket 知识点
    王道数据结构 (7) KMP 算法
    王道数据结构 (6) 简单的模式匹配算法
    王道数据结构 (4) 单链表 删除节点
    王道数据结构 (3) 单链表 插入节点
    王道数据结构 (2) 单链表 尾插法
    王道数据结构 (1) 单链表 头插法
  • 原文地址:https://www.cnblogs.com/deman/p/8505407.html
Copyright © 2020-2023  润新知