写在前面的话
如果对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。
一个程序在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就是一个屏幕,通常占据了设备的全部屏幕尺寸。它用来展示信息,处理用户的输入等。包括所有的UI组件,例如按钮,文本框,图片等。
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可以用过两种方式去执行,start或bind:
StartedService
通过调用Context.startService(Intent)开启服务,这里的Intent既可以是隐式的,也可以是显式的。如果想要停止服务,调用Context.stopService(Intent)。
BoundService
通过调用Context.bindService(Intent, ServiceConnection, int),多个组件可以绑定同一个Service,这里的Intent既可以是隐式的,也可以是显式的。绑定之后,通过ServiceConnection接口与Service进行通信。如果想要停止服务,调用Context.unbindService(ServiceConnection)。当最后一个组件与Service解绑后,这个Service就会被销毁。
一个程序想要共享大量的数据,不管是在这个程序中,还是多个程序之间,都可以使用ContentProvider。
它提供了获取数据的入口,通常适合SQLite数据库一起使用。SQLite数据库是对程序私有的,但是通过ContentProvider就可以实现进程之间的数据共享了。
它监听从一个程序之中,程序之间,或系统发出的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。
分享到:
相关推荐
高并发编程第三阶段07讲 AtomicReference详解,CAS算法带来的ABA问题详解.mp4 高并发编程第三阶段08讲 AtomicStampReference详解,解决CAS带来的ABA问题.mp4 高并发编程第三阶段09讲 AtomicIntegerArray,...
阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...
阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...
再谈Android推送实现:《千万级并发在线推送系统架构解析》| 个信互动 叶新江 | Android DevCamp 主题简介: 移动短消息是大家所熟知的一种信息推送方式, 基于信令通道的推送在简单信息的体验方面已经被大家所...
大型互联网并发编程Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
Java高并发编程,构建并发编程知识体系,提升面试成功率,完整版17章视频教程下载。 本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段...
java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
高并发高负载网站系统架构 许令波
java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea
高并发和并发编程并发编程:线程安全+线程封闭+线程调度
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
个人学习资料集锦 包括并发编程、架构实践等。
自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及...
并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术...
高并发高负载网站系统架构是涉及计算机硬件技术和软件技术多方面知识综合的研究课题,本文论述了高并发高负载网站系统架构发展现状、目前主要的解决方案,并重点介绍了数据库集群技术和WEB缓存技术,最后论述了网络负载...
高并发高负载系统架构目录 1、为什么要进行高并发和高负载的研究 2、高并发和高负载的约束条件 3、解决之道——硬件篇 4、解决之道——部署篇 5、解决之道——环境篇 6、解决之道——SiteEngine篇 7、解决之道——...
并发编程并发编程并发编程