进阶之路 | 巧妙的四大组件之旅
一起了解 .Net Foundation 项目 No.10
进修清单:
Activity
的事情历程Service
的事情历程
Service
的启动历程Service
的绑定历程
BroadcastReceiver
的事情历程
BroadcastReceiver
的注册历程BroadcastReceiver
的发送和吸收历程
ContentProvider
的事情历程
一.为何要进修四大组件?
作甚“四大”:
Activity
Service
BroadcastReceiver
ContentProvider
谈到四大组件,置信在坐列位都再熟习不过了,光闻其名,未见其声,“四大”二字一出,足见其在安卓体系中的职位,可谓是安卓界的F4
。
其职位之高尚,在某种程度上也可以表现他的主要性,所以说,光会运用四大组件照样不能表现我们对他的注重(ai hu)的,我们还要剖析其事情历程,可以更好地明白体系内部的运转机制,从而加深对Android
体系结构的熟悉;同时,四大组件照样口试必问的学问点之一。
综上,掌握好四大组件相干的学问,关于一个Android
开发者来讲是非常主要的!
以下内容慌张赤鸡,请系好保险带,我们要开车(hu you)了。— No picture,say a J8!
二.中心学问点归结
2.1 概述
2.1.1 Activity
- 范例:展现型组件
- 作用:展现一个界面并和用户交互
- 运用:
A.需要在
AndroidManifest
中注册B.需要借助
Intent
启动,两种体式格局:
- 显现
Intent
:
Intent intent=new Intent(xxx.this,xxx.class); startActivity(intent);
- 隐式
Intent
:
Intent intent=new Intent(); intent.setAction(xxx); intent.addCategory(xxx); startActivity(intent);
- 四种启动形式:
standard
:规范形式singleTop
:栈顶复用形式singleTask
:栈内复用形式singleInstance
:单实例形式想相识启动形式的读者,可以看下笔者写的一篇文章:中的
2.2
部份
- 经由过程
finish()
完毕一个Activity
2.1.2 Service
- 范例:盘算型组件
- 作用:在背景实行一系列盘算使命,耗时的背景盘算发起在零丁的线程中实行
- 运用:
A.需要在
AndroidManifest
中注册B.需要借助
Intent
启动:Intent intent = new Intent(xxx.this, xxx.class); startService(intent);
C.两种运转状况:
- 启动状况:经由过程
startService()
- 绑定状况:经由过程
bindService()
D.住手体式格局:unBindService();stopService();
2.1.3 BroadcastReceiver
- 范例:音讯型组件
- 作用:在差别的组件以致差别的运用之间通报音讯
- 运用:
- 两种注册体式格局:
A.动态注册:经由过程
Context.registerReceiver()
&Context.unRegisterReceiver()
,必需要启动运用才注册并吸收播送。B.静态注册:在
AndroidManifest
文件中注册,不需要启动运用即可吸收播送。- 需要借助
Intent
发送播送:Intent intent = new Intent("xxx"); sendBroadcast(intent);
- 四种播送范例:
A.平常播送
B.有序播送
C.当地播送
D.粘性播送
- 没有住手观点
2.1.4 ContentProvider
- 范例:同享型组件
- 作用:向其他组件以致其他运用同享数据(安卓
IPC
的一种体式格局) - 运用:
- 需要在
AndroidManifest
中注册- 无需借助
Intent
启动- 四种操纵:注重需要处置惩罚好线程同步(因为这些操纵运转在
Binder
线程)A.
insert()
:增加数据B.
update()
:更新数据C.
delete()
:删除数据D.
query()
:查询数据
- 无需手动住手
想细致相识
IPC
机制的读者,可以看下笔者写的一篇文章:
2.2 事情历程
差不多该进入本日的主题了,为了逼格,为了高薪,大伙往前冲!
2.2.1 Activity
Activity
启动历程流程图:
一眼看上去有点晕晕的,墙裂发起合营源码一同服用,结果极佳,笔者引荐一篇文章:
Q1:结论:
ActivityManagerService
、ApplicationThread
都是Binder
Application
的竖立也是经由过程Instrumentation
来完成的,这个历程和Activity
对象一样,都是经由过程类加载器来完成的Activity
的启动历程终究回到ApplicationThread
中,经由过程ApplicationThread.scheduleLaunchActivity()
将启动Activity
的音讯发送并交由Handler H
处置惩罚。Handler H
对音讯的处置惩罚会挪用handleLaunchActivity()
->performLaunchActivity()
得以终究完成Activity的竖立和启动。
Q2:重点类:
Instrumentation
:
instrumentation
是Android
体系内里的一套掌握要领或许”钩子“。 这些钩子可以在平常的生命周期(平常是由操纵体系掌握的)以外掌握Android
控件的运转;它们同时可以掌握Android
如何加载运用程序。
ActivityManagerService「AMS」
:
AMS
是体系的指导效劳,运用历程的启动、切换和调理、四大组件的启动和治理都需要AMS
的支撑。
ActivityStackSupervisor
:
ActivityStackSupervisor
在AMS
中的组织要领中被竖立。AMS
经由过程操纵ActivityStackSupervisor
来治理Activity
ActivityStack
:
ActivityStack
从称号来看是跟栈相干的类,实在它是一个治理类,用来治理体系一切Activity
的种种状况- 它由
ActivityStackSupervisor
来举行治理的
ApplicationThread
:
ActivityThread
的私有内部类,也是一个Binder
对象- 在此处它是作为
IApplicationThread
对象的Server
端,守候Client
端的要求然后举行处置惩罚,最大的Client
就是AMS
2.2.2 Service
源码流程剖析:
1.启动历程:
2.绑定历程:
结论:
ContextImpl
是Context
的详细完成,经由过程Activity.attach()
和Activity
竖立关联。Activity.attach()
中还会完成Window
的竖立并和Activity&Window
的关联,由此事宜可通报给Window
。ActivityServices
是一个辅佐ActivityManagerService
(AMS)举行Service
治理的类,包含Service
的启动、绑定和住手。- 和
Activity
相似的,Service
的启动/绑定历程终究回到ApplicationThread
中,经由过程ActivityThread.handleCreateService()
/ActivityThread.handleBindService
完成Service的启动/绑定,注重绑定Service的后续还必须示知客户端已胜利衔接Service
的这一流程,由ActivityManagerService.publishService()
去完成。
2.2.3 BroadcastReceiver
源码流程剖析:
1.注册
四大组件的静态注册都是在运用装置时由
PackageManagerService(PMS)
剖析注册,当动态注册BroadcastReceiver
时流程为:
2.发送和吸收
结论:
- 动态注册播送终究会跨历程交给
AMS
,并把长途Receiver
( 现实上传的是IIntentReceiver
,是个Binder
对象)和长途IntentFilter
保存起来,完成注册使命 - 发送播送时,体系为intent增加了两个标记位:
FLAG_EXCLUDE_STOPPED_PACKAGES
:播送不会发送给已住手的APP
(体系为一切播送默许增加该标记)FLAG_INCLUDE_STOPPED_PACKAGES
:播送也会发送到已住手的APP
(两个标记共存时,以该标记为准)
- 终究在
ReceiverDispatcher .performReceive ()
里回调了Receiver
的onReceive()
,使得播送得以吸收并处置惩罚
Q2:完成道理:
从完成道理看上,播送运用了观察者形式,基于音讯的宣布/定阅事宜模子
详细完成流程要点大略归纳综合以下:
- 播送吸收者
BroadcastReceiver
经由过程Binder
机制向AMS
举行注册 - 播送发送者经由过程
Binder
机制向AMS
发送播送 AMS
查找相符响应前提(IntentFilter
/Permission
等)的BroadcastReceiver
,将播送发送到BroadcastReceiver
(平常情况下是Activity
)响应的音讯轮回行列中- 音讯轮回实行拿到此播送,回调
BroadcastReceiver
中的onReceive()
要领
2.2.4 ContentProvider
1.启动流程总概
- 启动的进口为
ActivityThread.main()
:竖立ActivityThread
实例并竖立主线程音讯行列 ActivityThread.attach()
:长途挪用AMS.attachApplication()
并供应ApplicationThread
用于和AMS
的通讯AMS.attachApplication()
:经由过程ActivityThread.bindApplication()
要领和Handler H
来调回ActivityThread.handleBindApplication()
ActivityThread.handleBindApplication()
:先竖立Application
、再加载ContentProvider
、末了回调Application.onCreate()
2.Query
历程流程
insert()
、delete()
和update()
的完成道理和query()
相似,限于篇幅,这里不睁开,感兴趣的读者可以主动去探讨源码流程剖析:
结论:
ContentProvider
的multiprocess
属性:ContentProvider
是不是是单例,平常用单例- 接见
ContentProvider
需要ContentResolver
,其真正完成类是ApplicationContentResolver
。当ContentProvider
地点历程未启动时,第一次接见它会触发ContentProvider
的竖立以及历程启动 - 当
ContentProvider
地点的历程启动时,会同时被启动并被宣布到AMS
中
注重:
ContentProvider.onCreate()
要先于Application.onCreate()
实行
- 一样的,终究经由过程
ActivityThread.handleBindApplication()
完成ContentProvider
的竖立。
三.教室小测试
祝贺你!已看完了前面的文章,置信你对
四大组件
已有肯定深度的相识,下面,举行一下教室小测试,考证一下本身的进修效果吧!
Q1:为何要运用ContentProvider
?它和SQL
在完成上有什么区别?
ContentProvider
屏障了数据存储的细节,内部完成透明化,用户只需体贴URI
即可(是不是婚配)ContentProvider
能完成差别APP
的数据同享,SQL
只能是本身程序才接见ContentProvider
还能增删当地的文件,XML
等信息
Q2:Android
引入四大组件的意图
这个问题在笔者刚开始进修
Android
的时刻就一向疑心,直到看了一篇宣布在Google+
上的一篇post
的
看法:Google Android Framework
团队决议,不要让一个明白的Main
要领作为APP
的进口,因为需要让体系对APP
如何运转有更多的掌握权,在该体系中,用户永久不需要斟酌开启和住手一个APP
,而把这些事交给体系去治理。所以他们设想了四大组件以作为APP
功用的载体和进口:
Activity
一个
APP
与用户交互的进口BroadcastReceiver
- 一种让体系在平常的用户流(
user flow
)以外,通报事宜给APP
的机制。- 最主要的是,因为这是另一个被经心定义的
APP
的进口,纵然APP
当前并不在运转,体系也可以将Broadcasts
通报给APP
。
Service
当
APP
因为林林总总的缘由需要在背景运转时,Service
就是一个如许的进口
ContentProvider
- 人们通常会将它看成对数据库的笼统,因为有很多的
API
和支撑库就是如许运用ContentProvider
的- 然则从体系设想的角度,这并非
ContentProvider
的初志。关于体系来讲,ContentProvider
现实上是一个进口,用于猎取一个APP
内部的公然的被定名的数据项(data items
),每一个数据项都被一个URI scheme
所标识。
假如文章对您有一点协助的话,愿望您能点一下赞,您的点赞,是我行进的动力
本文参考链接:
- 《Android 开发艺术探究》
[ASP.NET Core 3框架揭秘] 服务承载系统[2]: 承载长时间运行的服务[下篇]