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

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

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

最近没有写什么新博文,

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

二是赶上过年期间。

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

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

计划下篇博文本月更新吧,题材从下列中出一个 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被意外终止时:

    Activity会调用onSaveInstanceState()保存数据

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

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

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

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

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

    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中有action、category、data。

一个Activity可以有多个IntentFilter。

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

但是一个Intent必须同时匹配组内该IntentFilter内的action、category、data。

1.11 action的匹配规则

action是一个字符串。

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

如果Intent中没有action,匹配失败。

总结:Intent中action存在,且和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结构:

android:host=“string”

android:port=“string”

android:path=“string”

andorid:pathPattern=“string”

android:pathPrefix=“string”

android:mimeType=“string” />

data由两部分组成:mimeType和URI。

如果IntentFilter中没有指定URI,URI的默认值是content和file。

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

比如 :

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

同时设置mimeType和URI必须用setDataAndType 方法。

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

可以通过PackageManger的resolveActivity 方法 或者 Intent的resolveActivity方法判断,找不到会返回null。

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

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

第四章 View的工作原理


第一时间获取View的宽高:

    Activity/View#onWindowFocusChanged();

    view.post(Runnable)

    ViewTreeObserver

    手动view.measure().

自定义View注意事项:

    让View支持wrap_content

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

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

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

    嵌套滑动

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


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

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

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

Activity

启动Activity:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5710347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存