用 Eclipse 开发 Android 应用程序
转自:http://www.apkbus.com/android-13828-1-1.html
- Android 基础知识和必需的工具
- Android Software Developer Kit
- 构建和调试 SaySomething Android 应用程序
- 创建内容提供器和 Google Maps 应用程序
Eclipse 平台Eclipse 是一个运行插件的平台。您应该安装 Eclipse Classic 的最新版本(本教程使用 V3.3.1)。Android Developer Tools按照 安装 Android SDK 中的说明安装 Android Developer Tools(Eclipse 插件)。
源代码本教程中的源代码片段包括:
- AndroidManifest.xml(片段)— 这个文件是 Android 应用程序的应用程序部署描述符。
- IntentReceiver — 演示 IntentReceiver 的实现,这个类处理 AndroidManifest.xml 文件中 IntentFilter 标记所公布的 intent。
- SaySomething.java — 实现一个 Android 活动,这是本教程的示例应用程序的主要入口点。
- Main.xml — 这个文件包含 Android 活动所用的视觉元素或资源。
- R.java — 这个文件是由 Android Developer Tools 自动生成的,它把视觉资源 “连接” 到 Java 源代码。
- AndroidManifest.xml(完整)— 这是完整的 AndroidManfest.xml 文件,包含每个重要元素的描述。
- MobileServiceCallContacts.java — 这个文件包含的代码显示联系人并对用户输入做出反应,执行 Google Maps 地址查找。
Open Handset Alliance这是一个由 Google 公司主导的组织,它由许多公共和私人组织组成。Android这是 Open Handset Alliance 的主打产品。它是一种针对移动设备的开放源码操作环境。模拟器模拟另一个系统的软件工具 — 这常常是在个人计算机(IBM®、Mac、Linux®)上运行的一个环境,它模拟另一个环境,比如移动计算设备。Linux一种开放源码的操作系统内核,许多计算平台都使用这种操作系统,包括服务器、桌面计算机、网络设备和移动计算设备。Android 在 Linux 内核上运行。Dalvik Virtual MachineDalvik VM 是 Android 产品组合中的一种操作环境,它在运行时解释应用程序代码。Dalvik VM 与 Java VM 相似,但是两者不兼容。
- 基于 Linux 内核的操作系统
- Java 编程环境
- 工具集,包括编译器、资源编译器、调试器和模拟器
- 用来运行应用程序的 Dalvik VM
清单 1. 对 SMS 进行响应的 Android 应用程序
- <receiver class=".MySMSMailBox" >
- <intent-filter>
- <action android:value="android.provider.Telephony.SMS_RECEIVED" />
- </intent-filter>
- </receiver>
清单 2. 接收器代码
- package com.msi.samplereceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentReceiver;
- public class myreceiver extends IntentReceiver
- {
- public void onReceiveIntent(Context arg0, Intent arg1)
- {
- // do something when this method is invoked.
- }
- }
LinearVertical后续的每个元素都排在前一个元素下面,形成一个单一列。LinearHorizontal后续的每个元素都排在前一个元素右边,形成一个单一行。Relative后续的每个元素相对于前一个元素有一定的偏移量。Table与 HTML 表相似的一系列行和列。每个单元格可以包含一个视图元素。
- Button
- ImageButton
- EditText
- TextView(与标签相似)
- CheckBox
- Radio Button
- Gallery 和 ImageSwitcher(用来显示多个图像)
- List
- Grid
- DatePicker
- TimePicker
- Spinner(与组合框相似)
- AutoComplete(具有文本自动补全特性的 EditText)
清单 3. 简单的 LinearVertical 布局
- <?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="Activity 1!"
- />
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Activity 1, second text view!"
- />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Switch To Activity 2"
- id="@+id/switchto2"
- />
- </LinearLayout>
- 在 Eclipse 中运行 “Find and Install” 特性(在 Help > Software Updates 菜单下面)。
- 选择 Search for new features to install 选项。
- 选择 New Remote Site。给站点命名,比如 “Android Developer Tools”。在对话框中输入以下 URL:https://dl-ssl.google.com/android/eclipse。注意,这个 URL 使用 HTTPS 协议。这是一个安全的下载。
图 1. New Update Site
<ignore_js_op> - 列表中会增加一个新条目并被默认选中。单击 Finish。搜索结果会显示 Android Developer Tools。选择 Developer Tools 并单击 Next。
- 阅读并接受许可协议之后,单击 Next。注意,许可协议中对于使用 Google Maps API 有一个特殊的要求。
- 检查并接受安装位置,然后单击 Finish。
- Build 部分中的选项用来自动地重新构建资源。保持这个选项的设置不变。Build 选项可以改变输出的详细程度。Normal 是默认设置。
- DDMS — Dalvik Debug Monitor Service 用来监视正在运行的 VM。这些设置指定调试器用来连接 VM 的 TCP/IP 端口号、各个日志记录级别和选项。默认设置应该是合适的。
- LogCat — 这是在底层 Linux 系统上创建的一个日志文件。可以在这个对话框中选择字体。根据需要调整这个选项。
图 2. New project 向导
<ignore_js_op>
- Name
- Location
- Package name
- Activity name — 可以认为这是应用程序的主 “表单” 或屏幕
- Application name
图 3. 新的 Android 项目
<ignore_js_op>
图 4. Package Explorer
<ignore_js_op>
src 文件夹包含示例应用程序的包,即 com.msi.ibmtutorial。R.javaAndroid Developer Tools 自动创建这个文件,它提供访问 Android 应用程序的各种资源所需的常量。后面会详细讨论 R 类与资源之间的关系。SaySomething.java应用程序的主活动类的实现。Referenced libraries包含 android.jar,这是 Android SDK 中的 Android 运行时类的 jar 文件。res 文件夹包含应用程序的资源,包括:
- 图标
- 布局文件
- 字符串
AndriodManifest.xml示例应用程序的部署描述符。
清单 4. SaySomething.java
- package com.msi.ibmtutorial;
- import android.app.Activity;
- import android.os.Bundle;
- public class SaySomething extends Activity
- {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle icicle)
- {
- super.onCreate(icicle);
- setContentView(R.layout.main);
- }
- }
- SaySomething 是一个普通的 Java 类,包含包和导入语句。
- SaySomething 扩展 android.app 包中的 Android 基类 Activity。
- onCreate() 方法是这个活动的入口点,它接受一个 Bundle 类型的参数。Bundle 类本质上是 map 或 hashmap 的包装器。在这个参数中传递构造活动所需的元素。本教程不讨论这个参数。
- setContentView(..) 负责用 R.layout.main 参数创建主 UI。R.layout.main 是应用程序资源中主布局的标识符。
Drawables这个文件夹包含图形文件,比如图标和位图。Layouts这个文件夹包含表示应用程序布局和视图的 XML 文件。后面会详细研究这些文件。Values这个文件夹包含 strings.xml 文件。这是为应用程序实现字符串本地化的主要方法。
清单 5. 布局文件
- <?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="Hello World, SaySomething"
- />
- </LinearLayout>
fill_parent使视图元素占满可用的空间。也可以认为这就是 “拉伸”。wrap_content这个值让 Android 把元素一个接一个地排列,不进行拉伸。
清单 6. R.java 文件
- /* AUTO-GENERATED FILE. DO NOT MODIFY.
- *
- * This class was automatically generated by the
- * aapt tool from the resource data it found. It
- * should not be modified by hand.
- */
- package com.msi.ibmtutorial;
- 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=0x7f040000;
- }
- }
图 5. 错误面板
<ignore_js_op>
清单 7. AndroidManifest.xml 文件
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.msi.ibmtutorial">
- <application android:icon="@drawable/icon">
- <activity class=".SaySomething" android:label="@string/app_name">
- <intent-filter>
- <action android:value="android.intent.action.MAIN" />
- <category android:value="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
- 这里指定了源文件中的包名。这里采用与 Java 源文件和导入语句相似的模式。<manifest> 标记的实际作用是 “导入” 这个包中的类。在这个文件中,所有非完全限定的类都属于 package 属性指定的包。
- <application> 标记的一个属性引用了应用程序的一个资源。请注意 drawable 标识符前面的 @ 符号。这里的意思是,在应用程序资源的 drawable 文件夹中寻找名为 “icon” 的资源。
- <activity> 标记包含以下属性和值:
- class 属性表示实现这个活动的 Java 类。
- android:label 是应用程序的名称。注意,它来自一个字符串资源。string.xml 文件包含应用程序的本地化字符串。
- <intent-filter> 表示应用程序中可用的 IntentFilter。这是 Android 应用程序中最常见的 IntentFilter。这个过滤器的实际意思是,它实现 “主” 操作(也就是入口点),而且它位于 OS 的启动器中。这意味着可以在 Android 设备上像启动其他应用程序一样,从应用程序主列表中启动它。
图 6. Run 对话框
<ignore_js_op>
图 7. Run 对话框,Emulator 选项卡
<ignore_js_op>
图 8. 模拟器
<ignore_js_op>
图 9. LogCat
<ignore_js_op>
图 10. 在模拟器上部署的示例应用程序
<ignore_js_op>
图 11. 正在运行的进程列表
<ignore_js_op>
图 12. 模拟器中与联系人应用程序相关的条目
<ignore_js_op>
清单 8. 第一个代码片段
- public class MobileServiceCallContacts extends ListActivity
- {
- final String tag = "MSCC";
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle icicle)
- {
- super.onCreate(icicle);
- setContentView(R.layout.main);
- // Get a cursor with all people
- Cursor c = getContentResolver().query(People.CONTENT_URI, null, null,
- null, null);
- startManagingCursor(c);
- ListAdapter adapter = new SimpleCursorAdapter(this,android.R.
- layout.simple_list_item_1,c,new String[] {People.NAME} ,new int[]
- {android.R.id.text1});
- setListAdapter(adapter);
- }
- ...
- }
图 13. 应用程序的运行效果
<ignore_js_op>
清单 9. 覆盖的 onListItemClick() 方法
- @Override
- protected void onListItemClick(ListView list,View view,int position,long
- dbidentifier)
- {
- super.onListItemClick(list,view,position,dbidentifier);
- try
- {
- // this commented out code below will launch the Contacts application
- // and "view" the contact Intent myIntent = \
- new Intent(android.content.
- // Intent.VIEW_ACTION,new ContentURI("content://contacts/people/"
- // + dbidentifier)); startSubActivity(myIntent,position);
- // let's lookup specifics on this record
- ContentURI theContact = \
- new ContentURI(android.provider.Contacts.ContactMethods.CONTENT_URI.toURI());
- // IMPORTANT
- // in order to use this sample application, you need to have at least
- // one Contact record on your Android emulator\
- // and be sure to have populated the 'Home Address field'
- //
- // this "where clause" is for HOME address and for the person record
- // selected in the GUI (id, dbidentifier)
- Cursor c = managedQuery(theContact,null," type = 1 and person = " +
- dbidentifier,null);
- if (!c.first())
- {
- showAlert("MSCC","No Contact Methods Available!","",true);
- return;
- }
- String address = c.getString(c.getColumnIndex("data"));
- address = address.replace("\n","");
- address = address.replace(",","");
- address = address.replace(" ","+");
- Intent geoIntent = new Intent("android.intent.action.VIEW",
- new ContentURI\
- ("geo:0,0?q=" + address));
- startActivity(geoIntent);
- }
- catch (Exception ee)
- {
- Log.i(tag,ee.getMessage());
- }
- }
示例源代码
|
<ignore_js_op>
![]() |