Android开发艺术探索笔记(含思维导图)

Android开发艺术探索笔记思维导图

正文:

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

图1-1:Activity 生命周期的切换过程

(1) onCreate:表示Activity正在创建,这是生命周期的第一个方法。在这个方法中,我们可以做一些init工作,比如调用setContentView去加载界面布局资源,初始化Activity所需数据等。
(2)onRestart:表示Activity正在重新启动。通常,当前Activity从不可见重新变成可见状态时,onRestart就会被调用.这种情况一般是用户行为所导致的,比如用户按Home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会暂停,也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。

notes:  onStart 和onstop是从activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的。

简单理解:启动Activity的请求会由Instrumentation来处理,然后它通过Binder向AMS发请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步

横屏变成竖屏这种异常情况,调用onSaveInstanceState--onrestoreInstanceState

图1-2 四种任务栈的区别

图1-3: 异常情况下Activity的重建过程图

图1-4:任务栈示例

QA: 分成2个任务栈,前台任务栈和后台任务栈,这个case怎么做出来的?如何做到栈底下的activity被激活的,测试了多个app,都是重新打开也会在栈顶那个进程back结束进程,而是回到桌面,进程仍然在后台--为什么不是退出进程?

前后台栈切换的说明和栈内的activity的弹出用onNewIntent
测试:任务栈从不同activity再点击原来的activity不太好复现。
eg taobao每个activity都是新,都只有back一条路。实际例子不好找

显式Intent和隐式Intent的区别?
显式Intent比较简单,在网上一搜很多。显式intent直接在代码中实现.
隐式Intent.网上的材料很多讲的重点跑偏了,强调的都是匹配方式。实际重点是action.
隐式Intent 将显示intent实现的代码放入配置文件. 有4个属性Action、Data、Category、Extras。重点是action, 它决定了start组件的行为,比如:start activity or start webpage or start dial.
隐式Intent start activity 的时候,不同于显示使用类名,而是使用别名(路径名+类名).
参考: 显式Intent和隐式Intent讲解与实例应用 https://blog.csdn.net/shaochen2015821426/article/details/79685260
Intent中的四个重要属性——Action、Data、Category、Extras https://blog.csdn.net/reboot123/article/details/9198101

debug:

图1-5 执行adb shell dumpsys activity 命令

2 IPC机制

图2-1 binder的工作机制


图2-2: IPC方式的优缺点和适用场景

3 VIEW

图3-1

图3-2

图3-3 事件分发源码分析


图3-4 view消息流程图

图3-5

图3-5

滑动冲突:
scenario1:外部滑动方向和内部滑动方向不一样;比如:viewPage+fragement+listview; 根据两点之间坐标计算角度和方向
scenario2:外部滑动方向和滑动方向一致; 根据业务逻辑规定
scenraio3:上面两种情况的嵌套

4 View的工作原理

图4-1:performTraversals的工作流程图 

图4-2 顶级View:DecorView的结构:Decorview是顶级view,包含一个竖直方向的LinearLayout,上面是标题栏,下面是内容栏

图4-3 UNSPECIFIED,EXACTLY,AT_MOST表

UNSPECIFIED:

父容器不对View进行任何限制,要多大给多大,用于系统内部

EXACTLY:

父容器检测到View所需要的精确大小,这时候View的最终大小就是SpecSize所指定的值,对应LayoutParams中的 match_parent 和具体数值这两种模式

AT_MOST:

对应View的默认大小,不同View实现不同,View的大小不能大于父容器的SpecSize,对应 LayoutParams 中的 wrap_content

match_parent,wrap_content

 

图4-4

View的三大流程均是通过ViewRoot来完成的.ViewRoot对应于ViewRootImpl类.它是连接WindowManager和DecorView(ViewGroup)的纽带.
在ActivityThread中,当Activity对象被创建完毕后,会将DecorView(viewgroup)添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联.

自定义View须知:

1).让View支持warp_content--对于直接继承自View的控件,如果不对wrap_content做特殊处理,那么使用wrap_content就相当于使用match_parent
2).如果有必要,让你的View支持padding--因为padding默认不生效
3).尽量不要在View中使用Handler,没必要--因为View内部本身就提供了post方法
4).View中如果有线程或者动画,需要及时停止,参考View#onDetchedFromWindow--防止内存泄露
5).View带有滑动嵌套情形时,需要处理好滑动冲突

5 理解RmoteViews

远程进程通过RemoteViews的apply方法来进行View的更新操作,RemoteViews的apply方法内部则会去遍历所有的Action对象并调用它们的apply方法,具体的View更新操作是由Action对象的apply方法来完成的。

图5-1 remoteviews的内部机制

Action代替binder操作view:
从理论上来说,系统完全可以通过Binder去支持所有的View和View操作,但是这样做的话代价太大,因为View的方法太多了,另外就是大量的IPC操作会影响效率。
为了解决这个问题,系统并没有通过Binder去直接支持View的跨进程访问,而是提供了一个Action的概念,Action代表一个View操作,Action同样实现了Parcelable接口。
这样的好处是不需要定义大量的Binder接口,其次避免了大量的IPC操作,提高了程序的性能。
RemoteVeiws会通过Binder传递到SystemServer进程,这是因为RemoteViews实现了Parcelable接口,因此它可以跨进程传输,系统会根据RemoteViews中的包名等信息去得到该应用的资源。然后会通过LayoutInflater去加载RemoteViews中的布局文件

6 Android 的Drawable

7 Android 动画深入分析

图7-1 view动画的四种变换

图7-2

8 理解windows和windows manager

Window是一个抽象的概念,每个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立连接,因此Window并不是实际存在的,它是以View的形式存在。在实际使用中无法直接访问Window,对Window的访问必须通过WindowManager

1) Window的添加过程:

windows->window manager->WindowManagerImpl.addView-->WindowManagerGlobal.addView-->mViews.add-->
ViewRootImpl.setView-->requestLayout-->scheduleTraversals-->WindowSession.addToDisplay-->Session.addToDisplay-->WindowManagerService.addWindow

1.检查参数是否合法,如果是子Window那么还需要调整一些布局参数
2.创建ViewRootImpl并将View添加到列表中
3.通过ViewRootImpl来更新界面并完成Window的添加过程

View的绘制过程是由ViewRootImpl来完成的,在setView内部会通过requestLayout完成异步刷新请求,scheduleTraversals实际是View绘制的入口,接着会通过WindowSession最终来完成Window的添加过程,真正的实现类是Session,也就是Window的添加过程是一次IPC调用,在Session内部会调用WindowManagerService来实现Window的添加。

2) Window的删除过程

WindowManagerImpl.removeView-->WindowManagerGlobal.removeView-->WindowManagerGlobal.removeViewLocked-->ViewRootImpl.die-->
ViewRootImpl.doDie-->ViewRootImpl.dispatchDetachedFromWindow-->

WindowManager中提供了两种删除接口removeView和removeViewImmediate,分别表示异步删除和同步删除。
异步删除具体的删除操作由ViewRootImpl的die方法来完成,die发送了一个请求删除的消息,ViewRootImpl中的Handler会处理此消息并调用doDie方法,
如果是同步删除,那么就不发消息直接调用doDie方法。

doDie内部会调用dispatchDetachedFromWindow方法,dispatchDetachedFromWindow主要做四件事:
a)垃圾回收相关工作,比如清除数据和消息、移除回调
b)通过Session的remove方法删除Window:mWindowSession.remove(mWindow),这同样是一个IPC过程,最终会调用WindowManagerService的removeWindow方法
c)调用View的dispatchDetachedFromWindow方法,在内部会调用View的onDetachedFromWindow()以及onDetachedFromWindowInternal()。
当View从Window中移除时,这个方法就会被调用,可以在这个方法内部做一些资源回收的工作,比如终止动画、停止线程等
d)调用WindowManagerGolbal的doRemoveView方法刷新数据,包括mRoots、mParams以及mDyingViews,需要将当前Window所关联的这三类对象从列表中删除

3) zWindow的更新过程:还是要看WindowManagerGlobal的updateViewLayout方法:

a)通过ViewRootImpl的setLayoutParams更新View的LayoutParams并替换掉老的LayoutParams,接着再更新ViewRootImpl中的LayoutParams
b)在ViewRootImpl中会通过scheduleTraversals方法来对View重新布局,包括测量、布局、重绘这三个过程
c)ViewRootImpl还会通过WindowSession来更新Window视图,最终是由WindowManagerService的relayoutWindow()来具体实现的。同样是一个IPC过程

在ActivityThread的makeVisible()方法中,首先会调用Activity的onResume方法,接着会调用Activity的makeVisible(),正是在makeVisible方法中,DecorView真正地完成了添加和显示这两个过程,到这里Activity的视图才能被用户看到。

9 四大组件的工作过程

四大组件:作用&使用(注册-发送-接收) 请参考下面的连接

why 用RemoteCallbackList?因为client register binder & unregistered binder在server上是不同binder,等于两次通信。使用RemoteCallbackList就是一次了.
RemoteCallbackList 是系统专门提供的用于删除跨进程listener的接口。RemoteCallbackList是一个泛型,支持管理任意的AIDL接口,这点从它的声明就可以看出,因为所有的AIDL接口都继承自IInterface接口。
RemoteCallbackList:当客户端解注册的时候,我们只要遍历服务端所有的listener,找出那个和解注册listener具有相同Binder对象的服务端listener并把它删掉即可。并且它能够自动移除客户端所注册的listener。
RemoteCallbackList内部自动实现了线程同步的功能

binder线程池,No36,No37 记录 ----这个是aidl应用层线程池和底层binder server的bind thread不同
https://www.cnblogs.com/anni-qianqian/p/7210376.html

Activity总结和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110064346
Android Binder&Aidl理解和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/109862316
handler总结和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110293636
<Service史上最全面解析>理解和补充:
https://blog.csdn.net/fdsafwagdagadg6576/article/details/110696288
四大组件总结:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110631418

工作流程:

主线程也叫UI线程它就是ActivityThread,ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。


图9-1


图9-2 Activity启动过程


图9-3 Service启动&绑定过程


图9-4

图9-5

1当一个应用启动时,入口方法是ActivityThread的main方法,其中创建ActivityThread的实例并创建主线程的消息队列;
2 ActivityThread的attach方法中会远程调用ActivityManagerService的attachApplication,并将ApplicationThread提供给AMS,ApplicationThread主要用于ActivityThread和AMS之间的通信;
3 ActivityManagerService的attachApplication会调用ApplicationThread的bindApplication方法,这个方法会通过H切换到ActivityThread中去执行,即调用handleBindApplication方法;
4 handleBindApplication方法会创建Application对象并加载ContentProvider,注意是先加载ContentProvider,然后调用Application的onCreate方法。
5 ContentProvider启动后, 外界就可以通过它所提供的增删改查这四个接口来操作ContentProvider中的数据源, 这四个方法都是通过Binder来调用的, 外界无法直接访问ContentProvider, 它只能通过AMS根据URI来获取到对应的ContentProvider的Binder接口IContentProvider, 然后再通过IContentProvider来访问ContentProvider中的数据源.
notes: contentProvider和sqlite有什么区别?

10 Android 的消息机制

handler+looper机制:参见:https://blog.csdn.net/fdsafwagdagadg6576/article/details/111300450

activity源码分析加上link

启动Activity的请求会由Instrumentation来处理,然后它通过Binder向AMS发请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。
ActivityThread通过ApplicationThread和AMS进行进程间通信,AMS以进程间通信的方式完成ActivityThread的请求后会回调ApplicationThread中的Binder方法,然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中去执行

11 Android的线程和线程池

12 Bitmap的加载和Cache

14 JNI和NDK编程

程序首先根据类名com/szysky/note/androiddevseek_14/MainActivity找到类,
然后在根据方法名methodCalledByJni找到方法, 并传入方法对应签名(Ljava/lang/String;), 最后通过JNIEnv对象的CallStaticVoidMethod()方法来完成最终调用.
函数名格式遵循规则:Java_包名_类名_方法名
JNIEnv*:表示一个指向JNI环境的指针,可以通过它来访问JNI提供的接口方法
jobject:表示Java对象中的this
JNIEXPORT和JNICALL:它们使JNI中所定义的宏,可以在jni.h这个头文件中查找到
jni&ndk 详细分析:https://www.cnblogs.com/anni-qianqian/p/8350400.html

参考:https://www.jianshu.com/p/b3b043d52c62

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。 《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。, 《 Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值