栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《艺术探索》读书笔记(更新中),阿里程序员的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:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/713698.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号