首页 > Android开发学习笔记(二)——编译和运行原理(2)

Android开发学习笔记(二)——编译和运行原理(2)

      上篇介绍了应用程序从源码到安装包的整个过程,考虑到篇幅过长,遂将原理内容分成两部分来介绍。接下来,在本篇中,主要介绍Android平台应用程序的运行原理。

      在阅读了SDK文档中“Application Fundamentals”一篇的内容后,根据自己的理解绘制了下面的示意图:

Android应用程序运行原理图

      每个应用程序安装后,系统便会为其分配一个独立的存储空间,所谓的“Security Sandbox”,用于存放字节码文件、资源文件及配置文件等,同时,系统会为每一个应用程序分配唯一的ID,用以标识该应用程序的相关文件和资源,系统通过设置权限从而实现一个应用程序在一般情况下只能访问该应用程序的文件和资源。当应用程序或者它的某个组件需要运行时,系统便为其创建一个Linux进程,每个进程中实例化一个Dalvik虚拟机用以执行程序的字节码。程序运行中根据给自己设定的权限来访问相应的资源。这样的设计保证了应用程序间的独立性和安全性,但是,应用程序常常要访问其他应用程序的数据或者访问系统资源,为此,Android平台提供了两种方式来实现这一目的:

(1)可以安排两个应用程序共享一个ID,从而可以彼此访问对方的文件;还可以安排两个应用程序在一个进程中运行,并共享一个虚拟机

(2)应用程序在安装时,可以通过使用者来设置权限,根据设置的权限应用程序可以发起访问系统资源和数据的请求。

---------------------------------------------------------------------------------------------------------------------------------------------------

了解应用程序运行原理的目的是为了构建应用程序,因此了解上述内容是远远不够的,如果把上述内容理解成物理结构,那么下面所讲的便是以构成应用程序的基本组件为主的逻辑结构。

Android应用程序主要由四种不同类型的组件组成,分别是Activity(活动)、Service(服务)、Content Provider(内容提供者)和Broadcast Receiver(广播接收者):

◆Activity是一个显示在设备屏幕上的用户界面组件,有点儿类似视图(View)。一个应用程序可以包含多个Activity来呈现其不同的功能界面。在某一个程序允许的前提下,另一个程序可以启动该程序中的一个Activity来完成相应的功能。

◆Service是一个在后台运行的,没有用户界面,用以执行运行周期较长的操作或者执行远程进程的任务的组件。Activity可以启动一个Service并与其绑定用以实现二者之间的交互。

◆Content Provider是一个用于数据共享的组件。无论应用程序是以何种数据持久化形式保存的数据,通过Content Provider组件,其他应用程序可以访问或修改该应用程序的数据。

◆Broadcast Receiver是一个相应系统范围内的广播消息的组件。广播以Intent对象的形式发送,Broadcast Receiver接收后根据其内容作出相应操作。

Android系统这样设计的目的就是凸显组件的复用性,当一个程序需要使用另一个程序的组件时,首先需要向系统发送一个Intent来表明你的意图,系统根据权限设定,在允许的条件下,将组件所在的应用程序的进程启动,组件对应的类被实例化,组件执行完需要的功能后,将结果返回到调用该组件的应用程序,所以,Android应用程序与其他系统的应用程序不同,即没有单一的入口(例如Main函数)。对于组件激活的方式,不同的组件有不同的方式。其中,Activity、Service和Broadcast Receiver是被所谓“Intent”的异步消息激活的,Intent将独立的组件进行绑定;Content Provider是被来自Content Resolver的请求激活的。

      根据上述内容,结合自己的理解,将Android应用程序创建和运行的过程用下图描绘:

2011062614075250.png

      上述内容主要是对原理的宏观描述,可能看着有点儿晕,后续的博文会结合具体的实例程序来详细介绍。同时,这些毕竟是个人理解的结果,可能会有不少内容描述不准确,希望各位经验丰富者积极指正,谢谢!

转载于:https://www.cnblogs.com/Pickuper/archive/2011/06/18/2083263.html

更多相关:

  • MQ MQ传递主干, 在世界屡获殊荣。 它帮您搭建企业服务总线(ESB)的基础传输层。IBM WebSphere MQ为SOA提供可靠的消息传递。它为经过验证的消息传递主干, 全方位、 多用途的数据传输, 并帮助您搭建企业服务总线的传输基础设施。 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针...

  • 原文:http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签,她必须包含一个标签和指定的xmlns:android、 package两个属性。 属性: xmlns:android定义了Android的命名空间。这个属性一般可以设置为:"http://sch...

  • 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径。 2.System.Environment.CurrentDirectory -获取和设置当前目录(该进程从中启动的目录)的完全限定目录。 3.System.IO.Dire...

  • kuapingUI 2.2 版本发布,增加了一个比较实用的工具栏web组件,是由分享按钮组 + 联系按钮组构成,分享按钮组包含了 QQ空间、朋友圈、QQ、微信、微博等分享;联系按钮组包含了 微信、QQ、旺旺、Skype、电话等快捷沟通方式。演示地址 跨屏UI框架-响应式前端框架_基于Bootstrap的大组件UI框架​ui.kuapi...

  • 本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。#Vue 实现组件信息的缓存当我们在开发vue的项目过程中,避免不了在路由切换到其他的component再返回后该组件数据会重新加载,处理这种情况我们就需要用到keep-a...

  • 2020年Vue面试题Interview●●●●作者:@烦恼会解决烦恼vue核心知识——理论篇1、对于Vue是一套渐进式框架的理解渐进式代表的含义是:主张最少。Vue可能有些方面是不如React,不如Angular,但它是渐进的,没有强主张,你可以在原有大系统的上面,把一两个组件改用它实现,当jQuery用;也可以整个用它全家桶开...

  • app.component.html

    父组件字号:{{fontSizePx}}px

    app.component.ts ...fontSizePx=12...

  • app.component.html  app.component.ts import { Component } from '@angular/core'; @Component({selector: 'a...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...