【并行编程】系统体系结构和组件具体说明

写在前面的话

假设对Android开发还不是特别了解的同学。能够參考我之前翻译的Android开发教程。

http://blog.csdn.net/column/details/development4android.html

软件栈


Applications

应用层。包含使用Java库和Android框架所编写的程序。

Core Java
Java类库,并非全然的Java SE或Java ME的实现。而是Apache Harmony的一个实现。基于Java5。这一层提供基础的Java线程机制。包含java.lang.Thread类和java.util.concurrent包。
Application framework
Android框架层,主要负责处理窗体系统。UI组件,资源等。基本上,要编写一个Android应用所须要的全部类都在这一层。

同一时候,Android框架定义和管理Android组件的生命周期和它们之间的通信。

而且,Android框架定义了一系列Android特有的异步机制,包含HandlerThread。AsyncTask,IntentService,AsyncQueryHandler和Loaders。

Native libraries
C/C++库层,主要负责处理图像。音视频。数据库,字体,OpenGL等。Java所编写的程序并不直接和这一层交流,由于Android框架已经对这些本地代码进行了封装。
Runtime
运行时环境。即Dalvik虚拟机。为每个Android应用程序提供了一个沙盒,Dalvik虚拟机运行.dex文件。每个程序都运行在它专有的Dalvik虚拟机中。

Linux kernel
Linux内核,即潜在的操作系统。

负责让程序使用硬件功能,比如声音,网络。相机等。

同一时候,负责管理进程和线程。

为每个程序开启一个进程。每个进程掌管一个Dalvik虚拟机。

在进程中。多线程运行程序的代码。

Linux内核通过调度机制。为进程和它们的线程分配可用的CPU运行时间。

程序架构

一个程序的基础是Application对象以及Android的组件:Activity,Service。BroadcastReceiver和ContentProvider。

程序 Application

一个程序在Java中的表达方式就是android.app.Application对象。

当程序开启的时候,这个对象被创建,程序停止时被销毁。也就是说,Application对象经历一个Linux进程的完整生命周期。

当Linux进程又一次开启的时候,一个新的Application对象也被创建了。

组件

Android的组件包含Activity,BroadcastReceiver。Service和ContentProvider。

这些实体有不同的责任和生命周期,但它们都代表了程序的入口,也就是程序启动的地方。

Intent

一个组件唤醒还有一个组件是通过Intent才干实现的,这个过程能够发生在同一个程序中或多个程序之间。

Intent分为显式的和隐式的:

显式的 Intent
定义一个组件的完整的名字,这个名字在运行时能够能够被程序识别。
隐式的 Intent
通过IntentFilter在运行时与组件绑定,须要在IntentFilter中定义一些“协议”。

假设Intent与IntentFilter中的“协议”匹配,那么这个组件就会被启动。

组件的生命周期是Android系统特定的技术,它们不与潜在的Java对象匹配。一个Java对象能够比它的组件存活的时间要久,而且。Dalvik虚拟机能够保存与一个组件的相应的多个对象。小心,这会导致内存泄漏。我会在后面对多线程造成的内存泄漏进行分析。

通常。实现一个组件的方式是子类化它。

而且。一个程序中全部的组件都要在AndroidManifest.xml中进行注冊。

Activity

一个Activity就是一个屏幕。通常占领了设备的全部屏幕尺寸。它用来展示信息,处理用户的输入等。

包含全部的UI组件,比如button。文本框,图片等。

Activity持有一个对全部视图树的对象引用。所以它占领的内存会变的非常大。

当用户在不同的屏幕之间导航的时候,Activity实例从一个栈里面被初始化。当导航到一个新的屏幕时,一个新的Activity被压入到栈里,当返回到之前的屏幕时,Activity被从栈中弹出。

在以下的图中,首先开启了一个Activity A,接着切换到B。同一时候A销毁;然后切换到C和D。A,B,C是全屏显示的,可是D是窗体模式的,只占领了屏幕的一部分空间。A全然被销毁了,B是不可见的。C是部分可见的,D是全部可见的,而且D在栈顶。因此,D获得了焦点而且能够接收用户的输入。

Activity在栈里面的位置,决定了Activity的状态:

  • 可见而且处于活跃状态: D
  • 暂停而且部分可见: C
  • 停止而且全然不可见: B
  • 不可交互而且已经全然销毁: A

一个程序中最顶端的Activity。对这个程序在系统中的优先级是有一定影响的。这里所谓的优先级就是进程的优先级,这将影响一个程序被终止的几率和分配给这个程序中线程的运行时间。

按返回键或者调用finish()方法都会终止一个Activity的生命周期。

Service

Service是在后台运行的。它是不可见的。和用户之间也没有不论什么交互的。能够用来从其它组件卸载一些操作,这些操作比那些组件活的要长。一个Service能够用过两种方式去运行,start或bind:

Started Service
通过调用Context.startService(Intent)开启服务,这里的Intent既能够是隐式的,也能够是显式的。假设想要停止服务。调用 Context.stopService(Intent)。

Bound Service
通过调用Context.bindService(Intent, ServiceConnection, int),多个组件能够绑定同一个Service。这里的Intent既能够是隐式的。也能够是显式的。绑定之后。通过ServiceConnection接口与Service进行通信。假设想要停止服务,调用 Context.unbindService(ServiceConnection)。当最后一个组件与Service解绑后,这个Service就会被销毁。

ContentProvider

一个程序想要共享大量的数据。无论是在这个程序中。还是多个程序之间,都能够使用ContentProvider。

它提供了获取数据的入口。通常适合SQLite数据库一起使用。SQLite数据库是对程序私有的,可是通过ContentProvider就能够实现进程之间的数据共享了。

BroadcastReceiver

它监听从一个程序之中。程序之间,或系统发出的Intent。总而言之,就是它监听手机中全部的Intent。然后过滤这些收到的Intent。确定哪一个须要被处理。

一个BroadcastReceiver应该动态注冊,也就是说注冊在须要使用它的地方。这样能够对它进行控制。

假设静态注冊在了AndroidManifest.xml中,那么当这个程序在安装的时候,它就一直在监听Intent,无论这些Intent对它是不是实用。

如此一来。假设某一个Intent匹配了某一个IntentFilter,那么这个BroadcastReceiver就会开启与之关联的程序。

这里具体说一下,假设有一个程序A。在AndroidManifest.xml中注冊了一个监听网络变化的BroadcastReceiver。

此时,A没有被打开,也就是说此时系统中并没有A的进程。

当系统的网络发生变化时,由于这个BroadcastReceiver的存在,A的进程被创建了。A相应的Application对象也就随之被创建了!

由于BroadcastReceiver被认定是进入一个app的入口。这样的入口还包含Activity。Service和ContentProvider。

參考资料

http://developer.android.com/guide/components/index.html

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-21 22:38:07

【并行编程】系统体系结构和组件具体说明的相关文章

并行编程入门

目录 1. 并行编程简介 2. MapReduce 2.1 MapReduce简介 2.2 MapReduce框架 2.3 Hadoop介绍 2.4 Hadoop基本类 2.5 Hadoop编程实例 1.并行编程简介 1.1.并行编程作用,用途 商业用途,科学计算,大数据分析 1.2.并行编程兴起原因 目前的串行编程的局限性 使用的流水线等隐式并行模式的局限性 硬件的发展 1.3.并行算法设计原则步骤 a.分析问题 b.分解问题 其中分解方法有: 数据分解 递归分解 探测性分解 推测性分解 混合

OpenCL学习笔记(二):并行编程概念理解

欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 并行编程的需求是显而易见的,其最大的难题是找到算法的并行功能,同时必须处理数据的共享和同步.但是,因为每一个算法都是不一样的,很难有通用的并行功能--粒度都有可能是不一样的.OpenCL提供了很多并行的抽象模型,因此算法开发人员可以在不同粒度上开发并行的算法,以及数据的共享和同步. 一般来说,并行编程有两种大类型--分散收集(s

C#中的多线程 - 并行编程 z

原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行

如何进行并行编程:从并行矩阵运算开始

并行计算,就是多个进程并行协作,完成特定的任务.现在我们假定一个并行系统,包含了p个处理机,每个处理机一个进程,我们可以分别用字符“0”,“1”,...,“p-1”来引用它们,或者为了清晰,我们用 Pi 来引用它们,i 表示一个进程的进程号,进程之间可以相互传递消息,所谓消息,指的是一个数据结构. 在并行编程中,我们用程序代码定义好一个过程,每个进程都将运行这段程序代码定义的过程,也就是说,代码必须是通用的.接下来我们用并行矩阵计算的实例来说明. 矩阵计算 矩阵计算问题有很多种类型,例如: 求解

.Net中的并行编程-2.ConcurrentStack的实现与分析

在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现. 首先解释一下什么这里“无锁”的相关概念. 所谓无锁其实就是在普通栈的实现方式上使用了原子操作,原子操作的原理就是CPU在系统总线上设置一个信号,当其他线程对同一块内存进行访问时CPU监测到该信号存在会,然后当前线程会等待信号释放后才能对内存进行访问.原子操作都是由操作系统API实现底层由硬件支持,常用的操

iOS 并行编程:Operation Queues

1 简介 1.1 功能        Operation Queue也是IOS的一种并行编程技术,类似Dispatch Queue可以帮助用户管理多线程.但是Operation Queue将任务封装在NSOperation对象中,从而可以更好的控制任务的执行.并且Dispatch Queue的先入先出的执行方式不同,Operation Queue任务的执行顺序可以控制.其中IOS是将任务交给NSOperation对象进行管理,其中NSOperation是个抽象类,必须被继承,目前系统预定义了两个

并行编程中的内存回收Hazard Pointer

接上篇使用RCU技术实现读写线程无锁,在没有GC机制的语言中,要实现Lock free的算法,就免不了要自己处理内存回收的问题. Hazard Pointer是另一种处理这个问题的算法,而且相比起来不但简单,功能也很强大.锁无关的数据结构与Hazard指针中讲得很好,Wikipedia Hazard pointer也描述得比较清楚,所以我这里就不讲那么细了. 一个简单的实现可以参考我的github haz_ptr.c 原理 基本原理无非也是读线程对指针进行标识,指针(指向的内存)要释放时都会缓存

.Net中的并行编程-5.流水线模型实战

自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口).... 上篇文章<.Net中的并行编程-4.实现高性能异步队列>介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了处理多线程问题及基于异步队列底层数据结构的解决方案. 需求如下:1.提供数据服写入务供上层应用调用,数据写入服务处理的吞吐量要达到60w/s每秒,也就是用户每秒发送60w的数据然后通过数据写入服务写到数据库中(数据库为公司自主研发的实时数据库). 2.尽量简化上层应用调用服务的复杂度. 一.分析性能瓶颈: 1

python并行编程

并行编程的思想:分而治之,有两种模型 1.MapReduce:将任务划分为可并行的多个子任务,每个子任务完成后合并得到结果 例子:统计不同形状的个数. 先通过map进行映射到多个子任务,分别统计个数,然后在用reduce进行归纳一下. 2.流水:将任务分为串行的多个子任务,每个子任务并行.ProductConsume 例子: 多个生产者进行并行,多个消费者进行并行.生产者生产出来东西放到队列里:队列里有东西时,消费者就可以进行消费,这样双方没有太大的依赖关系. 为什么要并行编程呢? 多核,云计算