第一部分:开发前的准备-第三章 Application 基本原理
第3章 应用程序基本原理
首先我们需要强调一下Android 应用程序是用java写的。Android SDK工具编译代码并把资源文件和数据打包成一个文件。这个名字的扩展名是.APK。要在android设备上运行应用程序,就必须使用APK文件格式。一般的编译器(如Eclipse)会帮你直接打包好。一旦应用程序被安装后,每一个Android应用程序都有自己的安全沙箱:
(1)Android 操作系统是多用户Linux系统。你可以理解为每一个应用都有不同的用户
(2)默认的系统会给每一个应用程序分配一个唯一的Linux 用户ID (这个ID是由系统使用的,应用程序不需知道)。
(3)每一个进程都有一个虚拟机(这个概念很重要,要记住),所以一个应用程序的代码执行过程会与其他应用隔离开
(4)默认的, 每一个应用程序都在它自己的Linux进程中执行。当任何一个应用程序的组件需要被执行时,就会开始一个进程,当长时间不需要或者系统必须为其他应用回收内存时Android将会关闭这个进程。
就是说每一个应用,默认的,每一个组件只做它力所能及的事情。这创造了一个非常安全的环境,一个应用程序在没有获得权限的情况下无法进入系统的一部分。然而, 有一些方法能让一个应用程序共享其他的应用程序的数据并访问系统服务:
(1)系统很可能安排两个应用程序共享同一个Linux用户ID。这种情况下,它们能彼此访问各自的文件。用来节约系统资源,在同一个Linux进程中应用程序使用同样的用户ID,能共享同一个虚拟机
(2)应用程序请求权限访问设备敏感数据比如用户通讯录,短信,SD卡,摄像头,蓝牙。所有应用权限在用户安装应用程序时,必须用户允许了才会生效
3.1 Application 组件
应用程序组件是生成一个Android应用不可或缺的结构。每一个组件都是重要的,并且不是所有组件都有一个入口点,他们彼此相互依赖,作为每一个出现的个体都扮演一个特殊的角色,每一个组件都是独一无二的部分,它们用来帮助你的应用程序定义整体功能。有四个不同的组件类型,每一个类型都有明确的用途和生命周期用来定义怎么创建和销毁它们:
1. Activities
一个 activity 表示一个屏幕,可以抽象的看成是用户界面。例如,一个email 应用可能有一个activity 来显示一个新邮件的链接,另一个activity用来读取邮件。就是说1个应用程序可能只有1个Activity或者有多个Activity。Activity就是程序的入口。在email应用中通过所有Activity一起合作让用户体验一个完整的功能,但它们彼此都是独立的,便于你修改与维护。并且就算是其他应用程序也能从这些 activities中的任何一个Activity开始(如果允许的话)。例如,摄像机 应用调用了email 应用里的一个
Activity,为了让用户共享一个图片会调用email 应用中的一个activity功能来生成新的邮件Android SDK中有一个Activity类,你只需要继承它就行了
2. Services
在后台执行长时间操作或者执行远程调用的时候,我们就需要用到serviceis组件。service 是没有用户界面的。例如当用户在不同的应用程序中切换时,一个service可能在后台播放音乐 ,或者在网络中获取数据。任何一个组件,比如Activity能打开一个service并且为了与其进行交互让它和自己绑定到一起或者执行这个service。Android SDK中有一个Service 类,你只需要继承它就行了。
3. Content
providers
A content provide能管理和共享一组应用程序的数据。你能在文件系统,SQLite 数据库,web上存储数据,或者任何一个本地持久存储设备中通过content
provider来访问这些数据 。并且content provider也能让其他的应用访问或者修改数据(如果content provider允许的话)。例如,通讯录的信息就是它来管理的。任何应用只要使用适当的权限就能查询并读取写入关于特定某人的信息
。Content providers 对于读取和写入你应用中私有的数据也很有用。例如,备忘录就使用了它来保存记录。同样Android SDK中有一个ContentProvider类。
4. Broadcast
receivers
broadcast receiver这是一个响应系统范围内广播事件的组件。大部分广播是从系统发出的。例如,屏幕翻转(横竖屏切换),电量低通知等都是一个广播事件.。应用程序也能发布广播 (请记住,广播可以由系统发送也可以由自己开发的应用程序发送)。例如,让其他应用知道一些数据被下载到设备中并且告知用户能使用这些数据。广播不能显示用户界面,但可以创建一个状态栏的通知提醒用户发生了一个广播事件。他的功能旨在创建短而轻松的工作。例如Service完成了工作后的一些事件处理。Android SDK中对应的是一个BroadcastReceiver类,这里还要了解一下Intent,广播是通过它来传递的,以后我们会详细描述。
3.1.1激活组件
我们上面说到的四大组件中,activities,services,broadcast
receivers这三个是通过intent调用异步消息激活的。Intent可以使用Intent类创建一个对象,并定义一个消息来激活一个特定的组件或者特定的组件类型。可以显式,隐式调用。(大家应该对Intent有个概念了,以后会详细说明)
1. 激活Activity 和Service:一个intent定义一个动作来执行Activity和Service,并还可以指定Url数据。例如一个intent能用来为activity显示一个图片或者打开一个Web页面传达一个请求。某些情况下,你能启动一个activity来接收一个结果,并返回结果到intent中。
2. 激活Broadcast receivers:对于广播intent只需定义一个通知(例如,一个设备电量低的广播,你只需要使用动作string="battery is low"就OK)
3. 激活Content provider:它不是由intent激活的。当收到一个ContentResolver的请求时,它被激活。 ContentResolver通过content provider直接处理所有事务。ContentResolver是Content provider与组件请求信息的中介者,是一个比较抽象的概念,它的存在是基于安全的考虑。
每一个组件都有方法让其执行:
(1)你可以通过一个intent中的startActivity()或者startActivityForResult()来启动一个activity。
(2)你启动一个服务可以通过intent中的startService()。或者你可以通过intent的bingService()绑定服务
(3)你可以用过intent的sendBroadcast()或者sendOrderedBroadcast或者sendStickyBroadcast()创建一个广播
(4)你可以用ContentResolver的query()执行一个对content provider的查询。
3.2
Manifest文件
在android系统启动一个应用组件之前,系统必须知道组件是否存在。以后我们创建的工程中都会有个AndroidManifest.xml文件,它很重要。应用必须在这个文件中声明它所需要的所有组件,并且这个文件要在工程的根目录中。(一般来说用eclipse创建的时候就自动生成了)
manifest用一个数字来描述应用程序组件:
1.确定应用请求的用户权限,比如网络访问内容或者是读取通讯录
2.声明最小API等级(这个以后会说,意思就是比如你如果声明的是7,那么7以下的设备都不能装。你这个应用。)
3.声明硬件软件功能,例如摄像机,蓝牙服务或者多点触摸屏。
3.2.1声明组件(components)
首要的任务就是告诉系统关于应用的组件信息。例如,一个manifest 文件声明一个activity:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
在application节点中。android:icon属性是给应用定义一个icon的资源。可以理解为电脑上的桌面图标。在activity节点中android:name属性声明一个全局入口点Acitivity。(相当于入口)android:label是应用的一个标签用来描述应用的名字。你必须按照以下格式声明应用程序组件 :
<activity> 用于 activities
<service> 用于 services
<receiver> 用于 broadcast receivers
<provider> 用于 content providers
其实上面节点名字就知道了,还是很好理解的。Activities, services, and content providers这三者如果你不声明这些组件那系统就不能访问。当然就不能执行了。但是broadcast receivers不仅能在manifest声明更可以用代码(使用BroadcastReceiver)动态创建和注册,然后系统会调用 registerReceiver()方法。更多关于manifest的结构我们以后会详细说明
3.2.2声明组件功能
以前我们说过,我们可以用intent启动一个activity,service和broadcast receiver。
intent action这是intent的精髓。使用intent action,你可以根据你想要执行的动作来简单的描述一个动作类型就OK了,并且系统会在设备上找到这个组件并启动执行它。如果intent执行的action同时包括了多个组件,那么我们可以选择其中的一个。系统识别一个组件并通过比较其他应用中manifest文件的intent节点里的内容,并响应一个intent。
你在manifest文件中声明一个组件时,你可以在组件的功能中声明一个intent filters(过滤intent的作用),它可以从其他应用中响应intent。声明一个intent filter的方法是在描述其组件的节点中添加<intent-filter>节点。
例如。系统中email 应用使用一个activity来生成一个新的email来让你查看。 可以在manifest 中声明一个"send"的intent filter(为了发送邮件)。你应用中的Activity能创建一个"send"动作--“ACTION_SEND”。系统会匹配email 应用中有"send"功能的activit然后当你调用Intent.startActivity()方法是启动email中的那个Activity。以后我们会详细讲述
3.2.3声明应用程序的需求
例如,如果你的应用需求一个摄像机的功能就要使用 Android2.1 (API Level7),你应该在你的manifest文件中声明它们。那么设备没有摄像机并低于2.1的版本在Android Market上都不能被安装
以下是一些重要的设备特性:
1. 屏幕大小和密度
为了根据设备的屏幕类型来区别设备,Android 为每一个设备定义了2种特性。屏幕大小(屏幕的物理尺寸)和屏幕密度(在屏幕上D像素的物理密度) 这里要特别给大家介绍一下
屏幕密度DPI。 DPI全称dots per inch就是说每英寸有多少个点。为了简化屏幕不同类型的配置,android系统根据不同角度来给它们分类。
屏幕大小(屏幕的物理尺寸):有smlaa,normal,large,extra large。
屏幕密度(DPI): low density, medium density, high density, extra high density。以后工程项目会有ldpi,mdpi,hdpi三个文件夹放图片,关于xhpi的话,截止到目前已经在淘宝上发现有这种手机了。
默认,你的应用是兼容所有屏幕和密度的,因为Android系统会适当的调整你的UI布局和图片资源(系统自带的并不好,他出来的效果不是我们想要的)。但是你应该为某一个屏幕大小创建专门的布局,并为某一密度提供专门的图片,以供布局资源选择,在你的manifest 中显式声明使用哪一个屏幕大小可以用 <supports-screens> 节点。关于屏幕大小和密度,我们以后会详细讲述,它很重要,直接体现到你应用的兼容性。
2. 输入配置
许多设备给用户提供不同的输入方法,比如键盘,轨迹球等。如果你的App需求单独的一种硬件输入支持,就需要在manifest <uses-configuration> 节点中声明。但是这种只需求一种输入的配置情况是非常少见的
3. 设备特性
有许多硬件和软件特性可能存在或者不存在,比如摄像机,光学传感器,蓝牙,某一个版本的OpenGL或者触摸屏的精确度。你永远不要假定某一特性可用。你可以使用
<uses-feature>节点来声明一个特性。
4. 平台版本
不同的Android设备常常在不同的Android平台版本下运行。比如1.6或者2.3这之间有很多版本。但它们的API有一些是不一样的。举个例子,如果你需要你的APP能在1.6至2.3的所有设备上运行。你可以在<uses-sdk>节点中指定<uses-sdk android:minSdkVersion="4"/>。
3.3 Application资源
Android 应用程序的组成不仅仅是代码,资源也许占用的比例更多。所以我们应该更好的区别资源。请大家放心,Android已经有一套机制,例如动画,菜单,风格,颜色和布局文件都是使用XML文件的。这样会比较容易更新你的应用程序资源,而且不需要修改代码。为多种不同的设备提供多样化的选择(比如不同的语言和屏幕大小)。每一种资源就包含在你的工程项目中,每一个资源都会有一个唯一的int ID,你可以直接引用。一般ID 定义在XML文件中或者用Java代码设置一个ID。比如你的图片名字叫logo.png。那么你的资源ID为R.drawable.logo。直接引用就行了 。另外还有字符串,如果你要支持多国语言就可以分别在不同的文件夹中定义,res/values-fr/这就是法语,res/values-cn/国语。Android系统会根据你设备正使用的语言来自动引用相应的文件夹
Android 还支持许多不同的后缀修饰。(上面的-fr,-cn就是后缀修饰)。修饰一般是缩写。 还有关于横竖屏的不同支持也有相应的后缀,以后我们会说的!
3.4 本章小节
本章的文字描述确实有点多, 都是一些理论上的描述,读者可以预览一下稍微有些概念,后面我们都会详细讲述它们的。下面我们简单回顾一下知识要点:
1.android安全沙箱机制
2.android应用程序四大组件
3.intent(大家可以从字面意思上理解,这是一个意图,有三大组件通过它执行)
4.Manifest文件
5.应用程序资源
本文来自jy02432443,QQ78117253。转载请保留出处,并保留追究法律责任的权利
第一部分:开发前的准备-第三章 Application 基本原理的更多相关文章
- Android驱动开发前的准备(三)
Git使用入门 3.1安装Git 3.2查看Git文档 3.3源代码的提交与获取 3.1安装Git # apt-get install git # apt-get install git-doc gi ...
- 《CoffeeScript应用开发》学习:第三章-构建简单的应用程序
字符串插值 CoffeeScript提供了一种更好的构建字符串的解决方案.在双引号字符串(单引号无效)中使用#{}包含一个动态的值. str = 'Hello, CoffeeScript.' cons ...
- 《精通Spring4.X企业应用开发实战》读后感第三章
- C# Language Specification 5.0 (翻译)第三章 基本概念
应用程序启动 拥有进入点(entry point)的程序集称应用程序(application).当运行一应用程序时,将创建一新应用程序域(application domain).同一个应用程序可在同一 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- 从零开始编写自己的C#框架(2)——开发前准备工作
没想到写了个前言就受到很多朋友的支持,大家的推荐就是我最大的动力(推荐得我热血沸腾,大家就用推荐来猛砸我吧O^-^O),谢谢大家支持. 其实框架开发大家都知道,不过要想写得通俗点,我个人觉得还是挺吃力 ...
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- C语言探索之旅】 第一部分第四课第三章:变量的世界之显示变量内容
内容简介 1.课程大纲 2.第一部分第四课第三章:变量的世界之显示变量内容 3.第一部分第五课预告:基本运算 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
随机推荐
- Linux 文件系统与挂载详解
https://blog.csdn.net/baidu_34051990/article/details/60963947
- Nightmare HDU1072
非常标准的BFS 第一次写错了很多 1.到达4时设置为墙就好了 避免了死循环 2.不用开d数组 在结构体里面就行了 3.结构体初始化函数的写法: Node(int x=0,int y=0,int ...
- Maven启动代理访问
1.说明 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配置文件中设置代 ...
- 条件随机场之CRF++源码详解-特征
我在学习条件随机场的时候经常有这样的疑问,crf预测当前节点label如何利用其他节点的信息.crf的训练样本与其他的分类器有什么不同.crf的公式中特征函数是什么以及这些特征函数是如何表示的.在这一 ...
- C# GUID生成
System.Guid.NewGuid().ToString()
- SQLite中的FROM子句
SQLite中的FROM子句 FROM子句从数据库中可以获取到一个或多个源表.源表通常是数据库命名的表,但也可以是视图或子查询.子查询相关的更多详细信息,我们会在后面进行介绍.当获取到多个源表时,JO ...
- Open Source Book For ML
The following is a list of free, open source books on machine learning, statistics, data-mining, etc ...
- Python3Numpy——相关性协方差应用
基本理论 Correlation Are there correlations between variables? Correlation measures the strength of the ...
- unity 判断物体是否在视角内(巧妙!)
public var isRendering:boolean=false; private var lastTime:float=0; private var curtTime:float=0; fu ...
- JS版日期格式化和解析工具类,毫秒级
/** * ===================================== * 日期相关方法 * ===================================== */ ;(fu ...