android 应用基础(Application Fundamentals)

Android应用程序是用Java编程语言。在Android SDK工具编译代码以及任何数据和资源文件 - 成Android包,以.apk文件后缀的归档文件。在.apk文件可以当做是一个应用程序,并且可以在Android的设备用来安装应用程序的文件。

一旦安装在设备上,每个Android应用程序生活在它自己的安全区域中:

1.Android操作系统是一个多用户的Linux系统中,每个应用程序是不同的用户。
2.默认情况下,系统分配的每个应用程序的唯一的Linux用户ID(该ID用于仅由系统和未知的应用程序)。该系统设置在应用程序中的所有文件的权限,以便只有分配给该应用程序的用户ID都可以访问它们。
3.每个进程都有自己的虚拟机(VM),所以应用程序的代码在从其他应用程序隔离运行。
4.默认情况下,每个应用程序都在它自己的Linux进程中运行。 Android的启动时需要执行的任何应用程序的组件的过程,然后关闭该进程,当它不再需要时或系统必须恢复内存供其他应用程序。

也就是说,Android系统实现了最小特权原则。也就是说,每个应用程序,默认情况下,只能访问到它需要做的工作并没有更多的组件。这将创建在其中一个应用程序不能访问它没有获得许可的系统部分一个非常安全的环境。这是Android的一个重要特点。

然而,也有办法让应用程序与其他应用程序共享数据和应用程序访问系统服务:

1.它可以安排两个应用程序共享相同的Linux用户ID,在这种情况下,他们能够访问对方的文件。为了节省系统资源,使用相同的用户ID的应用程序也可以安排在同一个Linux进程运行,并共享相同的VM(即应用程序也必须使用相同的证书签名)。
2.应用程序可以请求允许访问设备数据,例如用户的联系人,短信,可安装存储(SD卡),摄像头,蓝牙,等等。所有的应用程序的权限,必须授予在安装时用户。

Application Components(应用程序组件)

这三组件类型:活动(Activity),服务(Service)和广播接收器(Broadcast),通过Intent的异步消息来激活。Intent单个组件相互结合在运行时指向另一个组件(Component)。

一个Intent产生一个Intent对象,它定义了一个消息来激活一个特定元件或是一个显式的或隐式的的组件。

对于Activity和Service,Intent定义了要执行的操作(例如,“查看”或“发送”某个事物) ,并且可以指定数据的URI 。

对于Broadcast的接受者,其目的只是定义正在播出的公布(例如,广播表示该设备电池电量低时只包括已知的操作字符串,像“电池电量低” ) 。

而其它成分的类型,Contentprovider,不被意图激活。相反,它是当通过从的ContentResolver一个请求对象激活。内容解析器处理与contentprovider的所有直接的交易,使之执行交易与提供的组件并不需要,而是调用的ContentResolver对象上的方法。这使抽象的内容提供商和组分请求的信息(安全性)之间的层。

有用于激活每种类型的组件不同的方法:

1.你可以开始一个活动(或给它一些新的东西做)通过传递一个Intent给startActivity ( )或startActivityForResult ( )(当你想活动的返回结果) 。
2.你可以启动一个服务(或给予新的指令来持续服务)通过传递一个Intent来的StartService ( ) 。或者你可以通过传递一个Intent来bindService ()绑定到该服务。
3.你可以通过传递一个Intent像sendBroadcast ( ) , sendOrderedBroadcast ( ) ,或sendStickyBroadcast ( )方法启动的广播。
4.你可以通过在调用的ContentResolver查询( )执行查询的contentprovider。

The Manifest File

之前Android系统可以启动一个应用程序组件,系统必须知道组件存在通过读取应用程序的AndroidManifest.xml文件的应用程序必须声明它的所有组件在这个文件中,它必须在应用程序项目的根目录下。
Manifest做了一些东西,除了声明应用程序的组件,如:
1.识别任何用户权限的应用需要,如上网或读访问用户的联系人。
2.声明应用程序所需的最低API级别,在此基础上的API的应用程序使用。
3.声明由应用程序使用或需要的硬件和软件功能,如摄像头,蓝牙服务,或者多点触摸屏。
4.API库的应用程序需要对(比Android框架的API等),挂如谷歌地图的库。

Declaring components(声明组件)

Manifest的首要任务是系统通知应用程序的组件。举例来说,一个manifest文件可以按如下声明一个活动:

-----------------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<manifest ... >

    <applicationandroid:icon="@drawable/app_icon.png" ...>

        <activityandroid:name="com.example.project.ExampleActivity"

                  android:label="@string/example_label" ...>

        </activity>

        ...

    </application>

</manifest>

-----------------------------------------------------------------------------------------------------------------------------------------

在<application>元素,在android:图标属性指向的资源用于标识应用程序图标。 
在<activity>元素,在android:name属性指定的子类活动和android的全限定类名:标签属性指定一个字符串作为该活动的用户可见的标签使用。 
您必须声明所有应用程序组件是这样的: 
<activity>元素活动 
<service>要素服务 
<receiver>元素广播接收机 
<p​​rovider>元素为内容提供商者
活动,服务和内容提供商,你在你的源代码,包括但不要在清单中声明是不可见的系统,因此,不能运行。然而,广播接收器既可以在manifest或在代码中动态创建的声明(如BroadcastReceiver的对象),并通过调用registerReceiver()注册到系统中。 

声明组件的功能

如上所述,在激活的组件,你可以使用一个Intent来启动活动,服务和广播接收器。您可以通过显式命名目标组件(使用组件类名)。但是,Intent的真正力量在于意图行动的概念。Intent的动作,你只是描述要执行(也可根据您想要执行的操作的数据)的动作类型,并允许系统找到该设备上的一个组件,它可以执行的操作和启动它。如果有可以执行由目的所描述的动作的多个组件,可由用户选择使用哪一个。
系统的识别可以对Intent做出反应的组件的方法是通过比较收到的设备上的其他应用程序清单文件中提供的Intent过滤器的意图。
当你声明你的应用程序清单的组成部分,你可以选择包括意图过滤器的声明组件的能力,因此它可以从其他应用程序的意图作出回应。您可以通过添加一个<intent-filter>元素作为组件的声明元素的子元素声明一个意图过滤器为您的组件。
例如,用于编写新电子邮件活动的电子邮件应用程序可能会宣布一个Intent过滤器在其清单条目,以应对“发送”Intent(以发送电子邮件) 。然后在应用程序中的活动可以创建与“发送”的动作( ACTION_SEND ) ,该系统相匹配的电子邮件应用程序的“发送”活动,并启动它,调用一个的startActivity()。

声明组件的要求

有多种设备搭载Android ,而不是他们的所有提供相同的功能和能力。为了防止您的应用程序被安装在缺少应用程序所需的功能的设备,你清楚地定义配置文件中的设备类型的应用程序支持通过声明的设备和软件的要求在你的manifest文件是必须的。大多数这些声明是仅供参考,系统不会读取它们,但外部服务,如谷歌播放务必阅读它们,以提供过滤的用户在搜索从他们的设备应用程序。
例如,如果你的应用需要一个摄像头,并使用了Android 2.1 ( API级别7 )介绍的API ,你应该声明这些在你的manifest文件的要求。这样一来,没有一个摄像头,并有超过210下一个Android版本的设备无法从谷歌播放安装应用程序。
不过,您也可以声明你的应用程序使用相机,但并不需要它。在这种情况下,应用程序必须在运行时进行检查,以确定该设备有一个摄像头,并禁用使用相机,如果没有可用的任何功能。

下面是一些你应该考虑为你设计和开发应用程序的重要的设备特点:
1.屏幕尺寸和密度
屏幕大小:小,正常,大,超大。
屏幕密度:密度低,中密度,高密度和超高密度。
默认情况下,应用程序与所有的屏幕尺寸和密度兼容,因为Android系统进行适当的调整,以你的UI布局和图像资源。然而,你应该建立专门的布局一定的屏幕尺寸和某些密度提供专门的图像,使用替代资源的布局,并通过申报到底是哪屏幕尺寸的应用程序与<supports-screens>元素支持。
2.输入配置
许多装置提供不同类型的用户输入机制,例如硬件键盘,轨迹球,或一个5向导航键。如果您的应用程序需要特定种类的输入硬件,那么你应该在你的清单与<uses-configuration>元素声明它。然而,这是罕见的,应用程序应该需要一定的输入配置。
3.设备特点
有许多可能会或可能不会给定的Android设备上不存在的硬件和软件功能,如摄像头,光线感应器,蓝牙,某个版本的OpenGL的,或触摸屏的保真度。你不应该假定某一功能适用于所有的Android供电设备(比标准Android库的可用性等) ,所以你应该申报与<uses-feature>元素应用程序使用的任何功能。
4.平台版本
不同的Android手机通常运行不同版本的Android平台,如Android 1.6或Android 2.3 。每个后续版本通常包括在以前的版本不提供额外的API 。为了表明这是可用的API集,每个平台版本指定一个API级别(例如,安卓1.0是API级别1和Android 2.3的API等级9 ) 。如果您使用的是补充说, 1.0版后,该平台的任何API,您应该申报的最低API级别中,这些API被使用<uses-sdk>元素引入。
这一点很重要,你声明所有这样的要求,为您的应用程序,因为,当你发布你的应用程序在谷歌播放时,存储使用这些声明来过滤这些应用程序可在每个设备上。因此,您的应用程序应该是只可用于满足您的所有应用需求的设备。

应用资源

Android应用程序是由不仅仅是代码,它需要独立于源代码,如图像,音频文件,以及与应用程序的视觉呈现任何资源。例如,你应该定义动画,菜单,样式,颜色,以及与XML文件的活动用户界面的布局。使用应用程序的资源可以很容易地更新应用程序的各种特性,而无需修改代码和 - 通过提供两套替代资源,可以优化为各种设备配置(如不同的语言和屏幕大小),您的应用程序。 
对于您在您的Andr​​oid项目包括所有的资源,在SDK编译工具定义一个唯一的整数ID,你可以用它来从应用程序代码,或从XML中定义的其他资源引用资源。例如,如果您的应用程序包含一个名为logo.png(保存在res /绘制/目录)的图像文件,SDK工具生成一个名为R.drawable.logo资源ID,你可以用它来引用该图片并将其插入在用户界面中。 
其中提供资源从源代码中分离出来的最重要的方面是能够让你为不同的设备配置提供可替代资源。例如,通过定义在XML中的UI字符串,可以转换字符串成其他语言,并保存这些字符串在单独的文件。然后,根据您追加到资源目录的名称(如RES /值-FR /法语字符串值),并在用户的语言设置语言限定词,Android系统应用相应的语言字符串到你的UI。 
Android支持多种不同的合格者为您的替代资源。限定符是您在资源目录的名称包括以定义的这些资源应该用于设备配置的短字符串。再举一个例子,你应该经常对你的活动创建不同的布局,这取决于设备的屏幕方向和大小。例如,当设备屏幕处于纵向(高),您可能希望一个有按钮的布局是垂直的,但是当屏幕处于横向(宽),按钮应水平对齐。要更改布局视方向,你可以定义两个不同的布局和应用适当的限定词,以每个版面的目录名。然后,系统将自动应用适当的布局取决于当前设备的方向。 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值