0
点赞
收藏
分享

微信扫一扫

《艺术探索》读书笔记(更新中),阿里程序员的Android之路

zibianqu 2022-01-22 阅读 70

最近没有写什么新博文,

一是太忙了,而且马上有新的挑战来到。

二是赶上过年期间。

三是没有什么太好的题材写。

四是自己在充电在半闭关学习。

计划下篇博文本月更新吧,题材从下列中出一个 Retrofit 、组件化、自定义View

最近重读《艺术探索》,将其中一些对我有用的、我仍然不知道的、或者觉得容易混淆的知识点整理出来。

部分也有可能是我自己总结整理出来的经验,一并放在里面。

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


1.1 生命周期,Activity从 不可见变成可见,onRestart()会重新调用(按Home,从别的Activity返回)

1.2 但onPause()方法回调后,才会执行新Activity的onCreate()

1.3 关于onSaveInstanceState()

back返回时不调用。

Home时会被调用。

启动一个新的Activity时 会被调用。

并不是和onRestoreInstanceState()成对出现。

出现在 onStop()前面.

(书上说和onPause()没有关系,可能在前可能在后。)

该方法只有在Activity 即将可能被销毁,并且有机会重新的创建显示才会调用。

按Home、启动新Activity,这个Activity都是后台Activity了,可能被销毁,但是销毁后,还是有机会重新创建的,所以会回调。

而正常的back,不会会重新创建了,所以不回调。

1.4 关于onRestoreInstanceState()

出现在onStart()后面。

1.5 关于上述两个方法

系统已经在这两个方法中,onRestoreInstanceState() onSaveInstanceState().为我们做了一定的恢复工作,例如ListView的滚动位置,EditText的输入数据。

针对每一个View,系统能为我们自动恢复哪些数据,可以查看View的源码,也有onRestoreInstanceState() onSaveInstanceState()方法。

关于保存和恢复,是一个典型的委托思想,工作流程如下:

Activity被意外终止时:

  1. Activity会调用onSaveInstanceState()保存数据

  2. 然后Activity会委托Window去保存数据

  3. Window猥琐它的顶级容器去保存数据,顶层容器是一个ViewGroup,一般是DecorView.

  4. 顶层容器一一通知子View来保存数据。

onSaveInstanceState()利用Bundle保存一些数据后,我们可以选择在onCreate()或者onRestoreInstanceState() 中接收这些数据。二者的区别是:

  1. onRestoreInstanceState()一旦被调用,Bundle一定是有值的。

  2. onCreate()里要对Bundle判空。

官方建议是前者。

1.6 singleTop、singleTask、singleInstance

生命周期,onPause()->onNewIntent()->onResume()

1.7 singleTask 默认具有 cleaerTop的效果

1.8 singleInstance 只能单独的位于一个任务栈中。

1.9 TaskAffinity

这个参数标识了一个Activity所需要的任务栈的名字

默认情况下,所有Activity所需的任务栈的名字是 应用的包名

形式为aaa.bbb.ccc 。

TaskAffinity主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

1.10 IntentFilter的匹配规则(隐式调用)

IntentFilter中有actioncategorydata

一个Activity可以有多个IntentFilter

一个Intent只要能匹配一组IntentFilter即可。

但是一个Intent必须同时匹配组内IntentFilter内的actioncategorydata

1.11 action的匹配规则

action是一个字符串

一个IntentFilter可以有多个actoin只要Intent中的action能够和IntentFilter中的任何一个action相同,即可匹配成功

如果Intent没有action,匹配失败

总结:Intentaction存在,且和IntentFilter一个action相同

1.12 category的匹配规则

category 是一个字符串

action不同。Intent如果含有category,则所有category必须和IntentFilter中的一个category匹配

如果Intent没有category,也能匹配成功

原因是系统在调用startActivity或者startActivityForResult时,默认会为Intent加上"android.intent.category.DEFAULT"category

所以我们的Activity若想支持隐式调用,则必须要加上这个category

1.13 data 的匹配规则

action类似。如果IntentFilter中定义了data,那么Intent必须也要有匹配data

data结构:

<data android:scheme=“string”

android:host=“string”

android:port=“string”

android:path=“string”

andorid:pathPattern=“string”

android:pathPrefix=“string”

android:mimeType=“string” />

data两部分组成:mimeTypeURI

如果IntentFilter中没有指定URIURI默认值contentfile

所以Intent中的URI部分的scheme必须为content或者file才行。

比如 :

intent.setDataAndType(Uri.parse(“file://abc”),“image/png”);

同时设置mimeTypeURI必须用setDataAndType 方法。

1.14 匹配时 建议先判断intent是否有Activity能匹配

可以通过PackageMangerresolveActivity 方法 或者 IntentresolveActivity方法判断,找不到会返回null。

这两个方法,第一个参数是int![](https://www.hualigs.cn/image/61dba891ed8ee.jpg) ent,第二参数我们要使用intflag值,为MATCH_DEFAULT_ONLY.

PackageManger还有一个queryIntentActivities方法,它返回一个List<ResolveInfo>.

第四章 View的工作原理


第一时间获取View的宽高:

  1. Activity/View#onWindowFocusChanged();

  2. view.post(Runnable)

  3. ViewTreeObserver

  4. 手动view.measure().

自定义View注意事项:

  1. 让View支持wrap_content

  2. View支持padding。ViewGroup支持padding和子View的margin.(View在onDraw中处理。ViewGroup需要在onMeasure()和onLayout()中处理)

  3. View内部可以使用post…方法替代handler.

  4. 如果有线程、动画等,需要停止,防止内存泄漏。需要使用onDetachedFromWindow()

  5. 嵌套滑动

第9章 四大组件的工作过程


四大组件除了广播,其他三种都必须在AndroidManifest里注册。 对于BroadcastReceiver 可以在AndroidManifest里静态注册,也可以在代码中动态注册。

调用时,ContentProvier借助Uri,其他借助Intent。

IApplicationThread 这个Binder接口的实现类完成了和Activity、Service启动、停止相关的功能。

Activity

启动Activity:

举报

相关推荐

0 条评论