Android app fundamentals

来源:互联网 发布:施耐德plc仿真软件 编辑:程序博客网 时间:2024/06/05 20:56

最近学android,不知道怎么学的时候就开始翻译官方文档。渣四级的水平,求不喷。转载请说明出处!

应用基本原理

Android应用是用Java编程语言编写的。Android SDK工具将你的代码,连同数据和资源文件编译到APK——Android package,是一个后缀名为.apk的档案文件。APK文件中包含了所有的Android app内容,是Android设备用来安装app的文件。
一旦被安装在设备上,每一个Android应用都在他们自己的安全沙箱中。
Android操作系统是一个多用户的Linux系统,在其中,每一个app都是一个不同的用户。
默认情况下,系统为每一个app赋一个唯一的Linux的用户ID(ID紧紧是被系统使用,app自己则不知道)。系统为一个app的所有文件设置了权限,只有拥有特定ID的app才可以访问那些文件。
每一个进程有他自己的虚拟机,所以每一个app的代码与其他app代码隔离运行。
默认情况下,每一个app在他自己的Linux进程中运行,Android当任何app组件需要执行的时候开始进程。当app不再需要或者是系统需要回收内存的时候结束进程。
通过这种方式,Android系统实现了最少特权原则(principle of least privilege)。换言之,在默认情况下,每一个app都只对可以实现它需要做的工作的组件进行访问,没有更多的。这创造了一个非常安全的环境,app没有足够的权限去访问系统的部分。
然而,这里有一些app之间共享数据或者是访问系统服务的方式:
让两个app共用同一个Linux用户ID是可能的,在这样的情况下他们可以互相访问对方的文件。为了使系统资源守恒,拥有相同用户ID的app也可以在同一个Linux进程中运行,并且共用同一个虚拟机(app也必须使用相同的证书)。
一个app可以请求访问设备数据的权限,例如用户的联系人,sms信息,sd卡,相机,蓝牙等等。所有的app权限必须在安装的时候被用户赋予。
以上覆盖了关于一个app在系统中的存在方式的基本信息,本文剩余的部分将介绍:
app中定义的核心架构组件
用来为app定义组件和请求设备特性的manifest文件
独立于app代码,并且允许你的app在不同的设备配置中优化自身行为的资源。
app组件
App组件是一个Android app的基本构建块。每一个组件都是系统可以输入你的程序的不同入口。对用户来说不是所有的组件都是真实的入口,一些组件是互相依赖的。但是每一个组件都以它的实体存在,并且扮演特定的角色。也就是说,每个组件都是一个唯一的构建块,帮助定义app的总体行为。
共有四种组件,每一类都有特定的用途,并且有特定的生命周期。以下是组件信息:
Activities(活动)
一个活动代表了一个单独的用户界面,例如,一个email应用有三个活动,一个活动显示email的列表,一个活动来编辑emalil,另一个活动用来读email。尽管活动在email应用中一起工作组成了紧密结合的用户体验,但是每一个活动都是独立于其他活动的。就本身而言,如果email应用允许,另一个应用可以使以上任何一个活动开始执行。例如,相机应用可以开始email的编辑活动来发送新邮件分享图片。
创建Activity类的子类可以实现活动。
Services(服务)
服务是在后台运行组件,执行长时间运行的操作或者是执行远程进程的工作。服务不能提供用户界面。例如,当用户访问其他应用的时候,后台服务播放音乐。后台服务从网络获取数据的时候不会阻塞用户同活动交互。其他的组件,例如活动可以开启服务并且使它运行,或是同服务绑定与其交互。
服务可以通过创建Service类的子类实现。
Content providers(内容提供器)
内容提供器管理app数据的共享设置。你可以存储数据在文件系统中,在SQLite数据库中,在网络中,或是其他app可以访问的固定存储位置。通过内容提供其,在获得许可的条件下其他的app可以查询甚至是修改数据。例如,Android系统提供了一个内容提供器管理用户的联系人信息。同样的,任何有合适权限的app可以查询内容提供器的部分数据,读或者是写特定联系人的信息。
内容提供器也可以读写app本身的私有数据。
内容提供器可以同过创建ContentProvider类的子类实现,必须实现API的标准设置,以使其他应用执行事务。
Broadcast receivers(广播接收器)
广播接收器是响应整个系统范围的广播公告。许多广播接收器来源于系统。例如,广播发布屏幕关闭,点亮低,或是截屏信息。app也可以新加入广播。例如,创建一个广播使其他app知道一些可供它们使用的数据已经被下载到设备上。虽然广播接收器不显示用户界面,它们可以建立一个状态栏通知,当一个广播事件发生时用来提醒用户。通常,广播接受器是进入其他组件的途径,并且试图做最小的工作。例如,可以基于广播事件开启一个服务来执行任务。
广播接收器可以通过继承BrocastReceiver类来实现,每个广播被传递一个Intent对象。


Android系统设计方面的唯一是任何app都可以开启其他app的组件。例如,通过一个app开启照相活动,当照片获取到之后再返回app使用照片。对于用户来说,那看起来像是照相机是上述app的一部分。
当系统开启了一个组件,它也为app开启了一个进程并且初始化组件需要的类。此外,与其他系统不同的是,Android应用没有单一的入口点(例如,没有main()函数)。
因为系统使每一个app运行在单独的具有文件权限的进程中,访问其他app收到限制,你的app可以直接地使其他app的组件活动。为了使其他app的组件处于活动状态,必须通过定制intent来向系统传递信息,开启特定的组件。
Activating Components
活动,服务,广播接受器,都是通过一个叫做intent(意图)的同步信息激活的。在运行时间,意图绑定特定的组件,不论组件是属于你的app或是其他的app。
意图被Intent兑现创建,Intent对象定义了激活特定的组件或是特定组件类型的信息。意图可以被定义成显式的或隐式的。
对于activity和service来说,intent定义要执行的行动,并且指定数据执行的URI。例如,一个意图向活动传输显示图片或是打开网页的请求。在某些情况下,你可以开启一个活动来接受结果,在这样的情况下,活动也在Intent中返回结果(例如,可以创建一个intent使用户选择特定联系人并且将其结果返回你的app,返回的intent包含一个指向被选中联系人的URI)。
对于广播接受器来说,intent简单的定义了被广播的公告。
内容提供器不被intent激活。当然,内容提供器在做为ContentResolver的请求目标的时候被激活。内容解析者处理所有与内容提供者的直接事务,这样执行事务的组件和提供者不需要处理,而是调用ContentResolver对象的方法。这使得内容提供器和组件之间的一个抽象层请求信息。
这里有一些激活组件的独立方法:
可以通过传递一个Intent对象到startActivity()或是startActivityForResult()方法来开启一个activity。
通过传递一个Intent对象到startService()开启一个服务。或是可以通过传递Intent到bindService()绑定到服务。
通过传递Intent对象到sendBroadcast()或sentOrderedBoradcast()或sendStickyBroadcast()创建一个broadcast。
可以通过调用ContentResolver的query()方法,执行到content provider的查询。
Manifest File(清单文件)
在Android系统可以开始一个app组件之前,系统必须通过AndroidManifest.xml知道组件的存在。你的app必须在这个文件中声明所有的组件。该文件必须在app工程的根目录下。
除了声明组件,manifest文件还做以下的一些事情:
鉴别app申请的所有用户权限,例如网络请求。
声明app需要的最低API级别,该级别基于app使用的API。
声明被app使用或是请求的软硬件特性。例如蓝牙,照相机等。
app需要连接到的API库,例如Google Maps library。
etc。
Declaring components(声明组件)
manifest文件的基本任务就是通知系统app所使用的组件。例如: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属性定义了Activity子类的类名。android:label属性定义了活动的可视标签。
我们必须通过这样的方式来声明组件:
<activity>元素声明activity
<service>元素声明service
<receiver>元素声明broadcast receiver
<provider>元素声明content provider
活动,服务和内容提供器若不在manifest文件中声明,则他们对系统来说是不可见的,也就是说不可以运行。然而,broadcast可以在manifest中声明,也可以在代码中动态地声明,并且通过调用registerReceiver()在系统中注册。
Declaring component capabilities(定义组件的功能)
如上诉所说,在activating compinents可以使用Intent对象来开启活动,服务,或是广播接收器,可以在Intent对象中显式地指出目标组件的名字来做这些。然而,intent存在的真正实力是隐式intent。隐式的Intent只是简单地描述了需要执行的任务,让操作系统来找合适执行任务的组件。如果有多个合适的组件,则让用户来选择启动哪一个。
系统鉴别组件的方式是通过比较app的manifest文件中intent filter提供的信息。
当你在manifest中声明一个活动的时候,可以选择性地包含intent fliter。intent filter定义了app的功能,其可以响应来自其他app的intent。可以通过<intent-filter>元素来为组件定义功能。
Declaring app requirements(定义应用需求)
Android设备很多,但不是所有的设备都提供相同的特性和功能。为了防止app安装在缺乏某些功能的设备环境中,在manifest文件中清晰地定义应用需要的设备和软件需求很重要。大多数的定义系统不会阅读,但是外部设备,例如Google Play会阅读他们。一边为持不同设备的用户提供过滤器。
例如:应用适用于有照相机,并且API级别高于7的设备:
<manifest ... >
    <uses-feature android:name="android.hardware.camera.any"
                  android:required="true" />
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
    ...
</manifest>

0 0
原创粉丝点击