IT教程 ·

进阶之路 | 巧妙的四大组件之旅

一起了解 .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!

进阶之路 | 巧妙的四大组件之旅 IT教程 第1张

二.中心学问点归结

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 事情历程

差不多该进入本日的主题了,为了逼格,为了高薪,大伙往前冲!

进阶之路 | 巧妙的四大组件之旅 IT教程 第2张

2.2.1 Activity

Activity启动历程流程图:

一眼看上去有点晕晕的,墙裂发起合营源码一同服用,结果极佳,笔者引荐一篇文章:

进阶之路 | 巧妙的四大组件之旅 IT教程 第3张

Q1:结论:

  • ActivityManagerServiceApplicationThread都是Binder
  • Application的竖立也是经由过程Instrumentation来完成的,这个历程和Activity对象一样,都是经由过程类加载器来完成的
  • Activity的启动历程终究回到ApplicationThread中,经由过程ApplicationThread.scheduleLaunchActivity() 将启动Activity的音讯发送并交由Handler H处置惩罚。
  • Handler H对音讯的处置惩罚会挪用handleLaunchActivity()->performLaunchActivity()得以终究完成Activity的竖立和启动。

Q2:重点类

  • Instrumentation

instrumentationAndroid体系内里的一套掌握要领或许”钩子“。 这些钩子可以在平常的生命周期(平常是由操纵体系掌握的)以外掌握Android控件的运转;它们同时可以掌握Android如何加载运用程序。

  • ActivityManagerService「AMS」

AMS是体系的指导效劳,运用历程的启动、切换和调理、四大组件的启动和治理都需要AMS的支撑。

  • ActivityStackSupervisor:
  • ActivityStackSupervisorAMS中的组织要领中被竖立。
  • AMS 经由过程操纵ActivityStackSupervisor来治理Activity
  • ActivityStack:
  • ActivityStack从称号来看是跟栈相干的类,实在它是一个治理类,用来治理体系一切Activity的种种状况
  • 它由ActivityStackSupervisor来举行治理的
  • ApplicationThread:
  • ActivityThread的私有内部类,也是一个Binder对象
  • 在此处它是作为IApplicationThread对象的Server端,守候Client端的要求然后举行处置惩罚,最大的Client就是AMS

2.2.2 Service

源码流程剖析:

1.启动历程:

进阶之路 | 巧妙的四大组件之旅 IT教程 第4张

2.绑定历程:

进阶之路 | 巧妙的四大组件之旅 IT教程 第5张

结论:

  • ContextImplContext的详细完成,经由过程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时流程为:

进阶之路 | 巧妙的四大组件之旅 IT教程 第1张

2.发送和吸收

进阶之路 | 巧妙的四大组件之旅 IT教程 第1张

结论:

  • 动态注册播送终究会跨历程交给AMS,并把长途Receiver( 现实上传的是IIntentReceiver,是个Binder 对象)和长途IntentFilter保存起来,完成注册使命
  • 发送播送时,体系为intent增加了两个标记位:
  • FLAG_EXCLUDE_STOPPED_PACKAGES :播送不会发送给已住手的APP(体系为一切播送默许增加该标记)
  • FLAG_INCLUDE_STOPPED_PACKAGES :播送也会发送到已住手的APP(两个标记共存时,以该标记为准
  • 终究在ReceiverDispatcher .performReceive ()里回调了ReceiveronReceive(),使得播送得以吸收并处置惩罚

Q2:完成道理:

从完成道理看上,播送运用了观察者形式,基于音讯的宣布/定阅事宜模子

详细完成流程要点大略归纳综合以下:

  • 播送吸收者BroadcastReceiver经由过程Binder机制向AMS举行注册
  • 播送发送者经由过程Binder机制向AMS发送播送
  • AMS查找相符响应前提(IntentFilter/Permission等)的BroadcastReceiver,将播送发送到BroadcastReceiver(平常情况下是Activity)响应的音讯轮回行列中
  • 音讯轮回实行拿到此播送,回调BroadcastReceiver中的onReceive()要领

2.2.4 ContentProvider

1.启动流程总概

进阶之路 | 巧妙的四大组件之旅 IT教程 第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()相似,限于篇幅,这里不睁开,感兴趣的读者可以主动去探讨

源码流程剖析:

结论:

  • ContentProvidermultiprocess属性: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]: 承载长时间运行的服务[下篇]

参与评论