[Android系统原理及开发要点详解

本书详细介绍了Android系统的各个方面,包括系统架构、开发环境、应用程序框架、Java虚拟机、GUI系统、音频和视频系统、多媒体系统、电话部分、连接部分、传感器系统以及应用程序设计思想。内容涵盖Android的起源、系统组件、SDK与源代码、窗口管理、Dalvik虚拟机、JNI接口、服务管理器、GUI框架、音频和视频服务、传感器API以及应用程序开发的关键概念和实践。
摘要由CSDN通过智能技术生成

 

第1章 Android系统概述 1
1.1 基础知识 1
1.1.1 Android开发系统的由来 1
1.1.2 移动电话系统开发模式 2
1.1.3 未来移动电话的功能及Android的优势 4
1.2 Android的开发工作 6
1.2.1 Android移植开发 6
1.2.2 Android应用开发 8
1.2.3 Android系统开发 9
1.3 Android的SDK与源代码 10
1.3.1 基于SDK的Android开发 10
1.3.2 基于源代码SDK Android开发 11

第2章 Android系统开发综述 13
2.1 Android的系统架构 13
2.1.1 软件结构 13

android程序库:

系统C库:一个从BSD继承来的标准C系统函数库(libc),它是专门为嵌入式Linux的设备制定的库

多媒体库:基于PacketVideo的OpenCore:该哭支持多种常用的音频视频格式回访和录制,支持多种媒体格式的编码解码格式。

SurfaceManager:显示子系统的管理器,并且为多个应用程序提供2D和3D图层的无缝融合。

LibWebCore:一个最新的Web浏览器引擎,支持Android浏览器以及一个可嵌入的Web视图。

SGL:Skia图形库,底层的2D图形引擎。

3Dlibraries:基于OpenGL ES1.0 API的实现:该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。

FreeType:位图(bitmap)和矢量(vector)字体显示。

3. Android 运行环境

android 有Dalvik java虚拟机和基础Java类库组成

Dalvik是Android中使用的Java虚拟机,每一个Android程序都运行在自己的进程中,都有一个Dalvik虚拟机实例。Dalvik被设计成一个可以同时运行多个虚拟机实例的虚拟系统

Davik运行针对小内存做了优化的Dex可执行文件

同时虚拟机是基于寄存器的,所有的类都经过Java编译,然后通过SDK中的dx工具转化成.dex格式虚拟机执行

Dalvik虚拟机依赖于Linux内核一些功能,比如线程机制和底层内存管理机制。

4、 Android应用程序框架

应用程序重用机制也使用户可以方便替换程序组件,包括

views:丰富而又可扩展的视图(Views):可以用来构建应用程序,包括列表(lists)、网格(grids)、文本框(text boxes),按钮(buttons)等基本的UI元素,甚至可嵌入的Web浏览器。

content providers :使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。

resource Manager:提供非代码资源的访问,如本地字符串,图形和布局文件(layout files).

Notification Manager : 使得应用程序可以在状态栏中显示自定义的提示信息。

Activity Manager:用来管理应用程序声明周期并提供常用的导航回退功能。

WindowManager是Android中一个重要的服务(Service )。WindowManager Service 是全局的,是唯一的。它将用户的操作,翻译成                                                         为指令,发送给呈现在界面上的各个Window。Activity会将顶级的控件注册到 Window Manager 中,
当用户点击触碰屏幕或键盘的时候,Window Manager就会通知到,而当控件有一些请求产生,也会经由ViewParent送回到Window                                                                Manager中。从而完成整个通信流程。
整个Android的窗口机制是基于一个叫做 WindowManager,这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端                                                           是屏幕,另一端就是View,通过WindowManager的 addView方法创建View,这样产生出来的View根据
WindowManager.LayoutParams属性不同,效果也就不同了。比如创建 系统顶级窗口,实现悬浮窗口效果!WindowManager的方法很                                                            简单,基本用到的就三addView,removeView,updateViewLayout。接口,而WindowManager.LayoutParams的属性就多了,非常丰富,                                                       具体请查后面介绍
怎么样获取windowManager实例呢,下面我们就通过一个小的例子来说明以下:
Button bb=new Button(getApplicationContext());  
WindowManager wmManager=(WindowManager) getSystemService(Context.WINDOW_SERVICE);  
WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();  
/** 
*以下都是WindowManager.LayoutParams的相关属性 
* 具体用途请参考SDK文档 
*/  
  wmParams.type=2002;   //这里是关键,你也可以试试2003  
  wmParams.format=1;  
/** 
*这里的flags也很关键 
*代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE; 
*40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8) 
*/  
  wmParams.flags=40;  
  wmParams.width=40;  
  wmParams.height=40;  
 
  wmManager.addView(bb, wmParams);  //创建View  
上面就是一个简单的例子,创建了一个Button对象然后通过WindowManager实例对象的addView添加这个ButtonVIew并根据相应的LayoutParams参数进行显示。
 
WindowManager对象的一些接口说明:
1)abstract Display  getDefaultDisplay();  //获取默认显示的 Display 对象。
2)abstract void removeViewImmediate(View view);//是removeView(View) 的一个特殊扩展,在方法返回前能够立即调用该视图层次的View.onDetachedFromWindow() 方法。
 
下面我们就重点介绍以下WindowManager接口的嵌套内部类LayoutParams。
WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;继承于 ViewGroup.LayoutParams 。它的内容十分丰富。其实WindowManager.java的主要内容就是由这个类定义构成。下面来分析一下这个类:
 
定义 
public static class WindowManager.LayoutParams 
extends ViewGroup.LayoutParams implements Parcelable
继承关系 
java.lang.Object
  ↳android.view.ViewGroup.LayoutParams
  ↳android.view.WindowManager.LayoutParams


继承来的属性与常量 
从 ViewManager.LayoutParams 继承来的属性:
android:layout_height
 Specifies the basic height of the view.


android:layout_width
 Specifies the basic width of the view.


从 ViewManager.LayoutParams继承的常量:
FILL_PARENT
WRAP_CONTENT
MATCH_PARENT
 
两个变量: 
width
height
 
属性及可用的常量定义 
1. public int x;
  如果忽略gravity属性,那么它表示窗口的绝对X位置。
  什么是gravity属性呢?简单地说,就是窗口如何停靠。
  当设置了 Gravity.LEFT 或 Gravity.RIGHT 之后,x值就表示到特定边的距离。
 
2. public int y;
  如果忽略gravity属性,那么它表示窗口的绝对Y位置。
  当设置了 Gravity.TOP 或 Gravity.BOTTOM 之后,y值就表示到特定边的距离。
 
3. public float horizontalWeight;
  public float verticalWeight;
  在纵/横向上,为关联的view预留了多少扩展空间(像素)。如果是0,那么此view不能被拉伸。
  其他情况下,扩展空间(像素)将被widget所均分。


4. public int type;
窗口类型。有3种主要类型:
a)Applicationwindows:
取值在 FIRST_APPLICATION_WINDOW 和 LAST_APPLICATION_WINDOW 之间。
是通常的、顶层的应用程序窗口。必须将 token 设置成 activity 的 token 。
b)Sub_windows:
取值在 FIRST_SUB_WINDOW 和 LAST_SUB_WINDOW 之间。
与顶层窗口相关联,token 必须设置为它所附着的宿主窗口的 token。
c)Systemwindows:
取值在 FIRST_SYSTEM_WINDOW 和 LAST_SYSTEM_WINDOW 之间。
用于特定的系统功能。它不能用于应用程序,使用时需要特殊权限。
下面定义了 type 的取值:
 应用程序窗口。
 public static final int FIRST_APPLICATION_WINDOW = 1;


 所有程序窗口的“基地”窗口,其他应用程序窗口都显示在它上面。     
 public static final int TYPE_BASE_APPLICATION   =1;       


 普通应哟功能程序窗口。token必须设置为Activity的token,以指出该窗口属谁。
 public static final int TYPE_APPLICATION       = 2;


 用于应用程序启动时所显示的窗口。应用本身不要使用这种类型。
 它用于让系统显示些信息,直到应用程序可以开启自己的窗口。   
 public static final int TYPE_APPLICATION_STARTING = 3;


 应用程序窗口结束。
 public static final int LAST_APPLICATION_WINDOW = 99;


 子窗口。子窗口的Z序和坐标空间都依赖于他们的宿主窗口。
 public static final int FIRST_SUB_WINDOW       = 1000;


 面板窗口,显示于宿主窗口上层。
 public static final int TYPE_APPLICATION_PANEL  = FIRST_SUB_WINDOW;


 媒体窗口,例如视频。显示于宿主窗口下层。
 public static final int TYPE_APPLICATION_MEDIA  = FIRST_SUB_WINDOW+1;


 应用程序窗口的子面板。显示于所有面板窗口的上层。(GUI的一般规律,越“子”越靠上)
 public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2;


 对话框。类似于面板窗口,绘制类似于顶层窗口,而不是宿主的子窗口。
 public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3;


 媒体信息。显示在媒体层和程序窗口之间,需要实现透明(半透明)效果。(例如显示字幕)
 public static final int TYPE_APPLICATION_MEDIA_OVERLAY  = FIRST_SUB_WINDOW +4;


 子窗口结束。( End of types of sub-windows )
 public static final int LAST_SUB_WINDOW        = 1999;


 系统窗口。非应用程序创建。
 public static final int FIRST_SYSTEM_WINDOW    = 2000;


 状态栏。只能有一个状态栏;它位于屏幕顶端,其他窗口都位于它下方。
 public static final int TYPE_STATUS_BAR        =  FIRST_SYSTEM_WINDOW;


 搜索栏。只能有一个搜索栏;它位于屏幕上方。
 public static final int TYPE_SEARCH_BAR        = FIRST_SYSTEM_WINDOW+1;


 电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
 public static final int TYPE_PHONE            = FIRST_SYSTEM_WINDOW+2;


 系统提示。它总是出现在应用程序窗口之上。
 public static final int TYPE_SYSTEM_ALERT      =  FIRST_SYSTEM_WINDOW +3;


 锁屏窗口。
 public static final int TYPE_KEYGUARD          = FIRST_SYSTEM_WINDOW +4;


 信息窗口。用于显示toast。
 public static final int TYPE_TOAST            = FIRST_SYSTEM_WINDOW +5;


 系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏。
 public static final int TYPE_SYSTEM_OVERLAY    =  FIRST_SYSTEM_WINDOW +6;


 电话优先,当锁屏时显示。此窗口不能获得输入焦点,否则影响锁屏。
 public static final int TYPE_PRIORITY_PHONE    =  FIRST_SYSTEM_WINDOW +7;


 系统对话框。(例如音量调节框)。
 public static final int TYPE_SYSTEM_DIALOG     =  FIRST_SYSTEM_WINDOW +8;


 锁屏时显示的对话框。
 public static final int TYPE_KEYGUARD_DIALOG   =  FIRST_SYSTEM_WINDOW +9;


 系统内部错误提示,显示于所有内容之上。
 public static final int TYPE_SYSTEM_ERROR      =  FIRST_SYSTEM_WINDOW +10;


 内部输入法窗口,显示于普通UI之上。应用程序可重新布局以免被此窗口覆盖。
 public static final int TYPE_INPUT_METHOD      =  FIRST_SYSTEM_WINDOW +11;


 内部输入法对话框,显

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值