刘鹏(BrokenO)

Stay hungry, Stay foolish


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 站点地图

Activity的生命周期

发表于 2020-04-19 | 分类于 Android

借用神图一张

image.png

生命周期职责

1.attach :严格意义上来说attach算不上是activity生命周期的一部分。当activity被反射创建之后,会调用该方法对activity进行初始化,此时会做下面几个主要的工作:

  • 创建PhoneWindow对象
  • 为PhoneWindow设置WindowManager
  • 初始化Fragment控制器

2.onCreate :主要用于控件的设置与初始化,最主要的是viewTree的构建,功能如下:

  • 通过setContentView解析布局文件,从而构建ViewTree,并对其进行初始化
  • 该方法在activity整个生命周期中只会调用一次
  • 如果当前的activity是由于内存不足等原因被异常结束再回复,则该函数中的参数将不会为空。

3.onStart:此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。如果当前activity是回收后被恢复,则在改方法或会执行onReatoreInstanceState方法

4.onResume:当此方法回调时,则说明Activity已在前台可见,可与用户交互了,onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是处于后台无法与用户交互,而onResume则已显示在前台,可与用户交互。此方法主要的工作:

  • 则获取attach中的PhoneWindow,将window添加到WindowManagerService中去
  • 通过viewRootImp的添加开始DecorView的三大流程

5.onPause:

Activity的启动模式(Launch Mode)

发表于 2020-04-19 | 分类于 Android

Activity启动模式种类:

image.png

image.png

activity可以添加taskAffinity选项,用来指定当前activity存放的任务栈,默认情况下该选项是当前应用的包名,此选项只有在singleTask模式下才有效果。如果当前存在一个Task栈,且其taskAffinity与当前activity不同,则系统会生成另一个Task栈用来存放当前的activity

Standard 常规模式(系统默认)

这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。

SingleTop(栈顶复用)

1.当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法

2.当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例

3.当前栈中不存在该Activity的实例时,其行为同standard启动模式

SingleTask(栈内复用 taskAffinity属性对其有影响)

singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈

1.如果任务栈不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去

2.如果任务栈存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例,如果不存在对应activity的实例,则创建直接添加。

3.如果任务栈存在,则得到该任务栈,如果存在当前activity的实例,则会将当前activity之上的所有的activity出栈,并调用其onNewIntent方法

4.此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。

SingleInstance(全局唯一模式)

该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activity时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

Intent的匹配规则

发表于 2020-04-19 | 分类于 Android

intent-filter的结构

image.png

Intent被用于四大组件中出ContentProvider的其余三大组件(Activity,Service,BroadcastReceiver)

知识点:

1.应用安装完成之后,系统会读取manifest.xml中的所有标签,将其一一分类保存

2.intent分为显式与隐式,显式Intent是直接指定组件的class(全路径),隐式则需要在manifest.xml文件的组件中添加intent-filter,使用时需要进行intent-filter的匹配

3.intent如果指定了组件的class,则为显式调用,即便manifest文件中配置了intent-filter,也不会再进行隐式的匹配

4.一个组件(Activity,Service,BroadcastReceiver)中可以有多个intent-filter标签

5.一个intent-filter标签中可以有多个category,多个action

匹配规则

6.如果intent中配置了category,则intent-filter中必须存在category且必须完全匹配才能验证通过

7.如果intent中没有设置category,则在匹配时系统会为intent默认添加一个android.intent.category.DEFAULT类型的category,这也就是为什么要实现隐式调用的组件必须要添加一个android.intent.category.DEFAULT的原因

8.intent-filter中可以有多个category,intent中的category只要能匹配intent-filter中的任意一个便可匹配成功

9.如果是隐式调用,则intent中必须要添加action,否则会匹配失败

10.intent-filter中可以有多个action,intent中的action只要能匹配intent-filter中任意一个action,便可以匹配成功

11.intent的data由MIME Type类型与URI组成

12.只有当intent-filter中的data标签不为空时才需要进行匹配,否则直接匹配成功。比如intent-filter中指定了mimeType则只需要匹配intent中mimeType类型

13.有一种特殊情况,如果intent-filter中指定了类型,但是intent中没有指定类型,但是却指定了URI,并且通过URI能推断出当前的类型,且推断出的类型能与intent-filter的类型匹配,此时依旧能匹配成功

结论

14.Category,action,data三个共同影响intent-filter的匹配结果,只有三项完全匹配才算匹配成功,其中任意一个匹配失败,则当前intent-filter匹配失败

15.extra是通过bundle的存储键值对,由于bundle实现了parcelable接口,所以能跨进程传输

16.Flags是能影响组件启动的各种标志位,具体的详见Activity的启动

序列化

发表于 2019-10-26 | 分类于 JAVA

大纲:

  • 序列化是什么
  • 序列化解决了什么问题
  • 序列化的具体实现
  • 序列化代理的意图与实现
  • 序列化要注意的点
  • android中使用的序列化方式
  • 序列化的使用 深克隆

定义

将对象编码成一个字节流称之为 序列化

从字节流中重新构建对象称之为 反序列化

有一种更直接的说法,序列化其实就是给写入字节流中的每一个对象 进行编号,而反序列化就是根据对象的编号找到相应对象的引用

阅读全文 »

单例模式详解

发表于 2019-03-10

单例模式

1.单例模式的设计意图是什么?它要解决一个什么问题?什么时候可以使用它?

2.它是如何解决问题的?

3.结构图是怎样的,有哪些关键代码

4.能够想到这个设计模式的两个应用实例,一个生活中,一个软件中

5.这个模式的优缺点是什么?在使用时要注意什么

阅读全文 »

面向对象程序设计原则

发表于 2019-03-10 | 分类于 JAVA , 设计模式

理解一个设计模式要掌握的要点:


1.这个设计模式的意图是什么?它要解决一个什么问题?什么时候可以使用它?

2.它是如何解决问题的?掌握它的结构图,记住关键代码

3.能够想到这个设计模式的两个应用实例,一个生活中,一个软件中

4.这个模式的优缺点是什么?在使用时要注意什么

5.多运用,多实践,多运用,多实践,多运用,多实践(重要的问题说三遍!!!)


阅读全文 »

okhttp3 的工作原理与源码分析

发表于 2019-03-08

OkHttpClient 应该被设计为一个单例,以便复用连接池与线程池,避免造成资源不必要的资源浪费

okhttp 的连接池设计

为了避免在请求同一个连接时在重新建立连接上产生的时延,Okhttp设计了socket连接 复用机制。

  1. 每次有新的请求到来时,会先去连接池中查找当前请求的连接是否已经存在。

  2. 如果连接存在(连接相同的标准是:),直接复用。

  3. 如果不存在,则重新创建一个连接,然后将连接放进连接池,在放进连接池时会通过线程池对连接池进行清理与维护,用来释放已经空闲超时的连接.

阅读全文 »

https 加密解密以及验证与签名

发表于 2019-03-08 | 分类于 HTTP , HTTPS

老规矩,https是什么?

网络之所以要分层主要是因为网络的不确定性

http是明文传输,通信不安全

https 在网络分层模型中并不是一个单独的分层

https只是在http与tcp之间添加了一个TLS或者SSL的中间件用于保证通信安全

Https的安全保证基于 对称加密,非对称加密以及验证验证与签名。

对称加密

通信双方拥有相同的密钥。发送方用密钥加密,接收方用相同的密钥解密 称之为 对称加密

1
2
3
优点:算法公开、计算量小、加密速度快、加密效率高

缺点:密钥不好传输,(https使用的是传递参数,双方通过一定的规则生成密钥)
阅读全文 »

http的思维逻辑

发表于 2019-03-07

本文的主要意义在于通过逻辑的分析与概括,弄清楚以下几个问题:

  1. http 是什么
  2. http 的作用是什么
  3. http 的主要结构是什么
  4. tcp 的工作机制与原理
  5. http在Android中的具体实现

首先我们来聊聊http是什么?

学过计算机的人都知道,http是基于C/S架构的 应用层 网络通信协议

阅读全文 »

利用github + Hexo搭建自己个人博客的踩坑过程

发表于 2019-03-07 | 分类于 Hexo

其实一直以来都有弄一个自己私人博客的想法,但一直没有付诸行动。其实前段时间也有在简书与掘金写过博客,但是总觉得那些博客弄得花里胡哨,不是自己想要的。最终决定搭建自己的博客系统是在两天前,有一个自己的安心写东西的地方,也好记录自己成长的脚印。

下面就分享一下自己通过HEXO + github搭建自己个人博客的踩坑与折腾过程(后续效果优化会持续更新)
搭建环境:windows 10

阅读全文 »

(BrokenO)

(BrokenO)

stay hungry,stay foolish

10 日志
9 分类
3 标签
RSS
© 2018 - 2020 (BrokenO)
由 Hexo 强力驱动
本站访客数:
主题 - NexT.Gemini