zoukankan      html  css  js  c++  java
  • 第一部分:开发前的准备-第三章 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

    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。转载请保留出处,并保留追究法律责任的权利

  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/tianjian/p/3430076.html
Copyright © 2011-2022 走看看