Android分享文稿 ( by quqi99 )
内容目录
目标 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 。
Android 是 Google 公司于 2007 年 11 月宣布的基于 linux 平台的开源手机操作系统,它包括了操作系统、中间件、用户界面及一些关键应用。
Android 是基于 Java (实际运行在 dalvik 虚拟机上)并运行在 linux 内核上的操作系统。
目前,基于 NDK ,也可以用 C ++、 C 开发 Android 应用 ; 也可以借助一些软件在 Android 平台上跑例如 PHP 之类的脚本程序 ; Android 已经可以安装在上网本上。
启动命令: emulator -debug avd_config -avd avd2.2
开放手机联盟 :
谈到 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
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 ):比如电池电量等。
在 Mac 平台中建立 Android 开发环境,需安装下列软件:
JDK
Android SDK (Dalvik)
Eclipse + Android eclipse plugin (ADT, Andorid Developer Tool)
注意配置JAVA_HOME 环境变量,略。
下载地址: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
Update url: https://dl-ssl.google.com/android/eclipse/
注意,此时一般会报错,这时候,再将 https 换成 http 即可。
图 2-2 安装 ADT (android eclipse plugin)
点击 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 的)
想要快速掌握 Android 开发,需要学习一些什么呢?
类似于 SWT 编程。
LinearLayout: 线性布局,一行(列)只能放一个控件。
RelativeLayout :相对布局。控件的位置都是相对位置。
TableLayout :表单布局。这要和 TableRow 配合使用,很像 HTML 里的 table
TabWidget :切换卡,实现标签的切换功能。
FrameLayout: 里面只能放一个控件,并且不能设计这个控件的位置,控件会放到左上角。
AbsoluteLayout :可以自定义控件的 x,y 的位置。
类似于 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)
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 。
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);
可参见文档《 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” 在模拟器上查看效果
采用 SQLLite 嵌入式数据库,略。
音乐、视频、相机、闹钟
HTTP 通信可采用:
java.net.*
com.android.*
Socket 通信
Webkit 应用
WiFi 、蓝牙
Google Map
src, 源文件
gen/R.java, 是 eclipse 自动生成的,是对资源文件的索引, res 目录发生变化,此处会自动更新
assets, 放置多媒体
res 目录,放资源文件, drawable 子目录放图片资源, layout 子目录放布局文件, values 子目录放置字符串( string.xml )、颜色( colors.xml )、数组( arrays.xml )
AndroidManifest.xml, 应用的配置文件,如应用的名称、 Activity 、 Service 以及 reciever 等
图 新建 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了,待续...