要点提炼|开发艺术之四大组件

提到四大组件大家肯定再熟悉不过了,本篇侧重于对四大组件工作过程的分析:

  • 概述
  • 工作过程
    • Activity
    • Service
    • BroadcastReceiver
    • ContentProvider

1.概述

a.Activity

  • 类型:展示型组件。
  • 作用:展示一个界面并和用户交互。
  • 使用:
    • 需要在AndroidManifest中注册。
    • 需要借助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:单实例模式
    • 对用户而言是可见的。
    • 通过finish()结束一个Activity。

相关基础入门之Activity篇开发艺术之Activity

b.Service

  • 类型:计算型组件。
  • 作用:在后台执行一系列计算任务,耗时的后台计算建议在单独的线程中执行。
  • 使用:
    • 需要在AndroidManifest中注册。
    • 需要借助Intent启动:
      Intent intent = new Intent(xxx.this, xxx.class); startService(intent);
    • 两种运行状态:
      • 启动状态:通过startService()
      • 绑定状态:通过bindService()
    • 用户无法感知。
    • 通过unBindService()stopService()完全停止一个Service。

相关基础入门之Service篇

c.BroadcastReceiver

  • 类型:消息型组件。
  • 作用:在不同的组件乃至不同的应用之间传递消息。
  • 使用:
    • 两种注册方式:
      • 动态注册:通过Context.registerReceiver()& Context.unRegisterReceiver(),必须要应用启动才能注册并接收广播。
      • 静态注册:在AndroidManifest文件中注册,不需要启动应用即可接收广播。
    • 需要借助Intent发送广播:
      Intent intent = new Intent("xxx"); sendBroadcast(intent);
    • 四种广播类型:
      • 普通广播
      • 有序广播
      • 本地广播
      • 粘性广播
    • 用户无法感知。
    • 没有停止概念。

相关基础入门之BroadcastReceiver篇

d.ContentProvider

  • 类型:共享型组件。
  • 作用:向其他组件乃至其他应用共享数据。
  • 使用:
    • 需要在AndroidManifest中注册。
    • 无需借助Intent启动。
    • 四种操作:注意需要处理好线程同步
      • insert():添加数据
      • update():更新数据
      • delete():删除数据
      • query():查询数据
    • 用户无法感知。
    • 无需手动停止。

相关基础入门之ContentProvider篇IPC方式之ContentProvider
考考自己android四大组件的运行状态


二.工作过程

由于相关源码非常多,这里借用@amurocrash的UML图来提炼流程更为直观,另附相关源码分析的文章供大家详细了解。

a.Activity

Activity启动过程流程图:

Activity启动过程

结论

  • ActivityManagerService、ApplicationThread都是Binder
  • Application的创建也是通过Instrumentation来完成的,这个过程和Activity对象一样,都是通过类加载器来实现的。
  • Activity的启动过程最终回到ApplicationThread中,通过ApplicationThread.scheduleLaunchActivity() 将启动Activity的消息发送并交由Handler H处理。
  • Handler H对消息的处理会调用handleLaunchActivity()->performLaunchActivity()得以最终完成Activity的创建和启动。

源码分析Activity的工作过程

b.Service

  • Service启动过程流程图:
Service启动过程
  • Service绑定过程流程图:
Service绑定过程

结论

  • 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()去完成。

源码分析Service的工作过程

c.ContentProvider

  • ContentProvider启动过程流程图:
ContentProvider启动过程
  • 启动的入口为ActivityThread.main():创建ActivityThread实例并创建主线程消息队列;
  • ->ActivityThread.attach():远程调用AMS.attachApplication()并提供ApplicationThread用于和AMS的通信;
  • ->AMS.attachApplication():通过ActivityThread.bindApplication()方法和Handler H来调回ActivityThread.handleBindApplication();
  • ->ActivityThread.handleBindApplication():先创建Application、再加载ContentProvider、最后回调Application.onCreate()

图片来源四大组件的工作过程

  • Query过程流程图:
Query过程

insert()delete()update()类似,这里不展开

结论

  • ContentProvider的multiprocess属性:ContentProvider是否是单例,一般用单例。
  • 访问ContentProvider需要ContentResolver,其真正实现类是ApplicationContentResolver。当ContentProvider所在进程未启动时,第一次访问它会触发ContentProvider的创建以及进程启动。
  • 当ContentProvider所在的进程启动时,会同时被启动并被发布到AMS中。注意:ContentProvider.onCreate()Application.onCreate()执行。
  • 同样的,最终通过ActivityThread.handleBindApplication()完成ContentProvider的创建。

源码分析 ContentProvider的工作过程

d.BroadcastReceiver

  • 四大组件的静态注册都是在应用安装时由PackageManagerService(PMS)解析注册,当动态注册Service时流程为:
Receiver动态注册过程
  • 广播发送和接收过程流程图:
广播发送和接收过程

结论:

  • 动态注册广播最终会跨进程交给AMS,并把远程Receiver( 实际上传的是IIntentReceiver,是个Binder )对象和远程IntentFilter保存起来,完成注册任务。
  • 发送广播时,系统为intent添加了两个标记位:
    • FLAG_INCLUDE_STOPPED_PACKAGES :广播也会发送到已经停止的APP(两个标记共存时,以该标记为准)
    • FLAG_EXCLUDE_STOPPED_PACKAGES :广播不会发送给已经停止的APP(系统为所有广播默认添加该标记)
  • 最终在ReceiverDispatcher .performReceive ()里回调了Receiver 的onReceive(),使得广播得以接收并处理。

源码分析BroadcastReceiver 的工作过程


希望这篇文章对你有帮助~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341