笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述Android 开发组件相关的知识,希望能为你提供帮助。
【Android 开发组件】
每一个应用程序都有自己独立的运行沙盒(授予应用程序代码的访问权)
- android操作系统是一个多用户的Linux系统,其中的每一个应用程序都是一个独立的用户。
- 系统会为每一个应用程序分配一个唯一的Linux用户ID,系统为一个应用程序的所有文件 设置了权限,所以,只有分配给这个应用程序的用户ID可以访问它们。
- 每一个进程有它主机的虚拟机 (VM), 所以一个应用程序的代码会独立与其它的应用程序运行。
- 每一个应用程序在它自己的Linux进程中运行。当没有任何组件被调用或者系统需要为其它应用程序回收内存的时候,就会 关闭这个进程。
应用程序的组件Activity
一个 activity 为一个用户交互提供一个单独的界面,每个应用程序 是由多个 activity 组成
它为用户提供一个用于任务交互的画面。例如,拨打电话,拍照,发邮件。或者查看地图。每一个activity都被分配一个窗口。在这个窗口里,你可以绘制用户交互的内容。 这个窗口通常占满屏幕,但也有可能比屏幕小,并且浮在其它窗口的上面。
Service(服务组件)
一个 service是一个运行在后台的组件。它用于执行耗时操作或者远程进程。 一个service并不提供用户交互界面。
例如,当用户在使用另外一个程序的时候,一个服务可能在播放音乐或者在 通过网络获取数据,这样不会阻塞住用户与activity的交互。其它的组件,例如一个activity,可以启动一个service并让其运行或者与其绑定,绑定后可以与其交互。
Content provider(内容提供组件)
一个content provider负责管理应用程序的数据共享集。
你可以通过文件系、SQLite数据库、网站,或者其它的你的应用程序可以访问的持久化存储位置来存储数据。 通过content provider,其它的应用程序可以查询甚至修改你的数据(如果这个content provider允许它们这么做)。 例如,Android系统提供了一个content provider来管理联系人信息。 同样地,任何程序拥有了适当权限都可以查询这个content provider (例如
ContactsContract.Data
) 去读写某人的信息。Broadcast receiver(广播接收组件)
broadcast receiver 是一个用来响应系统范围内的广播的组件。 很多广播发自于系统本身。—例如, 通知屏幕已经被关闭、电池低电量、照片被拍下的广播。 应用程序也可以发起广播。—例如, 通知其它程序,一些数据被下载到了设备,且可供它们使用。 虽然广播并不提供用户交互界面,它们也可以创建一个状态栏通知 来提醒用户一个广播事件发生了。尽管如此,更多的情形是,一个广播只是进入其它组件的一个“门路”,并试图做一些少量的工作。 例如,它可能发起一个服务,并通过服务执行与这个广播事件相关的工作。
激活组件—activitie, service, 和 broadcast receiver—是被一个叫做 intent的异步消息激活的。 Intent把不同的独立的组件在运行期绑定在一起(你可以把它们当作从其它组件中请求动作的消息), 无论这些组件属于你的或者其它的程序。
对于activity和service来说,一个intent定义了将要执行的动作
对broadcast receiver来说, intent只是简单地定义了需要广播的公告
content provider, 不是用intent来激活。 相对地,它是由一个
ContentResolver
发起的一个指向它的请求激活的。
这个content resolver掌握了所有content provider的直接事务,所以用这个provider来执行事务的组件不需要直接执行而是调用这个
ContentResolver
对象的方法。 它在content provider和这个组件请求信息之间放置了一个抽象层(为了安全)。激活各种类型组件有不同的方法:
- 你可以启动一个activity(或者让让它来做一些新的工作)通过传递一个
Intent
给startActivity()
或者startActivityForResult()
(当你想让一个activity为你返回一个结果)。 - 你可以启动一个service(或者给一个正在运行的service发送新的指令)通过传递一个
Intent
给startService()
。 或者你可以绑定一个服务通过传递一个Intent
给bindService()
。 - 你可以初始化一个broadcast通过传递一个
Intent
给一些方法像sendBroadcast()
,sendOrderedBroadcast()
, 或者sendStickyBroadcast()
。 - 你可以让content provider执行一个查询操作通过调用
ContentResolver
的query()
方法。
在Android系统能够启动一个程序组件之前, 系统必须通过读取程序的
AndroidManifest.xml
文件
你的程序必须在这个文件中声明它所有的组件。除了声明程序组件外,这个配置文件还做一些其它的工作,例如:
- 确定程序需要哪些用户权限,例如网络访问或者读取用户的联系人。
- 声明程序需要的最小的 API Level 这个要参照程序都使用了哪些API。
- 声明程序使用或要求的硬件和软件特性,例如相机,蓝牙服务,或者多点触屏。
- 程序需要链接的API类库(除Android framework API之外的类库),例如 Google Map类库。
- 其它
intent最牛逼的地方其实是它的动作(action)概念, 使用action,你可以简单地描述以下你想执行的动作(并且你也可以指定你想把哪些数据放在这个动作上) 并且允许系统去寻找设备上可以执行这个动作的组件并启动它。如果有多个组件可以执行这个动作,那么由用户来决定哪个去执行。
推荐阅读
- Android 回调接口是啥,回调机制详解(zhuan)
- Android开发--adb,SQLite数据库运用
- android 一分钟掌握圆形布局原理--圆形菜单控件 so easy
- 信息安全需求简要介绍
- CommVault Systems 2020面试经验分享(校园)
- Traveloka SDE3面试体验详细分享(校园)
- 算法题(如何打印给定字符串的所有子字符串())
- C++如何使用指针与引用(它们有什么区别?)
- Java如何使用方法(用法解释和代码示例)