Transcript p [点这里下载]
Google Android
移动应用开发
宁夏大学新华学院
2012.3
Google Android
3、第一个 Android 应用程序
on android
Android 模拟器
Android Emulator
可模拟电话本、通话等功能
内置的浏览器和 Google Maps 都可以联网
可以使用键盘输入(不包括小键盘)
可使用模拟器按键、键盘输入
可以使用鼠标单击、拖动屏幕进行操作
Android 模拟器
Android 模拟器和真机的不同之处
不支持呼叫和接听实际来电,但可以通过控制台模拟电话呼入和
呼出
不支持USB连接
不支持相机、视频捕捉
不支持音频输入,但支持输出
不支持扩展耳机
不能确定连接状态
不能确定电池电量水平和交流充电状态
不能确定 SD 卡的插入/弹出
不支持蓝牙
模拟器在上产生的 .tmp 文件需要手工清理
Android 虚拟机 Dalvik
Dalvik 和标准 Java 虚拟机(JVM)首要差别
Dalvik 基于寄存器,相对于基于数据栈的 JVM,能
够更快的编译较大的应用程序
Dalvik 和 JVM 运行环境的区别
Dalvik 经过优化,允许在有限的内存中同时运行多
个虚拟机的实例
每一个 Dalvik 应用作为一个独立的 Linux 进程
执行,可防止在虚拟机崩溃的时候所有应用都被关闭
Dalvik 提供一个拥有较少限制许可证的平台
Android 中重要的包
Android.app :提供高层的程序模型、提供基本的运行环境
Android.content :包含各种的对设备上的数据进行访问和发布的类
Android.database :通过内容提供者浏览和操作数据库
Android.graphics :底层的图形库,可以将它们直接绘制到屏幕上.
Android.location :定位和相关服务的类
Android.media :提供一些类管理多种音频、视频的媒体接口
Android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口
Android.os :提供了系统服务、消息传输、IPC 机制
Android.opengl :提供 OpenGL 的工具
Android.provider :提供类访问 Android 的内容提供者
Android.telephony :提供与拨打电话相关的 API 交互
Android.view :提供基础的用户界面接口框架
Android.util :涉及工具性的方法,例如时间日期的操作
Android.webkit :默认浏览器操作接口
Android.widget :各 UI 元素(多数可见)在应用程序屏幕中使用
Android 的文件格式
java 文件:应用程序源代码
android 本身相当一部分都是用 Java 编写而成
android 的应用程序使用 Java 来开发
class 文件:Java 编译后的目标代码
Google 使用 Dalvik 来运行应用程序
Android 的 class 文件是编译过程中的中间目标
文件,需要链接成 dex 文件才能在 Dalvik 上运
行
dex 文件:Android 平台上的可执行文件
Dalvik 虚拟机执行的是 dex 格式字节码,
并非 Java 字节码
在编译 Java 代码之后,通过 Android 提
供的 Dx 工具可以将 Java 字节码转换成
dex 字节码
Dalvik 针对手机应用、嵌入式 CPU 做过优
化,可以同时运行多个 VM 实例而不占用过
多系统资源
apk 文件:Android 上的安装文件
apk 是 Android 安装包的扩展名,安装包
内包含了与该 Android 应用程序相关的所
有文件
Android 将 AndroidManifest.xml 文件、
应用程序代码(.dex文件)、资源文件和其
他文件打成一个压缩包,即 .apk
apk 文件的本质是一个压缩包,一个工程只
能打进一个 .apk 文件
Android 应用
Activity:活动
Android 应用程序中最基本的组件,应用程序中
一个Activity 通常就是一个单独的屏幕
每一个活动都被实现为一个独立的类,并且从活
动基类中继承而来,活动类将会显示由视图控件
组成的用户接口,并对事件做出响应
大多数的应用是由多个屏幕显示组成
Google Android
示例:Hello world!
on android
HelloWorld
Eclipse 下自动生成
new android project → HelloWorld
HelloWorld.java
Java 程序
package test.helloworld;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
返回
R.java
Java 程序
/* AUTO-GENERATED FILE.
DO NOT MODIFY. */
package test.helloworld;
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;
}
}
返回
main.xml
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>
Resources
返回
strings.xml
xml 文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, everyone!</string>
<string name="app_name">HelloWorld</string>
</resources>
显示内容:
Hello World, everyone!
AndroidManifest.xml
xml 文件
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android=“http://schemas.android.com/apk/res/android”
package="test.helloworld“
android:versionCode="1"android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=
".HelloWorld“ 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>
返回
RUN
RUN
模拟器运行
显示内容:
Hello World, everyone!
命令行方式
首先启动模拟器
emulator -avd SDK_2.1_Update1_API_7
然后连接模拟器:
telnet localhost 5554
接下来,就可以拨打电话:
gsm call 10086
或者是发送短信:
sms send 10086 messageform10086
另:adb kill-server:关掉现有 adb Server
adb devices:显示运行中的设备
屏幕分辨率
入门级的:
主流的:
主流的:
moto特有的:
魅族 M9:
三星 Galaxy
QVGA(320x240)
HVGA(480x320)
WVGA800(800x480)
WVGA854(854x480)
960x640
Tab P1000:1024x600(7 寸屏)
基准分辨率: VGA(640x480)
HVGA-L 或是 -P:横屏、竖屏
模拟器的默认分辨率依 SDK 版本而不同
Android project 的目录结构
项目 HelloWorl :
文件夹 src
文件夹 gen
文件夹 Android 2.1-update1
文件夹 assets
文件夹 res
AndroidManifest.xml
default.properties
proguard.cfg
Android project:src
该文件夹是存放项目的源代码。新建项目时,系统生成了一
个 HelloWorld.java 文件,它导入了两个类
android.app.Activity 和 android.os.Bundle,
HelloWorld 类继承自 Activity 且重写了 onCreate
方法。
@Override:在方法前面加上 @Override 系统可以帮助
检查方法的正确性。
例如,public void onCreate(……){……} 这种写法是正确的,
如果写成 public void oncreate(……){……} 这样编译器会
报错——The method oncreate(Bundle) of type
HelloWorld must override or implement a
supertype method,以确保你正确重写 onCreate 方法。
如果不加 @Override,则编译器会认为是新定义了一个方法
oncreate,检测不出书写错误。
android.app.Activity 类:因为几乎所有的
Activity 都是与用户交互的,所以该类关注创建窗口,
可以用方法 setContentView(View) 将自定义的 UI
放到 Activity 里面。
有两个方法是几乎所有的 Activity 子类都实现的:
onCreate(Bundle):初始化 Activity,用布局资
源(layout resource)调用 setContentView(int)
方法定义 UI(main.xml)。
onPause():处理当离开该 Activity 时要做的事情,
用户做的所有改变应该在这里提交(通常
ContentProvider 保存数据)。
android.os.Bundle 类:从字符串值映射各种可打包
(Bundle:捆绑)的(Parcelable)类型
例如该类提供了公有方法:public boolean
containKey (String key),如果给定的 key 包含在
Bundle 的映射中返回 true,否则返回 false。
Android project:gen
该文件夹下面有一个项目创建时自动生成并实时更新的
R.java 文件,这个文件是只读的,不允许修改。
R.java 文件中定义了一个类 R,类中包含很多静态类,
且静态类的名字都与 res 中的一个名字对应,即 R 类定
义了 res 目录下所有资源的索引。
通过 R.java 程序可以很快地查找到需要的资源,另外通
过检查 R.java 列表,编译器不会将没有被使用到的资源
编译进应用程序包中,以减少手机中的空间占用。
R:资源索引类
Android project:Android 2.1-update1
该文件夹下包含 Java 归档文件 android.jar,包含了
构建项目所需的所有的 Android SDK 库和 APIs。
通过 android.jar 将应用程序绑定到 Android SDK
和 Android Emulator,这使得项目可以使用所有
Android 的库和包,并且可以在适当的环境中调试。
例如 HelloWorld.java 通过下面两行代码从
android.jar 导入了两个包:
import android.app.Activity;
import android.os.Bundle;
Android project:res
资源目录,包含项目中的资源文件并将其编译进程序包中。
向此目录添加资源时,会被 R.java 自动索引。
res 中默认有三个子目录:drawabel、layout、
values
drawabel:包含应用程序可以用的图标、图像文件
(*.png、*.jpg)
layout:界面布局文件(main.xml)等
values:项目中所需要显示的各种文字。可以存放多
个*.xml文件,还可以存放不同类型的数据,如
arrays.xml、colors.xml、dimens.xml、
styles.xml
Android project:assets
该文件夹包含项目所需要使用到的诸如 mp3、视频
文件,存放的也是资源文件。
与 res 文件夹存放的资源不同的是,assets 内
的资源文件不会被 R 类索引,不能使用 R 的成员
引用方式进行访问。
Android project:AndroidManifest.xml
项目的总配置文件,存储整个项目的配置数据,记
录了应用程序中所使用的各种组件,列出了应用程
序所提供的功能,指出了应用程序使用到的服务
(如电话、互联网、短信、GPS 等)
应用程序添加新的 Activity 时,也需在此注册
后才能调用
AndroidManifest.xml 包含如下设置:
application、permissions、
Activities、Intent filters 等
Android project:default.properties
由 Android Tools 自动生成,不允许修改
文件中记录了项目中所需要的环境信息,比如
Android API 的最低兼容版本等
项目 HelloWorld 的 default.properties
文件代码如下所示:
# Project target.
target=android-7
Android project:proguard.cfg
proguard 是 Java 类文件的压缩、优化、混淆
器,用于删除没有用的类、字段、方法与属性,以
使字节码达到最大程度地优化
作为配置文件,proguard.cfg 是 \androidsdk-windows\tools\lib\ 目录下的同名文件
的副本
proguard.cfg 是在Android SDK 升级到 2.3
版后才出现的,同样不需要手工修改
thanks