《密西西比河谷州立大学:Android应用程序开发》(1)
《密西西比河谷州立大学:Android应用程序开发》(一) .
第一层:Linux操作系统和驱动(Linux kernel):由C语言实现。
Android核心系统服务依赖于Linux2.6内核,包括: 安全性、内存管理、进程管理、网络协议、驱动模型 。Linux内核也作为硬件和软件栈之间的抽象层。
除了标准的Linux内核外,Android还增加了内核的驱动程序: Binder(IPC)驱动、显示驱动、输入设备驱动、音频系统驱动、摄像头驱动、WiFi驱动、蓝牙驱动、电源管理。
第二层:本地框架和Java运行环境(LIBRARIES 和 ANDROID RUNTIME)
本地框架是有C/C++实现。包含C/C++库,被Android系统中不同组件使用,它们通过Android应用程序框架为开发者进行服务。
系统C库:(libc)从BSD继承过来的标准的C系统函数库,专门是为基于嵌入式Linux的设备定制的库。
多媒体库:基于PackerVideo的OpenCore;该库支持多种常用的音频、视频格式回放和录制,支持多种媒体格式的编和解码格式。
Suface Manager:显示子系统管理器,并且为多个应用程序提供2D和3D图层的无缝融合。
LibWebCore:一个最新的Web浏览器引擎,支持Android浏览器,以及一个可嵌入式的Web视图。
SGL:Skia图形库,底层的2D图形引擎。
3D libraries:基于OpenGL ES1.0 API的实现;该库可以使用硬件3D加速(如果可用),或者使用高度优化的3D软加速。
FreeType:位图(bitmap)和矢量(vector)字体显示。
Android运行环境 (ANDROID RUNTIME): 提供了Java编程语言核心库的大多数功能, 由Dalvik Java虚拟机和基础的Java类库组成 。
Dalvik是Android中使用的Java虚拟机,每个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
Dalvik被设计成一个可以同时高效运行多个虚拟机实例的虚拟系统。执行后缀名为.dex的Dalvik可执行文件,该格式的文件
针对小内存使用做出了优化。同时虚拟机是基于寄存器的,所有的类都是有Java编译器编译,然后通过SDK中的“dx”工具
转化为.dex格式由虚拟机执行。
Dalvik虚拟机依赖于Linux内核的一些功能,比如线程机制和底层内存管理机制。
第三层:Android应用框架(ANDROIDFRAMEWORK)
在Android系统中,开发人员也可以完全访问核心应用程序所使用的API框架。
第四层:Android应用程序(APPLICATIONS)
注意:Android应用程序都是有Java语言编写的。用户开发的Android应用程序和Android的核心应用程序是同一层次的,它们都是基于Android的系统API构建的。
每一个Android中应用的都是以linux中的进程形式运行,都有唯一的ID号。系统会管理所有的活动栈,生成堆栈。
4大组件详解:
1.Activity活动
呈现用户界面,从Activity基类中继承,一个操作就是一个activity(如列出一个电话表让用户选择上面的人)
2.Service服务
没有用户界面,响应Activity的选择,从Service基类中继承扩展,长时间后台运行,即使Activetiy退出了还能运行。(如音乐播放器在后台播放,就需要用到Service)
3.Broadcast Recevier
接受和响应广播,从BroadcastRecevier基类中继承扩展,应用也可以发出广播。(如下载完后通知其他应用,轮到它们使用网络了,广播过滤器的概念就是帮助应用APP过滤一些无用的广播,在Intent中用到)
4.Content Provider
管理应用数据,将应用的特定数据提供给其他应用。从ContentProvider基类中继承扩展。数据可以放在文件系统,或者数据库,任何地方。(如Android默认有一个Content Provider管理联系人数据库,给其他应用提供数据支持)
生命周期
Android应用程序不能控制它们自己的进程的生存期;而Android运行时可以管理每一个应用程序的进程,也就是说,它也可以管理进程内的每个活动。
一个 Android 程序的进程是何时被系统结束的呢?通俗地说,一个即将被系统关闭的程序是系统在内存不足(low memory)时,根据“重要性层次”选出来的“牺牲品”。一个进程的重要性是根据其中运行的部件和部件的状态决定的。各种进程按照重要性从高到低排列如 下:
1. 前台进程。这样的进程拥有一个在屏幕上显示并和用户交互的 activity 或者它的一个IntentReciver 正在运行。这样的程序重要性最高,只有在系统内存非常低,万不得已时才会被结束。
2. 可见进程。在屏幕上显示,但是不在前台的程序。比如一个前台进程以对话框的形式显示在该进程前面。这样的进程也很重要,它们只有在系统没有足够内存运行所有前台进程时,才会被结束。
3. 服务进程。这样的进程在后台持续运行,比如后台音乐播放、后台数据上传下载等。这样的进程对用户来说一般很有用,所以只有当系统没有足够内存来维持所有的前台和可见进程时,才会被结束。
4. 后台进程。这样的程序拥有一个用户不可见的 activity。这样的程序在系统内存不足时,按照 LRU 的顺序被结束。
5. 空进程。这样的进程不包含任何活动的程序部件。系统可能随时关闭这类进程。
Activity有三种基本状态:
- Active:处于屏幕前景(当前task的栈顶Activity处于Active状态),同一时刻只能有一个Activity处于Active状态;
- Paused状态:处于背景画面画面状态,失去了焦点,但依然是活动状态;
- stopped:不可见,但依然保持所有的状态和内存信息。
[java] view plaincopyprint
- void onCreate(Bundle savedInstanceState)
- void onStart()
- void onRestart()
- void onResume()
- void onPause()
- void onStop()
- void onDestroy()
void onCreate(Bundle savedInstanceState) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy()
这些都是钩子函数,你可以重写他们。所有的activity在首次运行时必须实现onCreate()方法来初始化安装。activity可以实现onPause()来提交数据改变,然后准备停止与用户的交互。
1、onCreate()
Acitivity首次创建时被调用。用于设置Acitivity的布局文件,绑定按钮监听器等一些普通静态操作。
2、onStart()
Acitivity对用户可见时被调用。
3、onResume()
Acitivity获得用户焦点,即用户可操作该Acitivity时被调用。
4、onPause()
应用程序启动了其它Acitivity时被调用。一般用于保存当前Acitivity中的数据。
5、onStop()
Acitivity不可见时被调用。
6、onRestart()
已停止的Acitivity重新启动时被调用。
7、onDestroy()
调用Acitivity的finish()方法或Android系统资源不足时被调用。
Activity starts -->onCreate()-->onStart()-->onResume()-->activity is running--another activity comes in front of this activity-->onPause()--the activity is no longer visivble-->onStop()-->onDestroy()-->activity is shut down
意图Intent:
android.content.Intent实例化。描述要执行的操作(如发送邮件),或广播(如摄像头已经被激活),从一个Activity转到另一个Activity的方法。通过向另一个Activity传送两段数据,动作Action和该处理动作所需数据的URL。
通常用的是隐式Intent,显式一般只在应用内部传递消息。
Intent filter过滤器让组件能接收到其所公告的类型的隐式Intent。如果组件没有过滤器则只接受显式Intent。
隐性意图 :只表示要干的事,不指明Activity对象。如果存在多个适合的Activity则系统会出现列表让用户选择(如打开网页,出现选择浏览器的提示框)。
显性意图 :让另一个Activity干某件事,指明Activity的名称。