Android 应用框架

Android 应用组件

对Android应用程序而言,应用组件主要由Activity、Service、Broadcast Receivers、Intent、Content Providers、AndroidManifest等构成。

Activity是与用户直接交互UI组件; Service是运行在后台、用户不可见的服务组件;Broadcast Receivers是进行系统消息广播的广播组件;Intent是应用组件间、进程间进行通信的通信组件;Content Providers是不同应用间传递、分享数据的内容组件;Android Manifest为应用程序的管理组件。

其他组件还有App Widgets、Graphics、Audio and Video、Data Storage、Resources等

Activity

在通常情况下,Activity作为一个全屏的窗口出现,也可以作为浮动窗口或者其他Activity的子Activity出现。

在Android中,Activity的管理是通过Activity栈的方式来进行的,在Activity的生命周期中,存在4种状态:激活(active)、运行(running)、停止(stopped)、暂停(paused)。

主要的Activity属性包括:taskAffinity 、launchMode 、allowTaskReparenting 、clearTaskOnLaunch 、alwaysRetainTaskState finishOnTaskLaunce等。

Services

服务(Services)组件通常运行在后台,对用户而言不具有可视性,守护进程和硬件服务、原生服务等多是服务组件。

AIDL 接口:

服务根据驻留的对象不同可以分为本地服务(Local Services)和远程服务(Romate Services)

一般将远程服务分为应用级远程服务和系统级远程服务两种

系统级的服务实现颇为复杂。除了定义服务本身外,还需要定义被上层应用调用的接口。一般通过AIDL调用。而应用级远程服务除了AIDL外,Android还提供了较为简单的Message方式的调用。但如果实现的服务希望被其他应用调用,则必须通过AIDL进行。

Broadcast Receivers

广播接收器(Broadcast Receivers)是用来接收或者响应广播、通告的一个应用组件,它与通知管理器密切相关。当时区发生改变、电量不足、工作语言发生改变等事件发生时,注册相应广播接收器的应用将会收到这些信息。

广播分为两种类型:标准广播(Normal broadcasts)、顺序广播(Ordered broadcasts)

标准广播指广播是完全异步的,所有的接收器处于无序的运行状态。这类广播通过Context.sendBroadcast()方法发送。

顺序广播则按照一定的优先级进行广播,高优先级的接收器向低优先级的接收器转播广播

Intent

在Android中,应用组件也是通过Intent来激活的,其中内容提供器是通过ContentResolver发出请求的方式来激活的,而Activity、服务和广播接收器则是通过所谓的Intent异步消息的方式来激活的。

利用Intent激活组件的操作方法有:startActivity(Intent)、startService(Intent)、bindService(Intent, ServiceConnection, int)、sendBroadcast(Intent)等,其中startActivity()方法用于发起Activity,startService()方法用于发起服务,bindService()方法用于绑定服务,而sendBroadcast()方法则用来向所有关联的广播接收器发送广播。

在通信过程中,Intent负责对通信消息进行描述,Android则根据Intent的描述,找到匹配的组件,将Intent传递给匹配的组件,并完成组件的调用。

Intent在通信过程中起着媒介的作用,专门传递组件互相调用的相关信息,实现了调用者与被调用者之间的解耦

在Android中,Intent携带的信息主要有两种属性:行为(Action)和数据(Data)。其他属性还有类别(Category)、数据类型(Type)、组件(Component)、附加信息(extras)等。

Content Providers

内容提供器(Content Providers)是Android提供的一个在不同应用间传递、分享数据的机制,这些数据可以存储在文件系统、SQLite数据库等中。

Android Manifest

在Android启动应用之前,它必须了解应用组件的情况,在Android中,应用运行涉及的多数应用组件都必须在AndroidManifest.xml中声明

对于Activity,对应的元素为“activity”;对于服务,对应的元素为“service”;对于广播接收器,对应的元素为“receiver”;对于内容提供器,对应的元素为“provider”

对于系统定义的Action,默认的前缀为android.intent.action,

常用的Action有android.intent.action.MAIN、android.intent.action.WEB_SEARCH。

对于开发者自定义的Action,建议以所在包的包名作为前缀以保证命名的唯一性,

如com.miaozl.helloworld.TRANSMOGRIFY。

Activity 和Tasks

作为和用户之间直接交互的UI组件,Activity执行的是一个窗口的功能,Tasks则是Activity的堆栈

进程和线程

在默认情况下,每个应用均运行在其独自拥有的Linux进程中,而每个进程拥有一个唯一的Java虚拟机(Dalvik)和一个唯一的Linux用户ID。

组件生命周期

Activity生命周期

在系统中,Activity由Activity栈即Tasks来管理,Activity在其整个生命周期中,有4个状态:运行(running)、暂停(paused)、停止(stopped)、销毁(Destroyed)

1.当一个Activity被置于前台时,该Activity处于“running”状态

2.当一个Activity失去焦点但仍然可视时,该Activity处于“paused”状态

3.当一个Activity完全不可视时,该Activity处于“stopped”状态

4.当一个Activity因为某种原因被销毁时,该Activity将处于“Destroyed”状态

Services生命周期

服务通常作为后台进程运行,通过Context.startService()方法可以启动服务,如果需要销毁一个服务,则可以调用Context.stopService()、Service.stopSelf()、Service.stopSelfResult()等方法。

当客户端需要和服务进行绑定来利用服务时,需要调用Context.bindService()方法,结束绑定需要调用Context.unbindService()方法

Broadcast Receivers生命周期

Broadcast Receivers

void onReceive(Context curContext, Intent broadcastMsg)

当一个广播消息到达时,Android会调用BroadcastReceiver ::onReceive()方法来处理消息,在处理过程中,广播接收器处于激活状态,当处理结束时,广播接收器处于去活状态

注册一个广播接收器的方法为Context::registerReceiver(BroadcastReceiver,IntentFilter)

进程生命周期

在Android中,根据进程中运行的组件,以及组件的状态将进程分为5类:

前台进程(foreground process)、可视进程(visible process)、服务进程(service process)、后台进程(background process)、空进程(empty process)

1)前台进程当一个进程出现如下场景时,该进程被称为前台进程。场景包括:正在运行一个与用户交互的Activity。驻留了一个与用户交互的Activity相绑定的服务。拥有一个正在执行生命周期调用(onCreate(),onStart()、onDestroy())的服务对象

2)可视进程当一个进程没有包含任何前台组件,但对用户视觉有影响时,该进程被称为可视进程。这类进程的典型场景包括弹出窗口隐藏的全屏窗口等。另外驻留了与处于“paused”状态的Activity绑定的服务进程也属于这类进程

3)服务进程当进程中驻留了一个服务组件时,该进程称为服务进程,除非系统已经没有足够的内存去运行前台进程和可视进程,否则服务进程将一直在系统中保持运行。这类进程的典型场景如Mp3的后台播放

4)后台进程当进程的所有Activity对用户而言均不可见时,对用户体验来说没有直接的影响,这些进程称为后台进程。为了满足更重要的进程的资源需求,后台进程可能会被系统杀死

5)空进程当一个进程没有驻留任何激活的应用组件时,该进程称为空进程,这类进程仍存在于系统中的原因是,作为缓冲可以提高进程的下次启动时间。但为了保证系统的正常运行,当系统资源濒临不足时,Android常会选择杀死这类进程

启动过程

Android系统启动流程详细图解

12-19 09:38