《深入理解Android 5 源代码》——第1章,第1.3节五大组件

1.3 五大组件
在分析Android的源代码之前,很有必要先了解一下Android应用程序的核心组件功能。一个典型的Android应用程序通常由5个组件组成,这5个组件构成了Android的核心功能。在本节的内容中,将详细讲解这五大组件的基本知识。

1.3.1 ctivity界面
Activities是这5个组件中最常用的一个组件。程序中Activity通常的表现形式是一个单独的界面(screen)。每个Aactivity都是一个单独的类,它扩展实现了Activity基础类。这个类显示为一个由Views组成的用户界面,并响应事件。大多数程序有多个Activity。例如,一个文本信息程序有这么几个界面:显示联系人列表界面、写信息界面、查看信息界面或者设置界面等。每个界面都是一个Activity。切换到另一个界面就是载入一个新的Activity。某些情况下,一个Activity可能会给前一个Activity返回值,例如,一个让用户选择相片的Activity会把选择到的相片返回给其调用者。

打开一个新界面后,前一个界面就被暂停,并放入历史栈中(界面切换历史栈)。使用者可以回溯前面已经打开的存放在历史栈中的界面。也可以从历史栈中删除没有价值的界面。Android在历史栈中保留程序运行产生的所有界面:从第一个界面到最后一个。

1.3.2 Intent和Intent Filters切换
Android通过一个专门的Intent类来进行界面的切换。Intent描述了程序想做什么(Intent意为意图、目的、意向)。Intent类还有一个相关类IntentFilter。Intent是一个请求来做什么事情,Intent Filters则描述了一个Activity(或下文的Intent Receiver)能处理什么意图。显示某人联系信息的Activity使用了一个IntentFilter,就是说它知道如何处理应用到此人数据的视图(View)操作。Activities在文件AndroidManifest.xml中使用Intent Filters。

通过解析Intents可以实现Activity的切换,可以使用startActivity(myIntent)启用新的Activity。系统会考察所有安装程序的Intent Filters,然后找到与myIntent匹配最好的Intent Filters所对应的Activity。这个新Activity能够接收Intent传来的消息,并因此被启用。解析Intents的过程发生在startActivity被实时调用时,这样做有如下两个好处。

(1)Activities仅发出一个Intent请求,便能重用其他组件的功能。

(2)Activities可以随时被替换为有等价IntentFilter的新Activity。

1.3.3 Service(服务)
Service是一个没有UI且长驻系统的代码,最常见的例子是媒体播放器从播放列表中播放歌曲。在媒体播放器程序中,可能有一个或多个Activities让用户选择播放的歌曲。然而在后台播放歌曲时无需Activity干涉,因为用户希望在音乐播放的同时能够切换到其他界面。既然这样,媒体播放器Activity需要通过Context.startService()启动一个Service,这个Service在后台运行以保持继续播放音乐。在媒体播放器被关闭之前,系统会保持音乐在后台播放。可以用Context.bindService()方法连接到一个Service上(如果Service未运行的话,连接后还会启动它),连接后就可以通过一个Service提供的接口与Service进行通话。对音乐Service来说,提供了暂停和重放等功能。

1.如何使用服务
在Android系统中,有如下两种使用Service的方法。

(1)通过调用Context.startServece()启动服务,调用Context.stoptService()结束服务,startService()可以传递参数给Service。

(2)通过调用Context.bindService()启动,调用Context.unbindService()结束,还可以通过ServiceConnection访问Service。二者可以混合使用,例如,可以先startServece()再unbindService()。

2.Service的生命周期
在使用startService()方法启动服务后,即使调用startService()的进程结束了,Service还仍然存在,一直到有进程调用stoptService()或Service自己灭亡(stopSelf())为止。

在bindService()后,Service就和调用bindService()的进程同生共死,也就是说当调用bindService()的进程死了,那么它绑定的Service也要跟着被结束,当然期间也可以调用unbindService()让Service结束。

当混合使用上述两种方式时,例如,你用了startService(),我用了bindService(),那么只有你stoptService()了而且我也unbindService()了,这个Service才会被结束。

3.进程生命周期
在Android系统中,会尝试保留那些启动了的或者绑定了的服务进程,具体规则如下所示。

(1)如果该服务正在进程的onCreate()、onStart()或者onDestroy()这些方法中执行时,那么主进程将会成为一个前台进程,以确保此代码不会被停止。

(2)如果服务已经开始,那么它的主进程的重要性会低于所有的可见进程,但是会高于不可见进程。由于只有少数几个进程是用户可见的,所以只要不是内存特别少,该服务就不会停止。

(3)如果有多个客户端绑定了服务,只要客户端中的一个对于用户是可见的,就可以认为该服务可见。

1.3.4 Broadcast Receiver发送广播
在Android系统中,Broadcast Receiver是一个广播接收器组件。广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的,例如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播,例如,通知其他应用程序一些数据下载完成并处于可用状态。应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应,所有的接收器均继承自BroadcastReceiver基类。

在Android系统中,广播接收器Broadcast Receiver没有用户界面。然而,它们可以启动一个Activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力——闪动背灯、振动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

Android中的广播事件有两种,一种是系统广播事件,例如:ACTIONBOOT_COMPLETED(系统启动完成后触发)、ACTION_TIME_CHANGED(系统时间改变时触发)、ACTION BATTERY_LOW(电量低时触发)等。另一种是我们自定义的广播事件。

在Android系统中,广播事件的基本流程如下所示。

(1)注册广播事件:注册方式有两种,一种是静态注册,即在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。

(2)发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。

(3)接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android会弹出超时对话框。

1.3.5 用Content Provider存储数据
在Android系统中,应用程序会把数据存放在一个SQLite数据库格式文件里,或者存放在其他有效设备里。如果想让其他程序能够使用我们程序中的数据,此时Content Provider就很有用了。Content Provider是一个实现了一系列标准方法的类,这个类使得其他程序能存储、读取某种Content Provider可处理的数据。

时间: 2024-07-28 13:16:36

《深入理解Android 5 源代码》——第1章,第1.3节五大组件的相关文章

《深入理解Android 5 源代码》——导读

目 录前 言 第1章 Android系统介绍 1.1节Android系统介绍1.2节剖析Android系统架构1.3节五大组件1.4节进程和线程第2章 获取并编译Android源代码 2.1节获取并编译Android源代码2.2节分析Android源代码结构2.3节Android源代码提供的接口2.4节编译源代码2.5节编译源代码生成SDK第3章 分析Java Native Interface系统第4章 分析HAL系统第5章 分析IPC通信机制第6章 分析Binder对象和Java接口第7章 分

《深入理解Android》一第1章 搭建源代码编译环境

第1章 搭建源代码编译环境 本章主要内容 Android全源码开发环境: Android常用工具及相关技巧说明: WebKit代码目录结构及全书内容概要: WebKit源代码调试. 作为全书的第1章,首先要介绍的是Android系统以及WebKit全源码开发环境的背景信息.

《深入理解Android 5 源代码》——第2章,第2.5节编译源代码生成SDK

2.5 编译源代码生成SDK在Android 5.0的源代码的根目录下有一个SDK目录,所有和SDK相关的代码都放在这个目录中,包括镜像文件.模拟器和ADB等常用工具,以及SDK中的开发包的文档,可以通过编译的方式来生成开发需要的SDK,编译命令如下所示: $ Make SDK 当编译完成后,会在/out/host/linux-x86/sdk/目录下生成SDK,这个SDK是完全与源代码同步的,与官方网站上下载的SDK功能完全相同,包含了开发用的JAR包.模拟器管理工具和ADB调试工具,可以使用这

《深入理解Android 5 源代码》——第2章,第2.2节分析Android源代码结构

2.2 分析Android源代码结构 获得Android 5.0源代码后,源代码的全部工程分为以下3个部分. Core Project:核心工程部分,这是建立Android系统的基础,被保存在根目录的各个文件夹中. External Project:扩展工程部分,可以使其他开源项目具有扩展功能,被保存在"external"文件夹中. Package:包部分,提供了Android的应用程序.内容提供者.输入法和服务,被保存在"package"文件夹中. 在本节的内容中

《深入理解Android 5 源代码》——第2章,第2.3节Android源代码提供的接口

2.3 Android源代码提供的接口我们知道,Android源代码当中提供了很多资源.工具或者文档供开发者使用,当然,其中也包括应用程序开发接口的实现,也就是我们开发应用程序所使用的SDK的API.正是由于有了这些种类丰富.功能强大.抽象程度高的接口,才让我们开发应用程序变得简单方便.在本节的内容中,将详细讲解Android系统中这些接口的基本知识. 2.3.1 暴露接口和隐藏接口我们可以将Android源代码编译生成一个SDK,这个SDK的功能等同于官方网站上单独下载的SDK开发包.这说明在

《深入理解Android 5 源代码》——第2章,第2.4节编译源代码

2.4 编译源代码编译Android源代码的方法非常简单,只需使用Android源代码根目录下的Makefile,执行make命令即可实现.当然在编译Android源代码之前,首先要确定已经完成同步工作.进入Android源代码目录使用make命令进行编译,使用此命令的格式如下所示: $: cd ~/Android5.0(这里的"Android就是我们下载源代码的保存目录) $: make 编译Android源代码可以得到"~/project/android/cupcake/out&q

《深入理解Android 5 源代码》——第1章,第1.4节进程和线程

1.4 进程和线程Android系统中也有进程和线程,代表当前系统中正在运行的程序.当第一次运行某个组件的时候,Android会启动一个进程.在默认情况下,所有的组件和程序运行在这个进程和线程中,也可以安排组件在其他的进程或者线程中运行.在本节的内容中,简要讲解Android进程和线程的基本知识. 1.4.1 什么是进程组件运行的进程由manifest file控制的.组件的节点一般都包含一个process属性,例如..和节点.属性process可以设置组件运行的进程,可以配置组件在一个独立进程

《深入理解Android》一第3章 WTF的实现及使用

第3章 WTF的实现及使用本章主要内容分析OwnPtr和RefPtr的实现及使用分析Assert与Android crash dump分析WTF内存管理及容器类分析原子操作介绍Android WebKit的运行结构第2章对WebKit的整体结构做了介绍,从宏观上勾画出了WebKit的轮廓,使读者据此对WebKit有了整体的了解.从本章起读者将与笔者一道拿起"手术刀",精确剖析WebKit的实现细节,对WebKit建立起具体的认识.对于WebKit的分析,起点一定是其C++基础库-WTF

《深入理解Android》一第2章 浏览器工作原理及WebKit概览

第2章 浏览器工作原理及WebKit概览本章主要内容简述浏览器的工作原理介绍浏览器内核发展史概述WebKit架构第1章为读者说明了Android源码的编译环境本书内容概要,在本章中将阐述万维网技术的基本概念和浏览器的主要工作原理,并简单介绍和对比主流的全功能浏览器内核以及WebKit项目的历史和现状,最后着重描述WebKit内核的架构流程和设计思想.