用Eclipse开发和调试Android应用程序(二)

二、 创建Android Eclipse工程

请参考小生的《Android SDK
2.3与Eclipse最新版开发环境搭建(五)》,博文地址:http://blog.sina.com.cn/s/blog_573860a90100ownd.html
or
http://blog.csdn.net/deaboway/archive/2011/01/30/6170449.aspx

三、 工程结构详细解析

1. 工程结构

在Eclipse的Java透视图中,可以看到工程的Package Explorer如下图:

clip_image002

具体包括:

src 文件夹 – 包含示例应用程序的包,即org.deaboway.test。

R.java – Android Developer Tools 自动创建这个文件,它提供访问 Android
应用程序的各种资源所需的常量。后面会详细讨论 R 类与资源之间的关系。

HelloAndroidWorld.java – 应用程序的主活动类的实现。

Referenced libraries – 包含 android.jar,这是 Android SDK 中的
Android 运行时类的 jar 文件。

res 文件夹– 包含应用程序的资源,包括:

· drawable – 图标:这个文件夹包含图形文件,比如图标和位图。

· layout – 布局文件:这个文件夹包含表示应用程序布局和视图的 XML 文件。

· values – 字符串:这个文件夹包含 strings.xml 文件。这是为应用程序实现字符串本地化的主要方法。

AndriodManifest.xml – 示例应用程序的部署描述符。

default.properties 和proguard.cfg
从2.3版本以后,android sdk
本身包含proguard,可以通过正常的编译方式也能实现代码混淆,我们可以看到android-sdk-windows\tools\下面多了一个proguard文件夹。防止反编译工具进行反编译,保证代码安全。

2. 主类分析

这个示例应用程序由一个Activity(活动)组成,即HelloAndroidWorld。正如前面提到的,HelloAndroidWorld类是在HelloAndroidWorld.java
文件中实现的。

package org.deaboway.test;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class HelloAndroidWorld extends
Activity {

@Override

public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);

// TextView textView = new TextView(this);

// textView.setText(“Hello Android World!”);

// setContentView(textView);

setContentView(R.layout.main);

}

}

在这个源代码片段中,要注意几点:

  • HelloAndroidWorld 是一个普通的 Java 类,包含包和导入语句。
  • HelloAndroidWorld 扩展 android.app 包中的 Android 基类 Activity。
  • onCreate() 方法是这个活动的入口点,它接受一个 Bundle 类型的参数。Bundle 类本质上是 map 或
    hashmap 的包装器。在这个参数中传递构造活动所需的元素。这里暂时不讨论这个参数。
  • setContentView() 负责用 R.layout.main 参数创建主 UI。R.layout.main
    是应用程序资源中主布局的标识符。

3. R.java文件

R.java 文件是在构建时自动创建的,所以不要手工修改它,因为所有修改都会丢失。本实例的R.java文件内容如下:

package org.deaboway.test;

public final class R {

public static final class attr {

}

public static final class drawable
{

public static final int
icon=0x7f020000;

}

public static final class layout
{

public static final int
main=0x7f030000;

}

public static final class string
{

public static final int
app_name=0x7f040001;

public static final int
hello=0x7f040000;

}

}

R 类包含一些匿名子类,每个子类包含前面描述的各种资源的标识符。注意,这些类都是静态的。

请注意 R.layout.main 代表的元素。这个标识符代表由 main.xml 定义的布局。在活动的 onCreate
方法中可以使用这个值:setContentView(R.layout.main)。这就是在运行时把特定的活动(这里是HelloAndroidWorld)和特定的布局(主布局)联系在一起的方法。

4. main.xml文件

本示例应用程序包含一个活动和一个视图。应用程序包含一个名为 main.xml 的文件,它代表活动的主 UI 的视觉方面。

注意,在 main.xml 中没有指定在哪里使用这个布局。这意味着,如果需要的话,可以在多个活动中使用它。

<?xml version=“1.0”
encoding=“utf-8”?>

<LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

>

<TextView

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:text=“@string/hello”

/>

</LinearLayout>

这是最简单的布局,其中只有一个垂直的线性布局,这意味着所有元素排成一列。这里有一个 TextView
元素,它与其他开发环境中的标签类似。TextView 代表不可编辑的静态文本。

注意,每个视图元素(比如这个示例中的 LinearLayout 和 TextView)都有属于 Android
名称空间的属性。一些属性是所有视图元素都有的,比如 android:layout_width
和android:layout_height。这些属性可以采用的值是:

fill_parent – 使视图元素占满可用的空间。也可以认为这就是 “拉伸”。

wrap_content – 这个值让 Android 把元素一个接一个地排列,不进行拉伸。

5. AndroidManifest.xml文件

AndroidManifest.xml 文件是 Android
应用程序的部署描述符。这个文件列出应用程序中包含的所有Activity(活动)、ContentProvider(内容提供程序)、BroadcastReceiver(广播接收器)与Service(服务),以及应用程序支持的
IntentFilter。下面是这个示例应用程序的完整的 AndroidManifest.xml 文件。

<?xml version=“1.0”
encoding=“utf-8”?>

<manifest
xmlns:android=“http://schemas.android.com/apk/res/android”

package=“org.deaboway.test”

android:versionCode=“1”

android:versionName=“1.0”>

<application android:icon=“@drawable/icon”
android:label=“@string/app_name”>

<activity
android:name=“.HelloAndroidWorld”

android:label=“@string/app_name”>

<intent-filter>

<action
android:name=“android.intent.action.MAIN”
/>

<category
android:name=“android.intent.category.LAUNCHER”
/>

</intent-filter>

</activity>

</application>

</manifest>

  • 这里指定了源文件中的包名。采用与 Java
    源文件和导入语句相似的模式。<manifest> 标记的实际作用是
    “导入” 这个包中的类。在这个文件中,所有非完全限定的类都属于 package 属性指定的包。
  • <application>
    标记的一个属性引用了应用程序的一个资源。请注意 drawable 标识符前面的 @ 符号。这里的意思是,在应用程序资源的
    drawable 文件夹中寻找名为 “icon” 的资源。
  • <activity> 标记包含以下属性和值:
    • android:name表示实现这个活动的 Java 类。
    • android:label 是应用程序的名称。注意,它来自一个字符串资源。string.xml
      文件包含应用程序的本地化字符串。
    • <intent-filter> 表示应用程序中可用的
      IntentFilter。这是 Android 应用程序中最常见的 IntentFilter。这个过滤器的实际意思是,它实现 “主”
      操作(也就是入口点),而且它位于 OS 的启动器中。这意味着可以在 Android
      设备上像启动其他应用程序一样,从应用程序主列表中启动它。

四、 应用程序调试

要想检查正在运行的应用程序中发生了什么情况,就需要查看正在运行的 Dalvik VM。在 Eclipse 中,选择 Window
> Open Perspective > Other。在出现的对话框中选择
DDMS。这会在 Eclipse 中打开一个新的透视图,其中有许多有趣的窗口。

DDMS 为IDE和Emultor(or
GPhone)架起来了一座桥梁。Developer可以通过DDMS看到目标机器上运行的进程/线程状态:可以让Eclipse程序连接到开发机上运行;可以看进程的heap信息、logcat信息、进程分配内存情况;可以像目标机发送短信、发送地理位置信息以及打电话;可以像gdb一样attach
某一个进程调试。

下面简要介绍一下 DDMS 透视图中提供的资源:

1. Devices

Device 中罗列了Emulator中所有的进程,选项卡右上角那一排按钮分别为:Debug the selected
process调试进程、Update Heap更新进程堆栈信息、Dump HPROF file检查HPROF(Heap/CPU
Profiling Tool)文件、Cause GC调用垃圾回收、更新进程Update Threads、Start Method
Profiling开始方法分析、Stop Process停止某个进程,和Screen Capture抓取
Emulator目前的屏幕。当你选中某个进程,并按下调试进程按钮时,如果eclipse中有这个进程的代码,那就可以进行源代码级别的调试。有点像
gdb attach。图片抓取按钮可以把当前android的显示桌面抓到你的机器上,也是非常有用。

clip_image004

这里可以查看到所有与DDMS连接的终端的详细信息,以及每个终端正在运行的APP进程,每个进程最右边相对应的是与调试器链接的端口。因为Android是基于Linux内核开发的操作平台,同时也保留了Linux中特有的进程ID,它介于进程名和端口号之间。

DDMS监听第一个终端App进程的端口为8600,APP进程将分配8601,如果有更多终端或者更多APP进程将按照这个顺序依次类推。DDMS通过8700端口(”base
port”)接收所有终端的指令。

2. Emulator Control

通过这个面板的一些功能可以非常容易的使测试终端模拟真实手机所具备的一些交互功能,比如:接听电话,根据选项模拟各种不同网络情况,模拟接受SMS消息和发送虚拟地址坐标用于测试GPS功能等。

clip_image006

Telephony Status: 通过选项模拟语音质量以及信号连接模式。

Telephony Actions: 模拟电话接听和发送SMS到测试终端。

Location Control: 模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识,可以通过以下3种方式:

· Manual: 手动为终端发送二维经纬坐标。

· GPX: 通过GPX文件导入序列动态变化地理坐标,从而模拟行进中GPS变化的数值。

· KML: 通过KML文件导入独特的地理标识,并以动态形式根据变化的地理坐标显示在测试终端。

如:在Emulator Control\Telephony Actions 中输入如上图内容“Android
中文”,单击发送后,在Android模拟器中打开Messaging,看到下面的短信:

clip_image008

3. 文件管理器

显示文件系统信息。File
Explorer非常有用:它可以把文件上传到Android、或者从Android上下载文件下来、也可以进行文件删除操作。选项卡右上角有上传、下载、删除三个按钮。一般情况下,File
Explorer会有如下三个目录:data、sdcard、system。

· data对应手机的RAM,会存放Android OS
运行时的Cache等临时数据(/data/dalvik-cache目录);没有root权限时apk程序安装在/data/app中(只是存放apk
文件本身);/data/data中存放Android中所有程序(系统apk+第三方apk)的详细目录信息。

· mnt是mount,挂装的意思,mnt目录下的 sdcard对应sd卡。

· system对应手机的ROM,OS以及系统自带apk程序等存放在这里。

用户应用程序部署在 /data/app 目录中,而 Android 内置的应用程序部署在 /system/app
目录中。

clip_image010

4. Threads、Heap、Allocation Tracker

Threads视图列出当前进程的所有线程。

Heap视图展示一些堆的状态,在垃圾回收其间更新。当选定一个虚拟机时, VM
Heap视图不能显示数据,可以点击右边面包上的带有绿色的”Show heap updates”按钮,然后在点击”Cause GC
“实施垃圾回收更新堆的状态。

在Allocation Tracker视图里,我们可以跟踪每个选中的虚拟机的内存分配情况。点击”Start
Tracking”后点击”Get Allocations “就可以看到。

例如,为了查看Garbage Collection信息:点击 [Start Tracking]按钮
-> 保持程序运行一段时间后 ->点击[Get Allocations]
按钮,凭借得到的Allocations信息可以通过Line Number准确找到哪里的代码出现了问题。

clip_image012

5. LogCat

LogCat 是一个日志文件,它记录 VM 中发生的活动。应用程序可以通过 Log.i(tag,message);
在这个日志文件中添加自己的日志项,其中的 tag 和 message 都是 Java 字符串。Log
类属于android.util.Log 包。

clip_image014

6. Console

Android输出的信息,加载程序等信息。

clip_image016

用Eclipse开发和调试Android应用程序(一)

前面介绍了Windows环境下,基于Android SDK(2.3) 和
Eclipse(helios)的Android开发环境的搭建,并创建了第一个应用程序Hello Android
World。具体挺参考小生的blog:http://blog.sina.com.cn/deaboway
或者http://blog.csdn.net/deaboway

现在,我们已经可以使用Eclipse来创建和开发Android应用程序,本文将仍以Hello Android
World工程来深入解析Eclipse中Android工程的结构以及调试。

写上篇的时候,刚好Android SDK Platform Honeycomb Preview, revision
1(android-3.0_pre_r01-linux.zip)已经加入http://dl-ssl.google.com/android/repository/repository.xml,却无法下载,因此我们的第一个Android应用程序是用的Android
SDK Platform 2.3.1,即Android 9 AVD进行演示。现在Android SDK Platform
Honeycomb
Preview已经放到http://dl-ssl.google.com/android/repository/android-3.0_pre_r01-linux.zip,敢为天下先是我等求知若渴的程序员的优秀品质,因此,本次我们使用最新版本的Android
SDK Platform Honeycomb Preview来进行我们本次教程。

先看看最新的Honeycomb
Preview的样子吧(由于是Preview版本,启动确实不敢恭维,根据传闻,前几天之所以该版本一度无法下载安装是因为google发现这个Preview版本太烂,面子上挂不住,所以又撤掉了,呵呵):

clip_image002

相比手机上目前使用的最高Android 2.3版本而言,Android 3.0
Honeycomb更适合平板电脑使用,是专门为Android平板电脑进行优化的系统版本。随着SDK的发布,更加有利于开发者和厂商针对
Android 3.0 Honeycomb平板电脑进行开发,包括Android平板电脑应用和匹配。

一、 Android 应用程序概述

1. Android的嫡系组件

Android有四项一等公民(或称为嫡系组件),包括:Activity(活动)、ContentProvider(内容提供程序)、BroadcastReceiver(广播接收器)与Service(服务)。它们都必须宣告于AndroidManifest.xml档案里。

Activity活动

活动是最常用的 Android 应用程序形式。活动在一个称为视图(后文将介绍)的类的帮助下,为应用程序提供 UI。视图类实现各种
UI 元素,比如文本框、标签、按钮和计算平台上常见的其他 UI 元素。

一个应用程序可以包含一个或多个活动。这些活动通常与应用程序中的屏幕形成一对一关系。

应用程序通过调用 startActivity() 或 startSubActivity()
方法从一个活动转移到另一个活动。如果应用程序只需“切换”到新的活动,就应该使用前一个方法。如果需要异步的调用/响应模式,就使用后一个方法。在这两种情况下,都需要通过方法的参数传递一个
intent。

由操作系统负责决定哪个活动最适合满足指定的 intent(后文将介绍)。

对于Activity,关键是其生命周期的把握(后文将介绍),其次就是状态的保存和恢复(onSaveInstanceState
onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent)。

Activity几乎承接着用户对应用程序(Application)的所有操作,Activity应该有一个窗口(Window),这个窗口是可以通过不用的主题(Theme)改变样子的。Activity应该要注意它的生命周期(Lifecycle)、设备状态(Configuration)改变时的影响以及运行状态和数据的保存,这个在一个应用程序是否可靠和人性化上至关重要。Activity里还应该要申明一些许可(Permissions),以便使用Android的一些软硬件功能,这些申明可以由代码或者Manifest.xml给出。最后,每个Activity(的入口)一定要在Manifest当中申明。

Service服务

与其他多任务计算环境一样,“在后台”运行着一些应用程序,它们执行各种任务。Android
把这种应用程序称为“Service服务”。

Service是没有界面的程序,它是所谓的服务,也叫后台程序。应该要非常注意Service的启动(startService)和绑定(bindService)这两种开启Service的方法之间的关系以及Service对应的生命周期,两种开户Service的方法对Service
的生命周期效果是不同的。还有就是申明许可以及申明Service,也是在代码内或者Manifest内申明。

BroadcastReceiver广播接收器

广播接收器是一个应用程序组件,它接收请求并处理 intent。与服务一样,接收器在一般情况下也没有 UI 元素。广播接收器通常在
AndroidManifest.xml 文件中注册。广播接收器的类属性是负责实现这个接收器的 Java 类。

广播接收并不是通常所说的无线电广播,而是指由sendBroadcast()所发送出来的意图(Intent),即广播在这里的意思是意图,BroadcastReceiver在注册(Registe)之后可以自动监听符合预先给定的条件的意图,如果有则会通知此
BroadcastReceiver的持有程序。

ContentProvider内容提供程序——数据管理

内容提供程序是 Android
的数据存储抽象机制。我们以移动设备上常见的一种数据为例:地址簿或联系人数据库。地址簿包含所有联系人及其电话号码,用户在使用手机时可能需要使用这些数据。内容提供程序对数据存储的访问方法进行抽象。内容提供程序在许多方面起到数据库服务器的作用。对数据存储中数据的读写操作应该通过适当的内容提供程序传递,而不是直接访问文件或数据库。可能还有内容提供程序
的 “客户机” 和 “实现”。

ContentProvider是作保存应用程序数据和建立维持数据库之用,以便程序重新启动时回到以前的状态或者保存信息。应该注意应用程序的使用权限以及SQL语言的使用,Android用的是一个轻量级的数据库系统SQLite。

2. Android生命周期

Android
程序的生命周期是由系统控制而非程序自身直接控制,这与桌面应用程序在程序自身收到关闭请求后执行一个特定的动作(比如从 main 函数中
return)而导致进程结束的思维不同。

在Android系统中,当某个activity调用startActivity(myIntent)时,系统会在所有已经安装的程序中寻找其intentfilter和myIntent最匹配的一个activity,启动这个进程,并把这个intent通知给这个activity。这就是一个程序的“生”。在Android中,所有的应用程序“生来就是平等的”,所以不光Android的核心程序甚至第三方程序也可以发出一个intent来启动另外一个程序中的一个activity。Android的这种设计非常有利于“程序部件”的重用。

Android根据其重要性在内存不足的时候移去重要性最低的进程。重要性由高到低为:

1.前台进程。这样的进程拥有一个在屏幕上显示并和用户交互的activity或者它的一个IntentReciver正在运行。这样的程序重要性最高,只有在系统内存非常低,万不得已时才会被结束。

2.可见进程。在屏幕上显示,但是不在前台的程序。比如一个前台进程以对话框的形式显示在该进程前面。这样的进程也很重要,它们只有在系统没有足够内存运行所有前台进程时,才会被结束。

3.服务进程。这样的进程在后台持续运行,比如后台音乐播放、后台数据上传下载等。这样的进程对用户来说一般很有用,所以只有当系统没有足够内存来维持所有的前台和可见进程时,才会被结束。

4.后台进程。这样的程序拥有一个用户不可见的activity。这样的程序在系统内存不足时,按照LRU的顺序被结束。

5.空进程。这样的进程不包含任何活动的程序部件。系统可能随时关闭这类进程。

从某种意义上讲,垃圾收集机制把程序员从“内存管理噩梦”中解放出来,而Android的进程生命周期管理机制把用户从“任务管理噩梦”中解放出来。Android使用Java作为应用程序API,并且结合其独特的生命周期管理机制同时为开发者和使用者提供最大程度的便利。

Activity生命周期

Activity中常用的函数有SetContentView() findViewById() finish()
startActivity(),其生命周期涉及的函数有:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

clip_image004

注意的是,Activity的使用需要在Manifest文件中添加相应的<Activity>,并设置其属性和intent-filter。

Service生命周期

Service可以通过Context.startService()或Context.bindService()创建,通过Context.stopService()、Service.stopSelf()、Service.stopSelfResult()或Context.unbindService()来关闭。其生命周期涉及的函数有:

void onCreate()

void onStart(Intent intent)

void onDestroy()

其中onCreate()和onDestroy()可以被所有服务调用,无论是由Context.startService()还是Context.bindService()发起的Service。但是,onStart()只能被由startService()发起的Service调用。

如果一个Service运行其它对象绑定它,需要扩展如下callback方法:

IBinder onBind(Intent intent)

boolean onUnbind(Intent intent)

void onRebind(Intent intent)

clip_image006

BroadcastReceiver生命周期

只包含一个方法:void onReceive(Context curContext, Intent
broadcastMsg)

包含活动的组件的BroadcastReceiver将不会被系统关闭,但是仅包含不活动的组件的进程将随时会背系统关闭(当其它组建需要内存时)。

3.
Intent简介——Android的创新导航与触发机制

前文介绍了Android的四项一等公民:Activity(活动)、ContentProvider(内容提供程序)、BroadcastReceiver(广播接收器)与Service(服务)。这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。

在这些组件之间的通讯中,主要是由Intent协助完成的。Intent是Android应用开发里很重要的一个元件,通过Intent可以从一个Activity来启动另一个任意的Activity,不管是自己定义的还是系统定义的。在ActivityGroup(extends
Activity)里面,Intent的flag设置对于子Activity的启动方式至关重要。

Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将
Intent传递给调用的组件,并完成组件的调用。

因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

Android应用程序框架的强大之处在于它将Web习惯引入到移动应用程序中。这并不意味着该平台提供了一个强大的浏览器,也不仅限于使用
JavaScript和服务器端资源,而是涉及Android平台的工作原理以及该平台的用户如何与移动设备交互这一核心问题。互联网的强大之处一言以蔽之,在于一切事物通过一次单击即可获得。这些单击的内容对于用户来说就是URL(UniformResource
Locator,统一资源定位符)或URI(Uniform Resource
Identifier,统一资源标识符)。有效使用URI可帮助用户方便快捷地访问所需的日常信息。“把链接发给我”就说明了一切。

在移动设备上复制桌面设备体验的平台只能吸引一小部分忠实的用户。多级菜单、多次单击在移动市场中通常都不被人所接受。移动应用程序对直观易用的要求比其他任何市场中的应用程序都要高。Intent和IntentFilter将“单击”范例引入到了Android平台移动应用程序使用和开发的核心中。

Intent结构

Intent是执行某操作的一个抽象描述,它描述了如下内容:

首先,要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android为我们定义了一套标准动作:

MAIN_ACTION

VIEW_ACTION

EDIT_ACTION

PICK_ACTION

GET_CONTENT_ACTION

DIAL_ACTION

CALL_ACTION

SENDTO_ACTION

ANSWER_ACTION

INSERT_ACTION

DELETE_ACTION

RUN_ACTION

LOGIN_ACTION

CLEAR_CREDENTIALS_ACTION

SYNC_ACTION

PICK_ACTIVITY_ACTION

WEB_SEARCH_ACTION

此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的Activity来处理我们的自定义动作。

其次,执行动作要操作的数据(data),Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。这种URI表示,通过
ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。

此外,除了action和data这两个重要属性外,还有一些附加属性:

category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent
的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。

type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent
中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果
component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。

extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

总之,action、 data/type、category和extras
一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加入到系统中,它们可以添加新的action、
data/type、category来扩展这种语言。应用也可以提供自己的Activity来处理已经存在的这样的“短语”,从而改变这些“短语”的行为。

解析Intent

在应用中,我们可以以两种形式来使用Intent:

·
显式(直接)Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context,Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。

·
隐式(间接)Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

对于显式(直接)Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式(间接)Intent,通过解析,将Intent映射给可以处理此Intent的Activity、BroadcastReceiver或Service。

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:

·
如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;

·
如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

·
如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme(比如http:或者mailto:)进行匹配。同上,Intent的scheme必须出现在目标组件的scheme列表中。

·
如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

IntentIntentFilter

Intent是对需要的声明。

IntentFilter是在需要时有能力和有兴趣提供协助的声明。

Intent由一系列描述所需动作或服务的信息构成。本节将介绍所请求的动作以及与之相关的数据。

IntentFilter可以是通用的,也可以特定于向某些Intent提供服务。

Intent的动作属性通常为动词,例如VIEW、PICK或EDIT。很多内置的Intent动作都是作为Intent类的成员定义的。应用程序开发人员也可以创建新动作。要查看信息,应用程序可以采用以下Intent动作:Intent的数据部分采用URI的形式表示,并且可以是信息的任何部分,例如联系人记录、网站位置或对媒体剪辑的引用。

IntentFilter定义Intent与应用程序之间的关系。IntentFilter可以与Intent的数据部分或动作部分相关,或同时与两者相关。IntentFilter还包含一个category(类别)字段。类别可以帮助对动作进行分类。例如,CATEGORY_LAUNCHER类别指示Android包含此Intent-Filter的Activity在主应用程序启动器或主界面上应该处于可见状态。

分发Intent后,系统会计算可用的Activity、Service,以及已注册的BroadcastReceiver,并将
Intent分发给大多数适当的接收者。

clip_image007

IntentFilter通常在应用程序的AndroidManifest.xml中使用<intent-filter>标记进行定义。从本质上说,AndroidManifest.xml文件就是一个应用程序描述符文件。

下一节介绍,这是 Android 在移动设备屏幕上显示 UI 元素的机制。

4. Android
视图——显示用户界面(UI)元素

Android 活动通过视图显示UI元素。视图采用以下布局设计之一:

· LinearVertical – 后续的每个元素都排在前一个元素下面,形成一个单一列。

· LinearHorizontal – 后续的每个元素都排在前一个元素右边,形成一个单一行。

· Relative – 后续的每个元素相对于前一个元素有一定的偏移量。

· Table – 与 HTML 表相似的一系列行和列。每个单元格可以包含一个视图元素。

选择一种布局(或布局的组合)之后,就可以用各个视图显示 UI。

视图元素由大家熟悉的 UI 元素组成,包括:

· Button

· ImageButton

· EditText

· TextView(与标签相似)

· CheckBox

· Radio Button

· Gallery 和 ImageSwitcher(用来显示多个图像)

· List

· Grid

· DatePicker

· TimePicker

· Spinner(与组合框相似)

· AutoComplete(具有文本自动补全特性的 EditText)

视图是在一个 XML 文件中定义的。每个元素都有一个或多个属于 Android 名称空间的属性。

[转载]2011中国通信业十大预测(转)

有点靠谱的

一、3G用户数将过亿

  井喷,鉴于基数的影响,100%的增长率也许都不能被称之为井喷。

  据工信部数据显示,截至2010年10月底,中国3G用户累计达到3863.7万户,环比增长10.4%,同比增长295.7%。其中,中国移动3G累计在网用户达到1698.1万户,中国联通3G用户总数累计达1165.6万户,中国电信累计3G用户达到1000万户。这样的增长率,远远达不到井喷的规模。

  据行业权威分析机构称,2011年,预计中国移动3G投资规模约为400亿元、中国联通约为200亿元、中国电信约为150-180亿元。也就是说,2011年国内运营商主导的3G投资规模约在750-780亿元。随着2011年国内三大运营商在3G网络优化覆盖方面投资量的增加,以及近两年来运营商在基础建设方面所做出的努力,2011年,3G用户规模有望累计达到1亿。

  另外,前不久工信部电信研究院副院长曹淑敏也曾表示,目前,我国3G的移动用户渗透率只有4.2%,2010年底将达到5%,预计2011年年中3G渗透率可达10%。

  二、运营商将重点转移至垂直市场

  3G时代到底能为我们带来什么?在3G网络带宽、终端应用优势之下,移动互联网正在以前所未有的速度发展。

  如今,价值链各方不断向上、下游拓展其业务领域,各个互联网公司、电信运营商、终端厂商纷纷打破以往的竞争界限,并提出各自的移动互联网战略。其中,电信运营商为了保持竞争优势,加速在新业务领域布局,十分强调对产业链上、下游关键环节的把控以及对业务的整合。

  然而,在网络IP化的3G时代,通信产品逐渐变得开放。在这个开放平台上能够取代或者部分取代传统运营商的产品和服务也越来越多,例如各类开发程序的标准化,独立的音乐、游戏等由单机软件时代向互联互动时代的转变。

  一直以来,语音和短信业务是运营商的主要收入来源。2011年,我国运营商将更深层次的挖掘自身潜力,确定自己在垂直市场的位置,寻找更多的参与机会。这一市场将包括,航空、航天、智能电网、医疗、保健、旅游等。

  比如,前不久,中国移动海南分公司在原有的移动互联经验和平台资源的基础上,将“e拇指”转型成为了旅游文化平台。“e拇指”平台将紧紧抓住旅游文化这个核心竞争点,结合线上、线下活动,实现对旅游文化的搜集整理。可以说,“e拇指”项目作为运营商向移动互联网价值链拓展的一次尝试,也是其进行移动互联网战略转型的落地项目之一。

  三、诺基亚市场占有率仍将保持第一

  诺基亚衰败了吗?纵观2010前三季度的所有调查数据,诺基亚的市场占有率的确在持续下滑,可仍和第二名保持着10%以上的市场占有率差距。

  根据诺基亚2010年第三季度财报显示,诺基亚移动终端销量为1.104亿部,年同比上升2%,比上一季度下降1%;诺基亚融合移动终端(智能手机和移动电脑)销量为2650万部,年同比上升61%,比上一季度增长10%。

  目前,大家对于诺基亚能否保持市场占有率第一存在的疑问,主要集中在其智能终端能否仍被大众接受。对于这点,其实大可不必担心,首先刚才提到的诺基亚第三季度财报已经足够说明问题,其智能手机和移动电脑的销量,年同比上升61%,比上一季度增长了10%。同时,咨询公司Canalys2010年三季度刚出炉的报告称,Symbian市场份额为37%,Android市场份额为17%。Android做到现在,用了三年的时间,其增长率已经日趋平缓,据一家权威咨询公司Gartner的预计,以目前的情况计算,2014年Android有可能超过塞班成为第一大操作系统,即便如此,也是2014年而不是2011年,况且iPhone4用户的不断增加,威胁到的也不仅仅是诺基亚。

  另外,在高端智能手机市场,诺基亚的市场占有率的确在以令人难以接受的速度下滑,但在中低端市场,又有哪个厂商能与诺基亚抗争呢?当然,如果2011年高端智能手机的价格有较大幅度的下滑,可能会威胁到诺基亚在中低端手机市场的份额,但从目前的情况来看,这种情况发生的几率几乎为零。

  四、我国智能手机规模将超2亿

  2010年,智能手机成为整个业界关注的焦点。Gartner统计数据显示,2010年第一季度,全球普通手机销量为3.147亿部,同比增长17%,而智能手机销量同比增长48.7%,达5430万部。第二季度,全球智能手机销量达6165万部,同比增长50%。预据测算,智能手机将以每年50%的速度提升。这意味着到2014年,中国将有一半以上的手机用户使用智能手机终端,届时将全面进入手机智能时代。

  在前不久国美电器发布的2011年智能手机消费趋势报告中介绍,随着智能手机的发展手机在功能方面将会变得更为独立,手机与传统PC之间的依赖关系将会逐渐淡化,手机将更多地以一个独立的设备而存在,并最终的与传统的PC之间脱离关系,这就是智能手机功能融合化之后的未来。

  五、Android将成第一大智能手机操作平台

  市场研究机构IDC预测,2010年全球的智能手机销量将达2.7亿部,比2009年增长55%,除iPhone4热销外,基于Android平台开发的智能手机三季度出货量达到2050万部,较二季度大幅增长93.29%,三季度Android系统手机出货量占比已达到25.5%,成为推动智能手机高增长的力量。同时,低价智能手机的出现也将刺激智能手机的快速普及,市场研究机构TRI预计2011年低价智能手机出货量将快速攀升至4000万部,2012年更可望大幅上升至1.5亿部。因此,智能手机将持续热销,预计2011年智能手机销量将达到4亿部。

  Android在2010年跃居为第二大平台,Android手机全年出货将达5845万部,市占率为20.8%。与2009年相较,Symbian虽仍居第一,但市占率已大幅下滑至35.5%。

  在Android将成为2011年第一大智能手机操作平台的理由中,除了强有力的数据支撑之外,Symbian在2011年将逐渐退出智能手机平台也将近一步促使Android的市场占有率提升。2011年,万众瞩目的MeeGo平台必然会推出,从之前的消息来看,诺基亚已经将MeeGo系统作为自己最大的赌注,虽然现在看起来MeeGo并没有取得实质性的进展,要推出采用MeeGo操作系统的强悍产品诺基亚还有很多的事情要做,因此在MeeGo操作系统能够独当一面成为诺基亚中流砥柱之前,诺基亚仍然需要一些靠谱的过渡方案。

  六、国产手机市场占有率会有所提升

  国产手机的市场占有率已经低的不能再低了!据ZDC的统计数据显示,2010年上半年,国产手机市场占有率仅为10%左右。

  这就不得不简单回顾一下国产手机近几年的发展情况。2003年前后几年,国产手机迎来发展高峰,至此国外手机品牌独占中国手机市场的局面被改变。但不久,国外手机厂商便开始进入国产手机市场份额最大的低端市场,同时国产手机开始遭遇质量问题。随着越来越多的国外厂商进入低端市场,国产手机的优势不再,市场份额也开始下滑。

  但在近几个月,我们看到了国产手机的希望。中兴和华为在海外市场不断推出新款手机终端产品,国内联想在和中国联通合作推出联通版乐Phone之后,和中国电信的合作也顺利展开,同时,值得欣慰的是,MTK平台下的产品呈直线下降的趋势,个人认为,大量的采用MTK操作系统,是之前导致国产手机不被消费者认可的主要原因之一。试想,在同质化严重的国产手机市场,各个厂商不能在产品外型上进行有效的创新,又采用同样的UI界面和操作系统,会有几个消费者买账?国产手机市场占有率在今年下半年有回升趋向,大部分要归功于Android智能操作平台的开放性。

  相信2011年,在国产手机厂商经过区域、渠道、产品设计方面的调整,会取得一个比较好的成绩,毕竟在移动互联网这个以人性化应用为主的时代,只有中国的制造商才更了解中国市场!

  七、手机游戏市场将持续扩大但收费仍难实现

  2008年以来的手机游戏市场一直处于高速增长期,手机游戏开发商大量增加,众多新老CP进入市场,许多SP纷纷转型,手机游戏产品出现过剩现象。加上手机游戏品牌号召力弱,同质化严重,用户疲劳度提高,从而影响用户的付费意愿,因此在2011年,一批不注重产品本身或中小CP将会出现经营困难。

  据调查机构介绍,手机游戏用户增速将在2011年达到41%,在2012年之后中国手机游戏用户增长将趋向放缓。造成这一现象的原因主要来自三方面:一是低端机的性能得到显著提高,Android系统的手机快速走向600-700元区间,带来了一批中低端的手机用户;另一方面以iPhone和Android、诺基亚中高端机为代表的手机终端使手机游戏的获得变得非常便捷,使大批中高端用户成为手机游戏用户;同时,当用户突破2亿大关后,手机游戏用户自然增速将逐步趋缓,用户活跃度和提升用户付费意愿成为行业发展重要的指标。

  根据数据显示,目前在所有的手机消费类应用下载中,有70%至80%为手机游戏,而其中的60%至70%是免费的。Gartner首席分析师表示,围绕手机应用商店的大量宣传进一步扩大了手机游戏的营收潜力,但多数手机游戏玩家仍钟情于免费游戏,免费手机游戏的广告支持商业模式在未来三年内不会有太大的发展空间。

  八、LBS类应用将受用户热捧

  中国互联网络信息中心统计显示,截至2010年11底,我国网民规模已达4.5亿,其中,智能手机占手机市场份额达30%,2011年更将取代美国成为全球第一大智能手机国,手机上网已成为我国互联网用户的新增长点。

  由用户数量与市场规模来看中国LBS产业,免费应用程序已打败收费产品,收费服务销售额停滞不前,而且没有一种可行的商业模式,如根据用量计费、广告赞助、终生地图更新订阅或增强内容,是针对免费应用程序的。市场分析报告显示:中国现在已是全球最大的新兴LBS市场,13亿的庞大人口蕴含巨大销售潜力;透过精心规划,LBS服务与内容供货商将取得可观的回报。

  对于互联网未来发展及竞争核心,业内专家分析,基于手机平台的LBS将是互联网未来发展方向,传统互联网将全面LBS化,成为网站标配,这意味着,如果中国能在LBS领域领先,将改变中国互联网在世界的地位。

  九、微博一亿用户将有一半以上“沉睡”

  随着3G时代的到来及移动互联网的普及,即时通信类的应用更多的被用户接受,在刚刚出炉的2010通信行业关键字评选中,“微博”当之无愧的进入前十的排名。

  当超简洁的微博风靡全球,又有许多人毅然抛弃博客,开启微博生活,重新考验起自己的决心和耐力。可这种依靠新鲜感来维系的时尚又能坚持多久?2010年底中国微博累计活跃注册账户数将突破6500万,2011年年中将突破1亿。

  一个如此开放的信息发布平台,给予了用户在使用及思想上的最大自由度。“自由言论自然会产生言论繁盛的状况”。自由言论因微博而产生,同时微博因自由言论而更加红火。看到微博开放的好,但我们不要忘了微博因信息的开放性而产生的负面影响。

  根据调查显示,目前我国个人博客或个人空间的用户超过2亿,博客空间的规模超过4亿,但其中,活跃用户不到一半,沉睡博客超过1亿。另外,之前被广泛看好的SNS类网站的现状也并不乐观,一起网、占座网、亿友、亿聚网等中小SNS网站,正在资金断链资背景下艰难生存。蚂蚁网CEO麦田甚至转投巨头怀抱,加盟百度新成立的社会化网络事业部。在经过博客、SNS的繁华退去之后,微博还能“火”多久?在严格监管环境下,我们自由的言论还能聊多久?

  十、以上预测将成为事实

来源:飞象网 作者:王鹏

Android SDK 2.3与Eclipse最新版开发环境搭建(五)

七、
第一个Android应用(HelloAndroid
World!

  1. 新建项目:打开Eclipse,选择 File > New >
    Project > Android Project,具体输入如下图:

clip_image002

  1. 点击“Next”,提示如下:

clip_image004

  1. 这里仅为演示,不创建测试项目。直接点击“Finish”按钮即可。

clip_image006

  1. 编辑HelloAndroidWorld.java文件,内容如下:

package org.deaboway.test;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class HelloAndroidWorld extends
Activity {

@Override

public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);

TextView textView = new TextView(this);

textView.setText(“Hello Android World!”);

setContentView(textView);

}

}

  1. 运行Android项目:点击工具栏的运行按钮,或选择菜单:Run->Run,或右键项目文件夹,会弹出“Run
    As”对话框,选择“Android Application”,点击“OK”按钮。

clip_image008

  1. 运行效果如下,AVD加载的速度有些慢,需要耐心等待。

clip_image010

  1. 同时,Eclipse的控制台也会打印出运行时的一些相关信息,如下。

clip_image012

Android SDK 2.3与Eclipse最新版开发环境搭建(四)

五、 Eclipse ADT配置

ADT的Eclipse
Plugin
安装成功之后,开始ADT的配置,具体如下:

1. Eclipse重启后,选择Window >
Preferences…,在打开的属性框,选择Android,可以看到:

clip_image002

2. 在SDK location中输入你的Android SDK所在的目录,然后按 Apply按钮
即可看到我们安装SDK包,如下图:

clip_image004

至此,Eclipse+ADT的集成开发环境就安装配置完毕。

六、 Android SDK配置

这里介绍下新建AVD。所谓AVD,即Android Virtual Devices
,Android虚拟设备,亦即嵌入式开发中常用的模拟器。

  1. 在Eclipse中选择 Window-Android SDK and AVD Manager
    ,或者在android-sdk-windows文件夹中双击SDK Manager.exe,可以看到类似如下界面:

clip_image006

注:这里可以看到小生已经创建过两个AVD,其实这两个AVD并不是在本文下载安装的Android
SDK
中配置的,但是由于所有的AVD配置信息都是存储在当前用户的home中,如:C:\Documents
and Settings\Administrator\.android\avd
。因此,这里也可以看到。

  1. 在弹出的 Android SDK and AVD Manager对话框,选择 Virtual Devices,按new 按钮
    创建虚拟设备,输入如下图所示:

clip_image008

其中:

  • Target:SDK的类型
  • SD card:SD卡的大小
  • Skin:显示屏的类型
  1. 点击“Create AVD”按钮,如果安装成功,会在“Android SDK and AVD
    Manager”对话框中显示。

clip_image010

至此开发环境配置完成,接下来即可以进行Android上应用的开发。