Android四大组件

Android四大组件分别是ActivityServiceContent ProviderBroadcast Receiver

  • 活动Actity:用于表现功能
  • 服务Service:用于后台运行服务,不提供界面呈现。
  • 广播接收器Broadcast Receiver:用于接收广播
  • 内容提供者Content Provider 支持多个应用中存储和读取数据,相当于数据库。

活动Activity

  • 一个Activity通常就是一个单独的屏幕窗口
  • Activity之间通过Intent进行通信
    Intent是Android用来首相描述要执行的一个操作,可以在不同组件之间进行沟通和消息传递。
    显式的Intent是已知要启动的组件名称,如某个Acitivity的包名和类名,在Intent中明确的指定了Activity,一般而言这种Activity经常用在一个应用中,因为已经明确的知道了需要启动的组件名称。
    隐式的Intent是不知道要启动的组件名称,只知道一个Intent动作要执行,如拍照、录像、查看地图。一般而言这种Intent用在不同的应用之间传递消息。
  • Android应用中每个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将无法识别。

活动的生命周期

在Android中会维持一个Activity Stack(活动栈),当一个新的活动创建时会被放到栈顶,这个活动就处于运行状态。当再有一个新的活动被创建后,会重新压入栈顶。而之前的活动则会在这个新的活动底下,就像枪梭压入子弹一样,之前的活动会进入后台。

一个活动本质上存在四种状态

  • 运行中Running/Active
    活动位于栈顶是可见的,可以与用户交互。
  • 暂停Paused
    当活动失去焦点,不能跟用户交互,但依然可见时就处于暂停状态。当一个新的全屏活动或透明的活动放置在栈顶时,活动就会处于暂停状态。此时活动的各种数据还被保持着。只有在系统内存极低的状态下,系统才会自动的销毁活动。
  • 停止Stoped
    当一个活动被另一个活动完全覆盖,或点击HOME键退出了后台,此时活动就处于停止状态。此时跟暂停状态相似,此时活动的各种数据还被保持着,当系统别的地方需要使用到内容时,系统会自动的去销毁活动。
  • 销毁Destroyed
    当点击返回按钮或系统在内存不足的情况下会将活动从栈中移除销毁,并被系统回收,此时活动处于销毁状态。
活动的四种状态

服务Service

  • 服务通常在后台运行且无需与用户交互
  • 服务用于在后台完成用户指定的操作
  • 开发人员需要在应用程序配置文件中使用标签<service></service>声明全部的服务

服务是Android中实现程序后台运行的解决方案,非常适合去执行一些无需和用户交互而且长期运行的任务。服务运行不依赖于任何用户界面,即使程序被切换到后台,或用户打开另一个应用,服务仍然能够保持正常运行。

不过需要注意的是,服务并不运行在一个独立的进程当作,而是 依赖于创建服务时所在的应用程序进程。某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。另外,不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程中的。也就是说 ,需要在服务内部手动创建子线程,并在这里执行具体的任务,否则就会出现主线程被阻塞的情况。

服务通常用作在后台处理耗时的逻辑,与活动一样存在自己的生命周期。

服务的生命周期

服务用于在后台完成与用户指定的操作,具体可分为两种启动方式。

  • started启动
    指当应用程序组件调用startService()方法启动服务时,服务处于started状态。启动它的组件和服务并没有关联,只有当服务调用stopSelf或其他组件调用stopService时才会终止。

  • bound绑定
    指当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。其他组件可通过回调获取服务的代理对象和服务交互,双方也进行了绑定,当启动方销毁时服务会自动进入unBind操作,当发现所有绑定都进行了unBind时才会销毁服务。

startService()bindService()的区别

启动服务是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,生命周期与启动它的组件无关,可在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。使用bindService()方法启用服务,调用者和服务绑定在了一起,调用者一旦退出服务也就会终止。

服务的onCreate回调中可以作耗时的操作吗?如果需要作耗时操作应该怎么做呢?

服务的onCreate回调中不可以作耗时操作,因为服务的onCreate是在主线程ActivityThread中调用的,耗时操作会阻塞UI。如果需要作耗时操作可采用线程和Handler的方式。

内容提供者Content Provider

  • Android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序,其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
  • 只有需要在多个应用程序间共享数据时才需要内容提供者
  • ContentProvider实现数据共享
    ContentProvider用于保存和获取数据,并使其对所有应用程序可见,这是不同于应用程序之间共享数据的唯一方式,因为Android没有提供所有应用共同访问的公共存储区。
  • 开发人员不会直接使用ContentProvider类的对象,大多通过ContentResolverr对象实现对ContentProvider来管理。
  • ContentProvider使用URI来唯一标识其数据集,这里使用的URI以content://作为前缀表示数据由ContentProvider来管理。

广播接收器Broadcast Receiver

  • 应用可以使用Broadcast Receiver对外部事件进行过滤,只对感兴趣的外部事件进行接收并做出响应。
  • 广播接收器美俄有用户界面
  • 广播接收者的注册有两种方式,分别是程序动态注册和AndroidManifest文件中进行静态注册
  • 动态注册广播接收器的特点是当用来注册的Activity关闭后广播也会失效
  • 静态注册无需担心广播接收器是否被关闭,只要设备时开启状态,广播接收器也时打开着的。
  • Android有一套本地广播机制用于解决广播的安全问题

Android中广播是一种广泛应用在应用程序之间传递消息的机制,广播接收器是对发送出来的广播进行过滤接收并响应的一类组件。可以使用广播接收器让应用对一个外部事件做出响应。

例如:当电话呼入这个外部事件到达时可利用广播接收器进行处理。当下载一个程序成功完成时,可一样利用广播接收器进行处理。

广播接收器不使用NotificationManager来通知用户这些事件发生了。广播接收器 即可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceive()进行注册。主要是注册了,当事件来临时,即使程序没有启动,系统也在需要的时候启动程序。各种应用可以通过使用Context.sendBroadcast()方法将它们自己的Intent广播给其他应用程序。

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

推荐阅读更多精彩内容