Android四大组件详解【Android专题3】

举报
坚果的博客 发表于 2021/12/07 07:52:07 2021/12/07
【摘要】 Android四大组件分别为activity、service、content provider、broadcast receiver。

Android四大组件详解

Android四大组件分别为activity、service、content provider、broadcast receiver。

image-20211205094306168




1、activity

Activity 类是应用程序整个生命周期的重要组成部分,Activity 的启动和组合方式是平台应用程序模型的基本部分。

activity是用户可以做的单一、集中的事情。几乎所有 Activity 都与用户交互,因此 Activity 类负责为您创建一个窗口,您可以在其中放置带有 setContentView(View). 虽然活动通常以全屏窗口的形式呈现给用户,但它们也可以以其他方式使用:作为浮动窗口(通过R.attr.windowIsFloating设置的主题)、 多窗口模式或嵌入到其他窗口中。几乎所有 Activity 的子类都会实现两种方法:

  • onCreate(Bundle)是您初始化活动的地方。最重要的是,在这里您通常会setContentView(int) 使用定义 UI 的布局资源进行调用,并使用它findViewById(int) 来检索该 UI 中您需要以编程方式与之交互的小部件。

  • onPause()是您处理用户暂停与活动的主动交互的地方。此时应提交用户所做的任何更改(通常是 ContentProvider保存数据)。在这种状态下,活动仍然在屏幕上可见。

要与 一起使用Context.startActivity(),所有活动类都必须 <activity> 在其包的AndroidManifest.xml.


一个活动基本上有四种状态:

  • 如果一个活动在屏幕的前景中(在最顶层堆栈的最高位置),它是活动的running。这通常是用户当前正在与之交互的活动。

  • 如果一个 Activity 失去焦点但仍然呈现给用户,它是 可见的。如果一个新的非全尺寸或透明 Activity 焦点位于您的 Activity 之上,另一个 Activity 在多窗口模式下具有更高的位置,或者 Activity 本身在当前窗口模式下不可聚焦,则可能是这种情况。这样的活动是完全活跃的(它维护所有状态和成员信息并保持与窗口管理器的联系)。

  • 如果一个活动被另一个活动完全遮挡,它就会被停止隐藏。它仍然保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口是隐藏的,当其他地方需要内存时,它通常会被系统杀死。

  • 系统可以通过要求它完成或简单地终止其进程,使其销毁来从内存中删除活动。当它再次显示给用户时,它必须完全重新启动并恢复到以前的状态。

下图显示了 Activity 的重要状态路径。方形矩形代表您可以实现的回调方法,以便在 Activity 在状态之间移动时执行操作。彩色椭圆是 Activity 可以处于的主要状态。

activity_lifecycle

(1)一个Activity通常就是一个单独的屏幕(窗口)。

(2)Activity之间通过Intent进行通信。

(3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。

2、service

(1)service用于在后台完成用户指定的操作。service分为两种:

(a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。

(b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。

(2)startService()与bindService()区别:

(a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。

(b)使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

(3)开发人员需要在应用程序配置文件中声明全部的service,使用标签。

(4)Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。

总结:不需要和用户交互,负责后台任务,比如播放音乐,socket长连接

3、content provider

(1)android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。

(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。

(3)ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。

(4)开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。

(5)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

总结:负责数据存取,常用于APP进数据共享,跨进程数据存取等....比如读取相册,读取联系人,都是ContentProvider来实现的

4、broadcast receiver

(1)你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

(2)广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。

(3)动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。

(4)Android还有一套本地广播机制,就是为了解决广播的安全问题,因为系统全局广播可以被其他任何程序接收到,一些携带关键性数据的广播就可能被其他应用程序截获。而本地广播机制发出的广播只能在应用程序的内部进行传递,并且只能接收来自本应用程序的广播,这样就不存在安全问题了。

(5)Android在8.0以后,为了提高效率,删除了静态注册,防止关闭App后广播还在,造成内存泄漏。现在静态注册的广播需要指定包名,而动态注册就没有这个问题。并且,无论是静态注册广播还是动态注册广播,在接收广播的时候都不能拦截广播,否则会报错。 谷歌官网的原文是:应用无法使用其清单注册大部分隐式广播。不过,是不能对大部分的广播进行注册,但还是有些广播可以进行静态注册的,比如对接收Android开机的广播通过静态注册还是能够正常接收的。

总结:负责页面间通信,系统和APP通信,APP和APP通信,比如监听网络连接状态变化,就是通过BroadcastReceiver广播接收者来实现的

5、Intent介绍

Intent是Android系统用来抽象描述要执行的一个操作,也可以在不同组件之间进行沟通和消息传递。 显式的Intent就是你已经知道要启动的组件名称,比如某个Activity的包名和类名,在Intent中明确的指定了这个组件(Activity),一般来说这种Intent经常用在一个应用中,因为你已经明确的知道要启动的组件名称。 隐式的Intent就是你不知道要启动的组件名称,只知道一个Intent动作要执行,比如:拍照,录像,查看地图。一般来说这种Intent用在不同的应用之间传递信息。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。