Android分享文稿
Posted onAndroid分享文稿
Android分享文稿
作者:张华 发表于:2011-04-06
内容目录
目标 1
1 掀起你的盖头来--Android是什么 1
1.1 Android模拟器 2
1.2 关于Android的八卦 2
1.3 Android架构 2
1.2 Android优势 5
2 工欲善其事,必先利其器--建立Android开发环境 5
2.1 安装JDK 5
2.2 安装Android SDK及AVD Manager 5
2.3 安装 Android eclipse plugin 5
2.4 配置Virtual devices (Android Emulator) 6
3 千里之行,始于足下--Android知识结构 8
3.1 Android界面开发 8
3.1.1 Layout 8
3.1.2 Wiget 8
3.1.3 一些概念 9
3.1.4 Activity屏幕间的跳转 10
3.1.4 使用Droiddraw开发界面 10
3.2 Android数据存储 10
3.3 Android多媒体开发 10
3.4 Android网络通信 10
3.5 与google相关的特色开发 10
4 大学教育的失败在于理论与实践脱节--Android实践 10
4.1 应用工程组成 10
4.2 两个Activity之间的切换 11
目标
作为一个java 程序员,在阅读了本文之后,剩下的就仅是熟悉android 的API 。
1 掀起你的盖头来 --Android 是什么
Android 是 Google 公司于 2007 年 11 月宣布的基于 linux 平台的开源手机操作系统,它包括了操作系统、中间件、用户界面及一些关键应用。
Android 是基于 Java (实际运行在 dalvik 虚拟机上)并运行在 linux 内核上的操作系统。
目前,基于 NDK ,也可以用 C ++、 C 开发 Android 应用 ; 也可以借助一些软件在 Android 平台上跑例如 PHP 之类的脚本程序 ; Android 已经可以安装在上网本上。
1.1 Android 模拟器
启动命令: emulator -debug avd_config -avd avd2.2
1.2 关于 Android 的八卦
开放手机联盟 :
谈到 Android ,有必要首先了解开放手机联盟( Open Handset Alliance) ,它是 Google 公司于 2007 年 11 月宣布组建的一个全球性联盟组织,这一联盟会支持 Android 操作系统及其应用软件,包括手机制造商、手机芯片厂商、移动运营商,建立了整个移动系统的生态环境。
Android 开发大赛 :
Android 的未来关键取决于手机用户多次多彩的应用程序, Google 公司为了吸引更多的开发者参与到 Android 开发中来,于 2008 年 4 月 17 日举办了奖金为 1000 万美元的 Android 开发大赛,推动了 Android 开发的应用速度。我就是那时开始接触 Android 系统的。
Android Market :
Android Market 被定位为开放的内容分享系统,也就是应用程序超市,任何程序员开发的应用程序都可以放在 Android Market 上,供所有的 Android 手机用户下载体验并赚钱。
Android 开发者社区:
Android 开发者社区是: http://www.android.com , 不过由于伟大的长城防火墙的原因一般访问不了。不过你可以上局域网的社区: http://www.eoeandroid.com
1.3 Android 架构
http://blog.csdn.net/quqi99/archive/2007/12/04/1916553.aspx
图1-1 Android系统结构图
从图 1-1 可以看出 Android 分为 4 层,从高到低分别是应用层、应用框架层、系统运行库层和 Linux 内核层。下面将对这 4 层进行简要的分析和介绍。
1. 应用层
应用是用 java 语言编写的运行在虚拟机上的程序。 Google 同时也内置了一些核心应用,如 E-mail 客户端、 SMS 短消息程序、日历、地图、浏览器等等。
2. 应用框架层
这一层是开发应用程序可以使用的框架,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则。从图 1-1 中可以看出, Android 提供了如下一些组件:
- 丰富而又扩展的视图( View) :可以用来构建应用程序,如文本框( TextBox )等。
- 内容提供器( Content Providers ):它可以让一个应用访问另一个应用的数据,或共享它们自己的数据。
- 资源管理器( Resource Manager ):提供非代码资源的访问,如本地字符串、图形和布局文件( Layout file )。
- 通知管理器( Notification Manager) :应用可以在状态栏中显示自定义的提示信息。
- 活动管理器( Activity Manager) :用来管理应用程序生命周期并提供常用的导航退回功能。
- 窗口管理器( Window Manager ):管理所有的窗口程序。
- 包管理器( Pakage Manager ): 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 元素,在应用程序的布局中使用。
3. 系统运行库( C/C++ 库以及 Android 运行库)层
当使用 Android 应用框架时, Android 系统会通过一些 C/C++ 库来支持我们使用的各个组件。
- Bionic 系统 C 库: C 语言标准库,最底层的库, C 库通过 Linux 系统来调用。
- 多媒体库( Media Framework ):多媒体库,基于 PacketVideo OpenCORE, 该库支持多种常见格式的音频、视频的回放和录制,以及图片,比如 MPEG4 、 MP3 、 AAC 、 AMR 、 JPG 、 PNG 。
- SGL : 2D 图形引擎库
- SSL :位于 TCP/IP 协议与各种应用协议之间,为数据通信提供支持。
- OpenGL ES1.0 : 3D 效果支持
- SQLite :关系型数据库
- Webkit : WEB 浏览器引擎
- FreeType :位图( bitmap )和矢量( vector)
4.Linux 内核层
Android 的核心系统服务基于 Linux2.6 内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。
Android 更多的是需要一些与移动设备相关的驱动程序,主要的驱动如下所示:
- 显示驱动( Display Driver ):基于 Linux 的帧缓冲驱动。
- 键盘驱动( KeyBoard Driver ):作为输入设备的键盘驱动。
- Flash 内存驱动( Flash Memory Driver ):基于 MTD 的 Flash 驱动程序。
- 照相机驱动( Camera Driver ):常用的基于 Linux 的 v412 (Video for Linux) 驱动
- 音频驱动( Audio Driver ):常用的基于 ALSA ( Advanced Linux Sound Architecture) 的高级 Linux 声音体系驱动。
- 蓝牙驱动( Bluetooth Driver ):基于 IEEE 802.15.1 标准的无线传输技术。
- WiFi 驱动:基于 IEEE 802.11 标准的驱动程序。
- Binder IPC 驱动: Android 的一个特殊驱动程序,具有单独的设备节点,提供进程间通信的功能。
- 电源管理( Power Management ):比如电池电量等。
1.2 Android 优势
2 工欲善其事,必先利其器 -- 建立 Android 开发环境
在 Mac 平台中建立 Android 开发环境,需安装下列软件:
- JDK
- Android SDK (Dalvik)
- Eclipse + Android eclipse plugin (ADT, Andorid Developer Tool)
2.1 安装JDK
注意配置JAVA_HOME 环境变量,略。
2.2 安装Android SDK 及AVD Manager
下载地址:http://developer.android.com/sdk/index.html
ANDROID_SDK_HOME=/home/java/android-sdk-mac_86 (由于ADT 有bug 的原因,我们会修改这个环境变量为ANDROID_SDK_HOME=/var/root )
PATH=$ANDROID_SDK_HOME/tools:$PATH
接着运行/home/java/android-sdk-mac_86/tools/android 命令在弹出的如下图的对话框中点击”Install packages” 菜单安装Android SDK 及AVD Manager
图2-1 安装Android SDK
2.3 安装 Android eclipse plugin
Update url: https://dl-ssl.google.com/android/eclipse/
注意,此时一般会报错,这时候,再将 https 换成 http 即可。
图 2-2 安装 ADT (android eclipse plugin)
2.4 配置 Virtual devices (Android Emulator)
点击 eclipse 的 window → Android SDK and AVD Manager 菜单,如下图所示:
在弹出的“ Android SDK and AVD Manager“ 对话框的” Virual devices” 面板点击 New 按钮,在弹出的“ Create new Android Virtual Device(AVD) 对话框架按照下图新建一个模拟器。
图 2-3 新建模拟器 AVD
注意,此时如果在 eclipse 中点” Start“ 按钮启动模拟器的话,会报下列错:
emulator: ERROR: unknown virtual device name: 'Froyo'
emulator: could not find virtual device named 'Froyo'
图2-4 在eclipse 新建的AVD 在eclipse 中start 报的错
注意:上述错误是由 ADT 插件的 BUG 所致,虽然我们前面设置了环境变量 ANDROID_SDK_HOME=/home/java/android-sdk-mac_86 , 但是 ADT 仍然傻乎乎地将 AVD 建在了 /var/root 目录下,所以在 eclipse 中启动 AVD 时会报上述错误 。
目前,只能通过下列方法曲线救国(我没有想出更好的解决办法)
1 )重设环境变量 ANDROID_SDK_HOME=/var/root
2 )在eclipse 中新建模拟器(因为要用eclipse 来debug 程序,所以因为路径的bug 我们最好不要在命令行中新建模拟器,而改在eclipse 中新建模拟器)
3 )在命令行中启动模拟器(emulator -debug avd_config -avd avd2.2 , 因为路径的bug 问题不要在eclipse 中启动模拟器)
4 )剩下的调试和普通的eclipse 调试是一模一样的。
另外,注意:模拟器经常会出现error:device offline 的错误,这时候需要重启模拟器。
下面我们列举一些常用的模拟器操作的命令:
- 列出模拟器类型:android list targets
- 创建模拟器:android create avd –target 2 –name avd2.2
- 列出自己创建的模拟器:android list avd
- 切换模拟器样式:在创建命令后面加上”--skin QVGA” 即可。
- 删除模拟器:android delete avd -name avd2.2
- 安装avk 文件:adb install /tmp/myApp.apk
- 缷载模拟器中的apk 文件,依次输入命令:adb shell, cd data, cd app, ls ,然后再用普通的linux 命令删除即可(注意:android 的底层是基于linux 内核的,文件系统是用linux 的)
3 千里之行,始于足下 --Android 知识结构
想要快速掌握 Android 开发,需要学习一些什么呢?
3.1 Android 界面开发
3.1.1 Layout
类似于 SWT 编程。
- LinearLayout: 线性布局,一行(列)只能放一个控件。
- RelativeLayout :相对布局。控件的位置都是相对位置。
- TableLayout :表单布局。这要和 TableRow 配合使用,很像 HTML 里的 table
- TabWidget :切换卡,实现标签的切换功能。
- FrameLayout: 里面只能放一个控件,并且不能设计这个控件的位置,控件会放到左上角。
- AbsoluteLayout :可以自定义控件的 x,y 的位置。
3.1.2 Wiget
类似于 SWT 编程,常用控件如下:
- 文本框( TextView)
- 列表( ListView)
- 提示( Toast)
- 编辑框( EditText)
- 单项选择( RadioGroup, RadioButton)
- 多项选择( CheckBox)
- 下拉表列( Spinner)
- 自动提示( AutoComplete-TextView)
- 日期与时间( DatePicker, TimePicker)
- 按钮( Button)
- 菜单( Menu)
- 对话框( Dialog)
- 图片视图( ImageView)
- 带图标的按钮( ImageButton)
- 拖动效果( Gallery)
- 切换图片( ImageSwitcher)
- 网格视图( GridView)
- 卷轴视图( ScrollView)
- 进度条( ProgressBar)
- 拖动条( SeekBar)
- 状态栏提示( Notification, NotificationManager)
- 对话框中的进度条( ProgressDialog)
3.1.3 一些概念
Android 应用程序由 4 个模块组成: Activity, Intent, Content Provider, Service.
- Activity ,你可以把它看作 JSP ,代表用户所能看到的活动(也就是屏幕啦),但是比 JSP 可能还多些带动作的东西,如监听系统事件(按键事件,触摸屏事件),也用户显示指定的 View, 启动其他的 Activity 等。
- Intent, Intent 用户 Activity 与 Activity 之间的切换,它包括两个重要的部分:动作和动作对应的数据。典型的动作类型有 MAIN,VIEW,PICK,EDIT 等,而动作对应的数据则以 URI 的形式表示。你可以把它看成是 JSP 页面之间的一次跳转或重定向。如要查看某人的联系方式,需要创建一个动作类型为 VIEW 的 Intent ,以及一个表示这个人的 URI 。有三种类型的 Intent:
1) 通过 Intent 切换屏幕,可以带数据
2 )通过 Intent 来启动一个 Service
3 )通过 Intent 来广播一个事件
- Intent filter, 如果说 Intent 是一个有效请求,一个 Intent Filter 则用于描述一个 Activity( 或者 Intent Receiver )能够操作哪些 Intent 。例如,一个 Activity 要显示一个人的联系方式时,需要声明一个 Intent Filter ,这个 Intent Filter 要知道怎么去处理 VIEW 动作和表示一个人的 URI ,它一般在 AndroidManifest.xml 中定义。
- Broadcast intent Receiver 介绍,可以使用 BroadcaseReceiver 来让应用对一个外部的事件做出响应, BroadcaseReceiver 不能生成 UI 对用户是透明的。既可在 AndroidManifest.xml 中定义,也可使用 Content.registerReceiver() 进行注册。各种应用还可以通过使用 Content.sendBroadcast() 将它们自己的 intent broadcasts 广播给其它应用程序。
- Content Provider, 用于提供内容,如访问数据库。 值得一提的是,在 Android 当数据是应用私有的,而 Content Provider 就是来解决两个应用之间交换数据滴。一个 Content Provider 类实现了一组标准的方法接口(如 query, insert, update, delete) ,从而将自己的数据暴露出去。
- Service ,是一个生命周期长且没有用户界面的程序。通过 startService(Intent intent) 可以启动一个 Service ,通过 Context.bindService() 可以绑定一个 Service 。
3.1.4 Activity 屏幕间的跳转
Android 程序无外乎就是一个个屏幕的切换,通过解析各种 Intent ,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时, Activity 将会调用 startActivity(Intent myIntent) 方法。然后,系统会在所有已安装的应用程度中定义的 IntentFilter 查找 ,找到最匹配 myIntent 的 Intent 对应的 Activity 。新的 Activity 接收到 myIntent 的通知后,开始运行。
这里假设有两个 Activity ,一个是 A, 一个是 B, 从屏幕跳到屏幕 B ,代码如下所示:
Intent intent = new Intent(A.this, B.class);
startActivity(intent);
3.1.4 使用 Droiddraw 开发界面
可参见文档《 droiddraw + android + vi 可视化设计器》
安装步骤如下:
1 )启动模拟器
android list avd
emulator -debug avd-config -avd avd2.2
2 )下载 AnDroidDraw.apk 并安装它, adb install /tmp/AnDroidDraw.apk
3 )安装端口转发规则: adb forward tcp:6100 tcp:7100
4 )可点击 Generate 生成 XML 布局代码,也可点击“ Project—send GUI to device” 在模拟器上查看效果
3.2 Android 数据存储
采用 SQLLite 嵌入式数据库,略。
3.3 Android 多媒体开发
音乐、视频、相机、闹钟
3.4 Android 网络通信
HTTP 通信可采用:
- java.net./*
- com.android./*
Socket 通信
Webkit 应用
WiFi 、蓝牙
3.5 与 google 相关的特色开发
Google Map
4 大学教育的失败在于理论与实践脱节 --Android 实践
4.1 应用工程组成
![]()
- src, 源文件
- gen/R.java, 是 eclipse 自动生成的,是对资源文件的索引, res 目录发生变化,此处会自动更新
- assets, 放置多媒体
- res 目录,放资源文件, drawable 子目录放图片资源, layout 子目录放布局文件, values 子目录放置字符串( string.xml )、颜色( colors.xml )、数组( arrays.xml )
- AndroidManifest.xml, 应用的配置文件,如应用的名称、 Activity 、 Service 以及 reciever 等
4.2 两个 Activity 之间的切换
图 新建 Andorid 工程
如上图所示,新建一个名为 AndroidTest 的 android project (注意:上述没给图的步骤直接按默认的下一步就行了)。
代码如下:
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:id = "@+id/text"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "@string/hello"
/>
< Button android:layout_height = "wrap_content" android:layout_width = "wrap_content" android:id = "@+id/button" android:text = "Button" ></ Button >
</ LinearLayout >
Androidmanifest.xml 文件要添加:
< activity android:name = ".Activity1" ></ activity >
< activity android:name = ".Activity2" ></ activity >
package com.quqi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
///
/ *@author huazhang
/ *@date 20110316
/*/
public class AndroidTest extends Activity
{
/// Called when the activity is first created. /*/
@Override
public void onCreate(Bundle savedInstanceState)
{
super .onCreate(savedInstanceState);
setContentView(R.layout. main );
TextView text = (TextView) findViewById(R.id. text );
text.setText( "here is main activity" );
Button button = (Button) findViewById(R.id. button );
button.setText( "next" );
OnClickListener listener = new OnClickListener() {
public void onClick(View v)
{
Intent intent2 = new Intent(AndroidTest. this , Activity2. class );
intent2.putExtra( "data" , "zhanghua" );
startActivity(intent2);
}
};
button.setOnClickListener(listener);
}
}
package com.quqi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
///
/* @author huazhang
/* @date 20110316
/*/
public class Activity2 extends Activity
{
/// Called when the activity is first created. /*/
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String date = "";
Bundle extras = getIntent().getExtras();
if (extras != null)
{
date = extras.getString("data");
}
TextView text = (TextView) findViewById(R.id.text);
text.setText("here is activity2, " + date);
Button button = (Button) findViewById(R.id.button);
button.setText("return");
OnClickListener listener = new OnClickListener() {
public void onClick(View v)
{
Intent intent1 = new Intent(Activity2.this, AndroidTest.class);
startActivity(intent1);
}
};
button.setOnClickListener(listener);
}
}
再剩下的事情就应该只是熟悉API了,待续...