Android developer dev guide 应用程序基础之Component

2010-05-08 23:21:13

边学边翻译Android developer ,官方网站总是连接不上=_=,还好在http://www.android123.com.cn/android_kit.html 可以下载到2.1的文档,英文的。

 

电子版的已经上传到csdn上了,不要资源分的^_^,http://download.csdn.net/source/2330873  

 

 

 

 

Android 开发者

应用程序基础

Android 应用程序用 Java 语言编写。编译后的 java 代码——以及应用程序需要的数据和资源文件——由 aapt 工具 打包成 Android 包,一种后缀 .apk 的存档文件。该文件用于发布应用并安装在移动设备上;它是用户下载到设备上的文件。 .apk 文件上的所有代码可以看做一个应用。

在许多方面,每个 Android 应用有自己的世界:

l   默认每个应用运行在自己的 Linux 进程上。 Android 在需要执行其应用的任何数据时启动进程,在不需要时终止进程,系统资源由其他应用要求。

l   每个进程有自己的 Java 虚拟机( VM ),所以应用程序代码相互独立地运行。

l   默认每个应用分配一个独特的 Linux 用户 ID 。许可设置使应用文件只对该用户和应用本身可见——虽然也有许多方式可以向其他应用输出它们。

可以安排两个应用共享同一个用户 ID ,这种情况下它们可以看到对方的文件。为了保存系统资源,相同 ID 的应用也可以运行在同一个 Linux 进程上,共享同一个 VM

 

——————————————————————————————————

应用程序元件

Android 的主要特征是一个应用可以使用其他应用的元素(只要那些应用允许)。例如,如果你的应用需要显示一个图像滚动列表,而其他应用已经开发了合适的滚动条并允许其他应用使用,你可以调用该滚动条来完成工作,而不用自己开发。你的应用没有引入其他应用的代码或者链接它们。它只是当有需要时简单地启动了其他应用的该部分。

为了实现它,系统必须能在需要应用的某个部分时启动其进程,并为该部分实例化 Java 对象。所以,不像大多数其他系统的应用, Android 应用没有为其所有内容提供单一的入口(比如没有 main() 函数)。它们有要素元件让系统可以在需要时实例化并运行。下面是四种基本元件:

 

活动

一个活动 是一个可视化的用户界面让用户可以操作。例如,一个活动可以是一个菜单列表,用户可以从中选择,或者可以展示相片和标题。一个短信应用程序可能有一个活动来显示可以发送短信的联系人列表,第二个活动用来给选中的联系人写短信,又有一个活动来查看旧的短信或者更改设置。虽然它们一起工作组成共同的用户界面,但是每个活动相互独立。每一个都由 Activity 基类的子类来执行。

一个应用也可以只有一个活动组成,又或者由若干活动组成,像刚才提到的短信应用程序。至于是什么活动,有多少个活动,当然由应用和它的设计决定。典型地,当应用运行时活动中的一个首先展示给用户。通过当前活动启动下一个活动可以实现用户从一个活动移动至另一个。

每个活动有默认的窗口来绘制。典型地,窗口填充整个屏幕,但也可以比屏幕小和浮动在其他窗口上。一个活动也可以使用额外的窗口——比如,在活动使用中弹出对话框请求用户回应,或者当用户选择屏幕上的特殊选项时窗口显示重要信息。

窗口的可视内容由视图层提供——由 View 基类派生。每个视图控制窗口中一个独特的矩形区域。父类视图包含和组织子视图的布局。叶视图(在视图层最底部)在它们控制的矩形中绘制,并响应用户在该区域的动作。所以,视图就是活动和用户互操作的地方。比如,视图可以展示一个小图像并在用户点击时产生一个动作。 Android 有一系列已经实现的视图可以使用——包括了按钮,文本区域,滚动条,菜单选项,复选框等等。

视图层通过 Activity.setContentView() 方法放在活动窗口中。内容视图 是视图层的根对象。(视图和视图层更多信息见单独的用户界面 文档。)

 

服务

一个服务 没有可视化的用户界面,但是它在后台运行不确定的时间。比如,一个服务可以在用户忙于其他事情时播放背景音乐,或者从网络取得数据,又或者进行运算并把结果提供给需要它的活动。每个服务继承 Service 基类。

主要的例子是媒体播放器从播放列表中播放音乐。播放应用程序可能有一个或多个活动,允许用户选择音乐并播放。然而音乐单曲循环不能由活动处理,因为用户希望在他们离开播放器开始其它工作时继续播放音乐。为了继续播放音乐,媒体播放器活动可以启动一个在后台运行的服务。系统会在离开活动后继续运行音乐循环播放服务。

可以连接(绑定)至正在运行的服务(若没有运行就启动服务)。连接后,你可以通过该服务提供的接口和它通信。对于音乐服务,这个接口可以允许用户暂停,重放,停止,和重启循环播放。

和活动或者其它元件一样,服务在应用进程的主线程中运行。所以他们不会阻塞其他元件或者其他用户界面,他们通常给时间消耗的任务产生其他的线程(比如音乐循环播放)。见后面的进程和线程

 

广播接收器

一个广播接收器 是负责接收和回应广播声明的元件。许多广播源自系统代码——比如,声明时区变更,电源不足,照片拍摄,或者用户更改语言偏好。应用程序也能初始化广播——比如,让其他应用知道某些数据已经下载至设备并且可以使用。

应用程序可以有多个广播接收器来响应任何它认为重要的声明。所有接收器继承 BroadcastReceiver 基类。

广播接收器没有用户界面。然而,它们可以启动活动来响应收到的信息,或者可以使用 NotificationManager 来警告用户。通知会通过各种方式引起用户注意——闪烁背光,震动设备,播放声音,等等。它们通常在状态栏放置一个永久的图标,用户可以打开来接受消息。

 

内容供给

一个内容供给 给其他应用程序提供特别的一套应用数据。数据可以存储在文件系统中,在 SQLite 数据库中,或者以其他可行的方式。内容供给继承 ContentProvider 基类,实现一套标准方法使应用可以获取和存储它控制的类型的数据。然而应用不直接调用这些方法。相应地,它们用一个 ContentResolver 对象,调用它的方法。一个内容解析能和任何内容供给对话;它和供给共同管理相关的进程间通信。

更多使用内容供给的信息见单独的内容供给 文档。

 

任何时候有必须特定元件处理的请求出现, Android 会确保该元件的应用进程在运行,如果需要就启动它,并且确保该元件的合适实例可获得,如果需要就创建实例。

 

激活元件:意图

内容供给在内容解析请求指定时激活。其他三种元件——活动,服务和广播接收器——由异步消息意图 激活。一个意图是包含消息内容的 Intent 对象。对于活动和服务,它指定了请求动作,指定了操作数据的 URI 。比如,它可以向活动传递请求,给用户显示图像或者让用户编辑文本。对于广播接收器,意图对象指定了声明的动作。比如,它可以向相关部分声明相机按钮按下。

下面是激活各种类型元件的单独步骤:

 

l   通过传递意图对象给 Context.startActivity() 或者 Activity.startActivityForResult() 运行活动(或者开始新的工作)。相应地活动可以调用 getIntent() 方法查看运行时的初始意图。 Android 调用活动的 onNewIntent() 方法传递任何后来的意图。

一个活动通常启动下一个。如果它期望从启动的活动得到返回值,调用 startActivityForResult() 替换 startActivity() 。比如,如果它启动了一个活动让用户挑选一张照片,那么就应返回选择的照片。该返回值以意图对象传递给调用者活动的 onActivityResult() 方法。

l   通过传递意图对象给 Context.startService() 启动服务(或者给正在运行的服务新命令)。 Android 调用服务的 onStart() 方法并传递意图对象给它。相似地,意图可以传递给 Context.bindService() 来建立调用元件和制定服务间的连接。服务调用 onBind() 得到意图对象。(如果服务不在运行, bindService() 能选择性地启动它。)比如,活动可以和前面提到的音乐循环播放服务建立连接,使得它能提供用户控制播放的方法(用户界面)。活动会调用 bindService() 来建立连接,然后调用服务定义的方法来控制播放。

后面部分,远程程序调用 ,有更多关于绑定服务的细节。

l   应用程序通过传递意图对象给类似 Context.sendBroadcast() Context.sendOrderedBroadcast() ,和 Context.sendStickyBroadcast() 的方法来初始化广播。 Android 调用它们的 onReceive() 方法传递意图给所有感兴趣的广播接收器。

 

更多意图消息的内容,见单独文章,意图和意图过滤器

 

关闭元件

内容供给只在响应内容解析的请求时激活。广播接收器只在响应广播消息时激活。所以没有必要明确地关闭这些元件。

另一方面,活动提供用户界面。它们和用户长时间对话,并且只要对话继续,即使在空闲时也保持激活。相似地,服务也可能运行很长时间。所以 Android 以顺序方法关闭活动和服务:

 

l   活动通过调用它的 finish() 方法关闭。一个活动能通过调用 finishActivity() 关闭别的活动(它调用 startActivityForResult() 启动的)。

l   服务通过调用它的 stopSelf() 方法,或者 Context.stopService() 方法停止。

 

元件也可以由系统关闭,当它们不再使用或者 Android 必须回收存储空间给更多活动元件。后面部分,元件生命周期 ,详细讨论了这种可能性及其衍生物。

 

清单文件

Android 启动应用程序元件前,它必须知道元件的存在。所以,应用在清单文件中声明它们的元件,该文件引入 Android 包中, .apk 文件也包含了应用程序代码,文件和资源。

清单是 XML 文件,通常是 AndroidManifest.xml 。它除了声明应用的元件,还完成了一系列工作,比如指定了应用需要的库(包括了默认的 Android 库),确认应用需要的许可。

但是清单的主要任务是说明应用的元件。比如,一个活动可以如下声明:

<? xml version = "1.0" encoding = "utf-8" ?>
<manifest . . . >
   
<application . . . >
       
<activity android:name = "com.example.project.FreneticActivity"
                 
android:icon = "@drawable/small_pic.png"
                 
android:label = "@string/freneticLabel"
                  . . .  
>
       
</activity>
        . . .
   
</application>
</manifest>

<activity> 元素的 name 属性指定了 Activity 的执行子类。 icon label 属性指向包含图标和标签的资源文件,用于代表活动,展示给用户。

其他元件以类似的方式声明——服务的 <service> 元素,广播接收器的 <receiver> 元素,和内容供给的 <provider> 元素。活动,服务和内容供给没有在清单中声明,对于系统就是不可见的,不会运行。然而,广播接收器既可以在清单中声明,也可以在代码中动态创建(作为 BroadcastReceiver 对象),并通过系统调用 Context.registerReceiver() 来注册。

更多构建清单文件的内容,见 AndroidManifest.xml 文件

 

意图过滤器

意图对象可以明确指定目标元件。如果这样, Android 找到该元件(依据清单的声明)并激活它。但是如果目标没有明确指定, Android 必须定位最适合的元件来响应该意图。它通过比较意图对象和潜在目标的意图过滤器 来实现。元件的意图过滤器告诉 Android 它能处理的意图类型。像元件的其他重要信息一样,它们也在清单中声明。这里是前面例子的扩展,给活动增加了两个意图过滤器:

<? xml version = "1.0" encoding = "utf-8" ?>
<manifest . . . >
   
<application . . . >
       
<activity android:name = "com.example.project.FreneticActivity"
                 
android:icon = "@drawable/small_pic.png"
                 
android:label = "@string/freneticLabel"
                  . . .  
>
           
<intent-filter . . . >
               
<action android:name = "android.intent.action.MAIN" />
               
<category android:name = "android.intent.category.LAUNCHER" />
           
</intent-filter>
           
<intent-filter . . . >
               
<action android:name = "com.example.project.BOUNCE" />
               
<data android:mimeType = "image/jpeg" />
               
<category android:name = "android.intent.category.DEFAULT" />
           
</intent-filter>
       
</activity>
        . . .
   
</application>
</manifest>

例子中的第一个过滤器——动作“ android.intent.action.MAIN ”和种类“ android.intent.category.LAUNCHER ”的结合——是通常情况。它表示该活动应作为应用程序启动器,即用户可以在设备上启动的屏幕上应用程序列表。换言之,该活动是应用程序入口,当用户选择启动应用时可以看到的初始活动。

第二个过滤器声明了该活动在特定类型数据上能执行的动作。

元件可以有任意数量的意图过滤器,每个声明不同的能力。如果没有过滤器,它只能由明确指定该元件为目标的意图激活。

对于在代码中创建和注册的广播接收器,意图过滤器直接实例化为一个 IntentFilter 对象。所有其他的过滤器在清单中建立。

更多意图过滤器的内容,见单独文档,意图和意图过滤器

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值