Android开发艺术探索读书笔记(三)
看了这章内容也有不少时间,也自己写了些东西。但是总感觉讲得不是清楚明白,无意中发现这篇
Android开发艺术探索读书笔记(三)
博客,感觉写的非常好。就借鉴了许多东西过来。“之所以自己这么看重,是因为这篇应该是读书笔记里最重要的一篇了,这篇能吃透的话,基本安卓app层玩的机制都能理解的很清楚了。所以我也倾注了全部的心血来写这篇,希望跟大家一起分享。”简单先说下:这里将第十章(Android的消息机制)、第九章(四大组件的工作过程)放在第八章(理解Window和WindowManager)前面的原因是:学习理解Window的知识最好需要先了解Activity的运行机制以及handler的工作原理,所以大家读主席这本书的时候也建议按照这个顺序来读这三章,对window的理解会更水到渠成,以上。如果看这篇前你还没有去看第二章的IPC机制,我强烈建议你看懂IPC再回来看这篇,会发现一切都变得非常清晰。热切期盼各位看完能有收获,有任何错误或者疑问都可在评论中给出,我会一一回复,感谢~
- 四大组件概述:
1) Activity的主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。
2) Service是一种计算型组件,用于在后台执行一系列计算任务,但因为其本身还是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。
3) BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。广播注册有两种方式,动态注册通过Context.registerReceiver()来实现,必须要应用启动才能注册;静态注册则在AndroidManifest文件中进行,应用安装时会被系统解析,不需要启动应用就可接收广播。
4) ContentProvider是一种共享型组件,用于向其他组件乃至其他应用共享数据。 - 下面我用UML图的形式来说明四大组件的工作过程:
- Activity的工作过程
可以和下面这幅图对比一下看看。
- Service
启动:
绑定: - BroadcastReceiver
注册(动态):
发送和接收: - ContentProvider
1) 当ContentProvider所在的进程启动的时候,它会同时被启动并被发布到AMS中,这个时候它的onCreate要先去Application的onCreate执行。
2) 启动方式请看page363,这里就不画了,书上画的非常清晰易懂,就写几个tips 吧。
a. 应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
b. attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
c. attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。
d. ContentProvider的multiprocess属性决定了ContentProvider是否是单例(false时),一般都用单例。
e. ContentResolver的具体类是ApplicationContentResolver,当ContentProvider所在进程未启动时,第一次访问它会触发ContentProvider的创建以及进程启动。
3) query流程
看了这章内容也有不少时间,也自己写了些东西。但是总感觉讲得不是清楚明白,无意中发现这篇
Android开发艺术探索读书笔记(三)
博客,感觉写的非常好。就借鉴了许多东西过来。“之所以自己这么看重,是因为这篇应该是读书笔记里最重要的一篇了,这篇能吃透的话,基本安卓app层玩的机制都能理解的很清楚了。所以我也倾注了全部的心血来写这篇,希望跟大家一起分享。”简单先说下:这里将第十章(Android的消息机制)、第九章(四大组件的工作过程)放在第八章(理解Window和WindowManager)前面的原因是:学习理解Window的知识最好需要先了解Activity的运行机制以及handler的工作原理,所以大家读主席这本书的时候也建议按照这个顺序来读这三章,对window的理解会更水到渠成,以上。如果看这篇前你还没有去看第二章的IPC机制,我强烈建议你看懂IPC再回来看这篇,会发现一切都变得非常清晰。热切期盼各位看完能有收获,有任何错误或者疑问都可在评论中给出,我会一一回复,感谢~
- 四大组件概述:
1) Activity的主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。
2) Service是一种计算型组件,用于在后台执行一系列计算任务,但因为其本身还是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。
3) BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。广播注册有两种方式,动态注册通过Context.registerReceiver()来实现,必须要应用启动才能注册;静态注册则在AndroidManifest文件中进行,应用安装时会被系统解析,不需要启动应用就可接收广播。
4) ContentProvider是一种共享型组件,用于向其他组件乃至其他应用共享数据。 - 下面我用UML图的形式来说明四大组件的工作过程:
- Activity的工作过程
可以和下面这幅图对比一下看看。
- Service
启动:
绑定: - BroadcastReceiver
注册(动态):
发送和接收: - ContentProvider
1) 当ContentProvider所在的进程启动的时候,它会同时被启动并被发布到AMS中,这个时候它的onCreate要先去Application的onCreate执行。
2) 启动方式请看page363,这里就不画了,书上画的非常清晰易懂,就写几个tips 吧。
a. 应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
b. attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
c. attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。
d. ContentProvider的multiprocess属性决定了ContentProvider是否是单例(false时),一般都用单例。
e. ContentResolver的具体类是ApplicationContentResolver,当ContentProvider所在进程未启动时,第一次访问它会触发ContentProvider的创建以及进程启动。
3) query流程