【网学网提醒】:网学会员为您提供Android学习笔记(2)参考,解决您在Android学习笔记(2)学习中工作中的难题,参考学习。
Android的应用
程序框架
责任编辑:责任编辑:徐威特作者:IT168hanchao3cIT1682009-04-02来源:IT168网站
Tag:文本Tag:Android【IT168技术文档】以HelloActivity程序为例,简单介绍Android应用程序的框架。希望读者可以根据HelloActivity,自己写出一个Andorid的应用
程序。
HelloActivity工程的源代码在Android目录的development/samples/HelloActivity/中,代码的结构如下所示:development/samples/HelloActivity/|--Android.mk|--AndroidManifest.xml|--res|||||--src`--com`--example`--android`--helloactivity`--HelloActivity.java其中tests是一个独立的项目,可以暂时不考虑。其他部分看作一个Android的一应用
程序的工程。这个工程主要的组成部分如下所示:|--layout|`--hello_activity.xml`--strings.xml`--values
Android.mk
是整个工程的“Makefile”,其内容如下所示:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=samples#Onlycompilesourcejavafilesinthisapk.LOCAL_SRC_FILES:=$(callall-java-files-under,src)LOCAL_PACKAGE_NAME:=HelloActivityLOCAL_SDK_VERSION:=currentinclude$(BUILD_PACKAGE)#Usethefollowingincludetomakeourtestapk.include$(callall-makefiles-under,$(LOCAL_PATH))
其中LOCAL_PACKAGE_NAME表示了这个包的名字。这个文件是最终生成的包(*.apk)的名称,注意,包的名称和应用
程序目录的名称无关,而与这里的HelloActivity的名称有关。
AndroidManifest.xml
工程的描述文件
在工程描述文件中,package的名称需要和JAVA文件中包的名称相同,activity的名称必须和JAVA文件中JAVA类的名称相同,JAVA文件的文件名也必须和其中类的名称相同。而那个android:label的名字既是应用程序在菜单中的名字,也是应用程序启动后的标题。
HelloActivity.java
这是JAVA类文件,这个文件的路径表示在Andorid的JAVA包的结构中的位置,这个包的使用方式为com.example.android.helloactivity。packagecom.example.android.helloactivity;importandroid.app.Activity;importandroid.os.Bundle;publicclassHelloActivityextendsActivity{publicHelloActivity(){}@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.hello_activity);}}
AndroidManifest.xml和*.JAVA的名称需要匹配(这里的HelloActivity.java和HelloActivity),否则是找不到JAVA
类的。程序编译完成后,将生成apk包,将其放置在system/app中即可。除了使用界面启动之外,还可以在QEMU仿真器的启动界面中,使用如下的方式启动:amstart-ncom.example.android.helloactivity/com.example.android.helloactivity.HelloActivity事实上,启动的方法和工程描述文件中包的名称和类的名称有关。
几个注意点:
1、应用程序文件夹的名称并无实际的影响2、Android.mk的LOCAL_PACKAGE_NAME,决定APK包的名称;3、AndroidManifest.xml中需要包含包的名称和activity类的名称,并需要和JAVA文件中对应;4、AndroidManifest.xml中applicationandroid:label的名称既是应用程序在界面中的名称,也是启动后的标题
Android中各种JAVA包的功能描述
责任编辑:责任编辑:徐威特作者:IT168hanchao3cIT1682009-05-29
Tag:文本Tag:Android【IT168技术文档】在Android的应用程序开发中,通常使用的是JAVA语言,除了需要熟悉JAVA语言的基础知识之外,还需要了解Android提供的扩展的JAVA功能。在一般的JAVA应用中,如果需用引用基础类库,通常需要使用如下的方式:importjavax.swing.*;以上代码表示了引用JAVA的GUI组件Swing,javax.swing即JAVA中的一个包。android提供一些扩展的JAVA类库,类库分为若干个包,每个包中包含若干个类。例如:在Android中计算器是一个相对简单的程序,其入口程序文件为Calculator.java,该文件包含了以下内容:packagecom.android.calculator2;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;importandroid.util.Config;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.Window;importandroid.view.View;
importandroid.widget.Button;importandroid.widget.ListView;importandroid.content.res.Configuration;在Android中,各种包写成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应用开发入门五问
责任编辑:责任编辑:覃里作者:51CTO.COM51CTO.COM2009-07-29
Tag:文本Tag:移动开发技术】【IT168技术】1.Android是什么?Android是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和T-Mobile在内的30多家技术和无线应用的领军企业组成。Android作为谷歌企业战略的重要组成部分,将进一步推进"随时随地为每个人提供信息"这一企业目标的实现。2.Android用什么语言开发的?Android的SDK(softwaredevelopmentkit)是Java的,将来可能有其他语言版本。SDK下载地址:code.google/android/download.html3.Android模拟器是用什么开发的?Android的核心是Java虚拟机,为了高效,目前来看,google是不会支持其它语言的开发的。不过,android的模拟器是用qeum开发的,它的镜像文件分成4部分放在tools目录下,如果我们将qeum修改一下,说不定能玩一下它的linux系统。4.怎么进行Android开发?
Android支持在模拟器上运行和调试应用软件,有兴趣的朋友可以下载他的SDK(softwaredevelopmentkit)来了解android的界面;然后应该学习android的基本框架和应用程序的构成;最后就可以试着在sdk的APIDemo的基础上开发自己的application了。希望刚刚了解软件开发的朋友不要着急,一步一个脚印,一定会茁壮成长,开发优秀的application的。5.有哪些好的网络资源可供Android学习者用的呢?首先,最好的最基本的学习资料无疑是SDK的文档了,也就是这个地方(code.google/intl/zh-CN/android/documentation.html)的介绍,它循序渐进的介绍了Android的各个方面。其次,大家可能有对android文档不太理解的地方,或者自己的想法等等,完全可以通过下面的groups进行咨询和交流:◆AndroidBeginnergroups.google/group/android-beginners?lnk=◆DevelopperGroupsgroups.google/group/android-developers◆AndroidInternalsgroups.google/group/android-internals?lnk=◆AndroidPortinggroups.google/group/android-porting?lnk=
Android核心模块及相关技术
责任编辑:责任编辑:徐威特作者:IT168hanchao3cIT1682009-04-02来源:IT168网站
Tag:文本Tag:Android【IT168技术文档】Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(
Application)。根据Android的软件框图,其软件层次结构自下而上分为以下几个层次:第一、操作系统层(OS)第一、操作系统层(OS)第二、各种库(Libraries)和运行环境(RunTime)第二、各种库(Libraries)和Android运行环境(RunTime)(Libraries)第三、应用程序框架(Application第三、应用程序框架(ApplicationFramework)第四、用程序(Application)第四、应用程序(Application)以下分别介绍Andoid各个层次的软件的重点及其相关技术:操作系统层(OS)●操作系统层(OS)Android使用Linux2.6作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。主要的驱动如下所示:显示驱动(DisplayDriver):基于Linux的帧缓冲(FrameBuffer)驱动键盘驱动(KeyBoardDriver):作为输入设备的键盘驱动Flash内存驱动(FlashMemoryDriver):基于MTD的Flash驱动程序照相机驱动(CameraDriver):
常用基于Linux的v4l2(VideoforLinux)驱动。音频驱动(AudioDriver):常用基于ALSA(AdvancedLinuxSoundArchitecture,高级Linux声音体系)驱动蓝牙驱动(BluetoothDriver):基于IEEE802.15.1标准的无线传输技术WiFi驱动(CameraDriver):基于IEEE802.11标准的驱动程序BinderIPC驱动:Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能PowerManagement(能源管理)各种库(Libraries)(Libraries)和运行环境(RunTime)●各种库(Libraries)和Android运行环境(RunTime)本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android运行环境。本层的内容大多是使用C++实现的。在其中,各种库包括:C库:C语言的标准库,这也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。多媒体框架(MediaFrameword):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共分为两大部分,一个部分是音频、视频的回放(PlayBack),另一部分是则是音视频的纪录(Recorder)。SGL:2D图像引擎。SSL:即SecureSocketLayer位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。OpenGLES1.0:本部分提供了对3D的支持。界面管理工具(SurfaceManagement):本部分提供了对管理显示子系统等功能。SQLite:一个通用的嵌入式数据库WebKit:网络浏览器的核心FreeType:位图和矢量字体的功能。Android的各种库一般是以系统中间件的形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切
相关。Android运行环境主要指的虚拟机技术——Dalvik。Dalvik虚拟机和一般JAVA虚拟机(JavaVM)不同,它执行的不是JAVA标准的字节码(bytecode)而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于JavaVM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。应用程序框架(Applic(Application●应用程序框架(ApplicationFramework)Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以JAVA构建的,因此本
层次提供的首先包含了UI程序中所需要的各种控件:例如:Views(视图组件)包括lists(列表),grids(栅格),textboxes(文本框),buttons(按钮)等。甚至一个嵌入式的Web浏览器。一个Andoid的应用程序可以利用应用程序框架中的以下几个部分:Activity(活动)BroadcastIntentReceiver(广播意图接收者)Service(服务)ContentProvider(内容提供者)应用程序(Application)●应用程序(Application)Android的应用程序主要是用户界面(UserInterface)方面的,通常以JAVA程序编写,其中还可以包含各种资源文件(放置在res目录中)JAVA程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home),联系人(Contact),电话(Phone),浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。
Android开发环境搭建
责任编辑:责任编辑:柳达作者:AndroidinAndroidin【内容导航】2009-03-21
????
第1页:下载SDK第2页:系统和软件需求第3页:安装SDK第4页:安装Eclipse插件(ADT)展开全部
Tag:文本Tag:AndroidGoogle开源开发工具移动开发平台本页内容介绍如何安装AndroidSDK以及如何设置你的开发环境。如果你还没有下载SDK,你可以点下面的连接进行下载,然后阅读后续文档学习如何安装,配置,并使用该SDK来创建Android应用程序。下载SDK升级?如果你已经用更早的版本开发过程,可以跳过本页,并阅读升级SDK文档.
系统和软件需求系统和软件需求软件
用Androidsdk的代码和工具开发Android应用程序,你需要适合的开发电脑以及开发环境,如下描述:
所需操作系统:所需操作系统:操作系统
WindowsXP或VistaMacOSX10.4.8或更高版本(仅支持x86)Linux(LinuxUbuntuDapperDrake版本已测试)
所需开发环境:所需开发环境:
1.EclipseIDE2.Eclipse3.3
(Europa),3.4(Ganymede)3.EclipseJDT插件(大多数的EclipseIDE包包含)4.WST(可选,但Android编辑器的功能需要,它被包含在mostEclipseIDEpackages中)5.JDK5或JDK6(只有JRE是不够的)6.AndroidDevelopmentTools插件(可选)7.不兼容GNUJava编译器(gcj)
其他开发环境或IDE
1.JDK5或JDK6(仅有JRE不够)2.ApacheAnt1.6.5或更高版本(Linux和Mac环境下),1.7或更高版本(Windows环境下)3.不兼容GNUJava编译器(gcj)注:如果你的电脑上已经安装了jdk,请确定它是上面所列的版本号。另外需要注意有些linux版本可能包含有jdk1.4或者java的gnu编译器,Adroid开发是不支持在这两种版本下载完SDK后,把.zip文件解压到你电脑上合适位置.默认情况下,SDK文件被解压到android_sdk_文件夹.这个文件夹包含tools/,samples/等.请注意系统里SDK解压后的文件夹的名字和位置—当你安装Android插件和使用SDK工具时,你将需要引用这个文件夹。你可以添加SDKtools的文件夹路径到你的环境变量中.如上所述,tools/文件夹位于SDK文件夹中。环境下,修改~/.bash_profile或者~/.bashrc文件.找到环境变量设置的地方,Linux环境下加入tools/的绝对路径。如果找不到该设置,你需要新添加一行:exportPATH=${PATH}:/tools环境下,在你的home文件夹里面查找.bash_profile,然后和linux一样处理。如Mac环境下果之前没有.bash_profile文件,你可以创建一个新的。环境下,Windows环境下右击我的电脑,并选择属性.在标签页高级,点击环境变量,当对话框出现,在系统变量栏目里双击路径(Path).并添加tools/文件夹的完整路径.添加tools到你的环境变量里,这样你可以运行AndroidDebugBridge(adb)和其他tools下命令,而不需要输入完整路径名。需要说明的是,如果你升级你的SDK,需要将你的相应环境变量更新到新的位置。如果你要使用EclipseIDE作为开发Android应用的环境,你可以安装支持Android工程和工具的通用插件AndroidDevelopmentTools(ADT).ADT插件包含强大的扩张,使得创建,运行和调试Android更快速,更简单。如果你不使用EclipseIDE,就不必下载和安装ADT插件下载和安装ADT插件,请按照你们各自Eclipse版本步骤安装:
Eclipse3.3(Europa)
1.开始Eclipse,然后选择Help>SoftwareUpdates>FindandInstall....2.对话框出现后,选择Searchfornewfeaturestoinstall点击Next.3.点击NewRemoteSite.4.在对话框中,输入远程站点的名字(如AndroidPlugin),输入站点如下:https://dl-ssl.google/android/eclipse/点击OK.5.你可以看到新的站点添加到搜索列表中(并检查),点击Finish.6.在下面的搜索结果对话框,选择复选框Andr
oidPlugin>DeveloperTools.它将会检查特性:"AndroidDeveloperTools",和"AndroidEditors".Android编辑器的特性是可选的,但我们推荐安装它,如果你选择安装,需要前面提到的WST插件。点击Next.7.阅读许可协议,然后选择接受许可协议,点击Next.8.点击Finish.9.ADT插件没有签名,你可以点击“InstallAll”来安装所有东西。10.重启Eclipse.
Eclipse3.4(Ganymede)
1.启动Eclipse,选择Help>SoftwareUpdates....2.在出现的对话框里,点击标签页AvailableSoftware.3.点击AddSite...4.输入下面的地址:https://dl-ssl.google/android/eclipse/点击OK.5.返回可用软件的视图,你会看到这个插件.选择下一步到DeveloperTools并点击Install...6.在接下来的安装窗口,选中"AndroidDeveloperTools"和"AndroidEditors"。Android编辑器特性是可选的,但是我们推荐安装它,如果你选择安装,需要前面提到的WST插件。点击Finish.7.重启Eclipse。重启之后,updateyourEclipsepreferences指向SDK文件夹:选择Window>Preferences...来打开属性面板。(MacOSX:Eclipse>Preferences)从左边面板选择Android。在主界面上定位SDK点击Browse...然后定位SDK文件夹。点击Apply,然后点击OK。
ADT安装疑难解答
I你如果按照以上步骤下载ADT插件有疑问,这里是一些建议:
在第四步,尝试改变远程更新地址URL为http,而非https.如果你在防火墙保护下(企业防火墙)请确定你的Eclipse的代理设置合适。Eclipse在3.3/3.4,你可以从主Eclipse菜单中配置:Window(在Mac,Eclipse)>Preferences>General>NetworkConnections如果无法安装下载的ADT插件到Eclipse,按照如下的步骤来从你的电脑下载和安装插件:下载ADT压缩文件(不解压).按照默认安装的第一部和第二步(如上).在Eclipse3.3,点击NewArchiveSite....InEclipse3.4,clickAddSite...,然后点击Archive...浏览和选择已经下载的压缩文件。从第五步开始完成上面剩下的流程。更新你的插件,你必须按照这些步骤代替默认的更行说明。在某些情况下,你机器上的SDK可能和ADT插件是兼容的,你可以用以下步骤从Eclipse里更新ADT插件。
Eclipse3.3(Europa)
1.选择Help>SoftwareUpdates>FindandInstall....2.选择Searchforupdatesofthecurrentlyinstalledfeatures并点击Finish.3.如果ADT可以更新,选择并安装更新。或:1.选择Help>SoftwareUpdates>ManageConfiguration.2.展开导航树并选择AndroidDevelopmentTools3.AvailableTasks下选择ScanforUpdates。
Eclipse3.4(Ganymede)
1.选择Help>SoftwareUpdates...2.选择标签页InstalledSoftware。3.点击Update...4.如果ADT允许更新,选择它并点击Finish.
UbuntuLinux注意事项
如果你需要帮助安装
和配置java在你的ubuntu机器上,下面资源可能对你有帮助:https://help.ubuntu/community/Javahttps://help.ubuntu/community/JavaInstallation这里有java和Eclipsed的安装步骤,先安装AndroidSDK和ADT插件.如果你你开发机上使用64位版本,你需要用apt-get安装ia32-libs包
apt-getinstallia32-libs
下一步,安装Java:
apt-getinstallsun-java6-bin
Ubuntu包管理器现在没有提供Eclipse3.3版本下载,因此我们推荐你从eclipse.org(eclipse.org/downloads/)下载。建议使用Java或RCP版本的Eclipse.按照前面部分的提供步骤来安装SDK和ADT插件.
其他版本Linux注意事项
如果你在安装Eclipse的ADT插件遇到这个错误:
Anerroroccurredduringprovisioning.Cannotconnecttokeystore.JKS
你的开发环境缺少适合的虚拟机,安装SunJava6可以解决这个问题,然后你再重新安装ADT插件。如果JDK已经安装到你的开发电脑上,请确定其版本在这页的顶部列表中已经列出,有些Linux包含jdk1.4或者java的gnu编译器,以上二者Android不支持。
在Android中创建和使用数据库
责任编辑:责任编辑:晓熊作者:IT168开心果译IT168【内容导航】2009-03-05
???
第1页:SQLite数据库第2页:使用数据库第3页:检索单个标题
Tag:文本Tag:Android数据库技术文档】【IT168技术文档】每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如MozillaFireFox就是使用SQLite来存储配置数据的,iPhone也是使用SQLite来存储数据的。在Android中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data//databases文件夹中,在这篇文章中,你将会学习到如何在Android中创建和使用数据库。SQLite数据库使用Eclipse创建一个Android项目,取名为Database,如图1所示:
图1数据库-使用Eclipse创建你的Android新项目
创建DBAdapter辅助类操作数据库的最佳实践是创建一个辅助类,由它封装所有对数据库的复杂访问,对于调用代码而言它是透明的,因此我创建了一个DBAdapter的辅助类,由它创建、打开、关闭和使用SQLite数据库。首先,在src/文件夹(在这个例子中是src/net.learn2develop.Database)下
添加一个DBAdapter.java文件。在DBAdapter.java文件中,导入所有你要使用到的命名空间:packagenet.learn2develop.Databases;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;
publicclassDBAdapter{}接下来创建一个数据库,取名为bookstitles,字段如图2所示。图2数据库字段
在DBAdapter.java文件中,定义清单1中的常量。清单1定义DBAdapter.java文件中的常量packagenet.learn2develop.Database;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;publicclassDBAdapter{publicstaticfinalStringKEY_ROWID="_id";publicstaticfinalStringKEY_ISBN="isbn";publicstaticfinalStringKEY_TITLE="title";
publicstaticfinalStringKEY_PUBLISHER="publisher";privatestaticfinalStringTAG="DBAdapter";privatestaticfinalStringDATABASE_NAME="books";privatestaticfinalStringDATABASE_TABLE="titles";privatestaticfinalintDATABASE_VERSION=1;privatestaticfinalStringDATABASE_CREATE="createtabletitles(_idintegerprimarykeyautoincrement,"+"isbntextnotnull,titletextnotnull,"+"publishertextnotnull);";privatefinalContextcontext;}DATABASE_CREATE常量包括创建titles表的SQL语句。在DBAdapter类中,你可以扩展SQLiteOpenHelper类,它是一个Android辅助类,主要用于数据库创建和版本管理。实际上,你可以覆盖onCreate()和onUpgrade()方法,如清单2所示。清单2在DBAdapter类中,扩展SQLiteOpenHelper类覆盖onCreate()和onUpgrade()方法packagenet.learn2develop.Database;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.util.Log;publicclassDBAdapter{publicstaticfinalStringKEY_ROWID="_id";publicstaticfinalStringKEY_ISBN="isbn";publicstaticfinalStringKEY_TITLE="title";publicstaticfinalStringKEY_PUBLISHER="publisher";privatestaticfinalStringTAG="DBAdapter";privatestaticfinalStringDATABASE_NAME="books";privatestaticfinalStringDATABASE_TABLE="titles";privatestaticfinalintDATABASE_VERSION=1;privatestaticfinalStringDATABASE_CREATE="createtabletitles(_idintegerprimarykeyautoincrement,"+"isbntextnotnull,titletextnotnull,"+"publishertextnotnull);";privatefinalContextcontext;privateDatabaseHelperDBHelper;privateSQLiteDatabasedb;publicDBAdap
ter(Contextctx){
this.context=ctx;DBHelper=newDatabaseHelper(context);}privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{DatabaseHelper(Contextcontext){super(context,DATABASE_NAME,null,DATABASE_VERSION);}@OverridepublicvoidonCreate(SQLiteDatabasedb){db.execSQL(DATABASE_CREATE);}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){Log.w(TAG,"Upgradingdatabasefromversion"+oldVersion+"to"
+newVersion+",whichwilldestroyallolddata");db.execSQL("DROPTABLEIFEXISTStitles");onCreate(db);}}}onCreate()方法创建一个新的数据库,onUpgrade()方法用于升级数据库,这可以通过检查DATABASE_VERSION常量定义的值来实现,对于onUpgrade()方法而言,只不过是简单地删除表,然后在创建表而已。现在你可以定义不同的方法来打开和关闭数据库,如清单3中的添加/编辑/删除/行的函数。清单3定义打开和关闭数据库以及增加/编辑/删除表中行的方法publicclassDBAdapter{//...//...//---打开数据库--publicDBAdapteropen()throwsSQLException{db=DBHelper.getWritableDatabase();returnthis;}//---关闭数据库---
publicvoidclose(){DBHelper.close();}//---向数据库插入一个标题--publiclonginsertTitle(Stringisbn,Stringtitle,Stringpublisher){ContentValuesinitialValues=newContentValues();initialValues.put(KEY_ISBN,isbn);initialValues.put(KEY_TITLE,title);initialValues.put(KEY_PUBLISHER,publisher);returndb.insert(DATABASE_TABLE,null,initialValues);}//---删除一个指定的标题--publicbooleandeleteTitle(longrowId){returndb.delete(DATABASE_TABLE,KEY_ROWID+"="+rowId,null)>0;}//---检索所有标题--publicCursorgetAllTitles()
{returndb.query(DATABASE_TABLE,newString[]{KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},null,null,null,null,null);}//---检索一个指定的标题--publicCursorgetTitle(longrowId)throwsSQLException{CursormCursor=db.query(true,DATABASE_TABLE,newString[]{KEY_ROWID,KEY_ISBN,KEY_TITLE,
KEY_PUBLISHER},KEY_ROWID+"="+rowId,null,null,null,null,null);if(mCursor!=null){mCursor.moveToFirst();}returnmCursor;}//---更新一个标题--publicbooleanupdateTitle(longrowId,Stringisbn,Stringtitle,Stringpublisher){ContentValuesargs=newContentValues();args.put(KEY_ISBN,isbn);args.put(KEY_TITLE,title);
args.put(KEY_PUBLISHER,publisher);returndb.update(DATABASE_TABLE,args,KEY_ROWID+"="+rowId,null)>0;}}注意Android使用Cursor类返回一个需要的值,Cursor作为一个指针从数据库查询返回结果集,使用Cursor允许Android更有效地管理它们需要的行和列,你使用ContentValues对象存储键/值对,它的put()方法允许你插入不同数据类型的键值。清单4显示了完整的DBAdapter.java源代码。清单4DBAdapter.java完整源代码packag
enet.learn2develop.Database;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;publicclassDBAdapter{publicstaticfinalStringKEY_ROWID="_id";publicstaticfinalStringKEY_ISBN="isbn";publicstaticfinalStringKEY_TITLE="title";
publicstaticfinalStringKEY_PUBLISHER="publisher";privatestaticfinalStringTAG="DBAdapter";privatestaticfinalStringDATABASE_NAME="books";privatestaticfinalStringDATABASE_TABLE="titles";privatestaticfinalintDATABASE_VERSION=1;privatestaticfinalStringDATABASE_CREATE="createtabletitles(_idintegerprimarykeyautoincrement,"+"isbntextnotnull,titletextnotnull,"+"publishertextnotnull);";privatefinalContextcontext;privateDatabaseHelperDBHelper;privateSQLiteDatabasedb;publicDBAdapter(Contextctx){this.context=ctx;DBHelper=newDatabaseHelper(context);}privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{DatabaseHelper(Contextcontext)
{super(context,DATABASE_NAME,null,DATABASE_VERSION);}@OverridepublicvoidonCreate(SQLiteDatabasedb){db.execSQL(DATABASE_CREATE);}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){Log.w(TAG,"Upgradingdatabasefromversion"+oldVersion+"to"+newVersion+",whichwilldestroyallolddata");db.execSQL("DROPTABLEIFEXISTStitles");onCreate(db);}}//---打开数据库---
publicDBAdapteropen()throwsSQLException{db=DBHelper.getWritableDatabase();returnthis;}//---关闭数据库--publicvoidclose(){DBHelper.close();}//---向数据库中插入一个标题--publiclonginsertTitle(Stringisbn,Stringtitle,Stringpublisher){ContentValuesinitialValues=newContentValues();initialValues.put(KEY_ISBN,isbn);initialValues.put(KEY_TITLE,title);initialValues.put(KEY_PUBLISHER,publisher);returndb.insert(DATABASE_TABLE,null,initialValues);}//---删除一个指定标题---
publicbooleandeleteTitle(longrowId){returndb.delete(DATABASE_TABLE,KEY_ROWID+"="+rowId,null)>0;}//---检索所有标题--publicCursorgetAllTitles(){returndb.query(DATABASE_TABLE,newString[]{KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},null,null,null,null,null);}//---检索一个指定标题---
publicCursorgetTitle(longrowId)throwsSQLException{CursormCursor=db.query(true,DATABASE_TABLE,newString[]{KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER},KEY_ROWID+"="+rowId,null,null,null,null,null);if(mCursor!=null){mCursor.moveToFirst();}returnmCursor;}
//---更新一个标题--publicbooleanupdateTitle(longrowId,Stringisbn,Stringtitle,Stringpublisher){ContentValuesargs=newContentValues();args.put(KEY_ISBN,isbn);args.put(KEY_TITLE,title);args.put(KEY_PUBL
ISHER,publisher);returndb.update(DATABASE_TABLE,args,KEY_ROWID+"="+rowId,null)>0;}}使用数据库现在你已经可以利用创建的辅助类来使用数据库了,DatabaseActivity.java文件中,在创建一个DBAdapter类的实例:packagenet.learn2develop.Database;importandroid.app.Activity;importandroid.os.Bundle;publicclassDatabaseActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);}}增加一个标题如果想在titles表中增加一个标题,可以使用DBAdapter类的insertTitle()方法:@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);//---add2titles--db.open();longid;id=db.insertTitle("04702858180470285818",0470285818"C#2008Programmer'sReference","Wrox");id=db.insertTitle("047017661X","ProfessionalWindowsVistaGadgetsProgramming",
"Wrox");db.close();}insertTitle()方法返回插入行的ID,如果在添加过程中遇到错误,它就返回-1。如果你分析Android设备/模拟器的文件系统,你可以看到book数据库创建在database文件夹下,如图3所示。图3database文件夹
检索所有标题想要检索titles表中的所有标题,可以使用DBAdapter类的getAllTitles()方法,如清单5所示。清单5使用DBAdapter类的getAllTitles()方法检索titles表中的所有标题packagenet.learn2develop.Database;importandroid.app.Activity;importandroid.database.Cursor;importandroid.os.Bundle;importandroid.widget.Toast;publicclassDatabaseActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);//---获取所有标题--db.open();Cursorc=db.getAllTitles();if(c.moveToFirst()){do{DisplayTitle(c);}while(c.moveToNext());}db.close();}}返回的结果是一个Cursor对象,如果要显示所有标题,你首先应该调用Cursor对象的moveToFirst()方法,如果它成功(意味着至少有一行有效),使用DisplayTitle()方法显示详细的标题,要移动到下一个标题,可以调用Cursor对象的moveToNext()方法,下面是DisplayTitle()方法的定义:publicvoidDisplayTitle(Cursorc){Toast.makeText(this,"id:"+c.getString(0)+"\n"+0
"ISBN:"+c.getString(1)+"\n"+1"TITLE:"+c.getString(2)+"\n"+2"PUBLISHER:"+c.getString(3),3Toast.LENGTH_LONG).show();}图4显示Toast类,它从数据库中检索并显示一个标题。图4Toast类
检索单个标题想要通过ID检索单个标题,可以使用DBAdapter类的getTitle()
方法:@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);//---getatitle--db.open();Cursorc=db.getTitle(2);2if(c.moveToFirst())DisplayTitle(c);elseToast.makeText(this,"Notitlefound",Toast.LENGTH_LONG).show();db.close();}返回的结果是一个Cursor对象,如果返回一行,可以使用DisplayTitle()方法显示标题的详细信息,否则就使用Toast类显示一个错误消息。更新一个标题要更新一个特定的标题,可以调用DBAdapter的updateTitle()方法,传递想要更新的标题的ID给它就可以了,如清单6所示。清单6调用DBAdapter类的updateTitle()方法更新标题@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);
//---更新标题--db.open();if(db.updateTitle(1,1"04702858180470285818",0470285818"C#2008Programmer'sReference","WroxPress"))Toast.makeText(this,"Updatesuccessful.",Toast.LENGTH_LONG).show();elseToast.makeText(this,"Updatefailed.",Toast.LENGTH_LONG).show();//------------------//---检索相同的标题--Cursorc=db.getTitle(1);if(c.moveToFirst())DisplayTitle(c);elseToast.makeText(this,"Notitlefound",Toast.LENGTH_LONG).show();//-------------------
db.close();}如果更新成功会显示一条表示成功的消息,同时,你可以检索刚刚更新的标题看更新结果是否正确。删除一个标题想要删除一个标题,可以调用DBAdapter类的deleteTitle()方法,传递你想要删除的标题的ID即可:@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);//---deleteatitle--db.open();if(db.deleteTitle(1))1Toast.makeText(this,"Deletesuccessful.",Toast.LENGTH_LONG).show();elseToast.makeText(this,"Deletefailed.",Toast.LENGTH_LONG).show();db.close();}如果删除成功会显示一条表示成功的消息。升级数据库
要升级数据库,修改DBAdapter类中DATABASE_VERSION常量的值比之前的值大,如之前的值是1,将其改为2:publicclassDBAdapter{publicstaticfinalStringKEY_ROWID="_id";publicstaticfinalStringKEY_ISBN="isbn";publicstaticfinalStringKEY_TITLE="title";publicstaticfinalStringKEY_PUBLISHER="publisher";privatestaticfinalStringTAG="DBAdapter";privatestaticfinalStringDATABASE_NAME="books";privatestaticfinalStringDATABASE_TABLE="titles";//---changethistoahighervalue--privatestaticfinalintDATABASE_VERSION=2;privatestaticfinalStringDATABASE_CREATE="createtabletitles(_idintegerprimarykeyautoincrement,"+"isbntextnotnull,titletextnotnull,"+"publishertextnotnull);";当你再次运行这个应用程序时
,你会在Eclipse的LogCat窗口中看到数据库已经升级的消息,如图5所示。图5LogCat窗口-消息显示数据库升级成功简化数据库访问使用DBAdapter类,可以简化你的Android应用程序访问数据库记录的操作,一个重要的事情是在Android中创建的SQLite数据库只有创建它的应用程序可以访问它。如果你要共享数据,你需要使用一个内容提供器,这个将在以后的文章中再介绍了。
Android系统架构
责任编辑:责任编辑:柳达作者:AndroidinAndroidin【内容导航】2009-03-23
??
第1页:android系统架构图及简单的系统架构介绍第2页:GoogleMagic(G2)产品详细信息
Tag:文本Tag:AndroidGoogle【IT168技术文档】
android系统架构图android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。1.应用程序Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。2.应用程序框架开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统,其中包括;*丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textboxes),按钮(buttons),甚至可嵌入的web浏览器。*内容提供器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据*资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles)。*通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息。*活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。有关更多的细节和怎样从头写一个应用程序,请参考如何编写一个Android应用程序.3.系统运行库1)程序库Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过Android应用程序框架为开发者提供服务。以下是一些核心库:*系统C库-一个从BSD继承来的标准C系统函数库(libc),它是专门为基于embeddedlinux的设备定制的。*媒
体库-基于PacketVideoOpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。*SurfaceManager-对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。*LibWebCore-一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。*SGL-底层的2D图形引擎*3Dlibraries-基于OpenGLES1.0APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。*FreeType-位图(bitmap)和矢量(vector)字体显示。*SQLite-一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。2)Android运行库Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的"dx"工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。4.Linux内核
Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间的抽象层。
Android程式编写及调试新手入门-1
责任编辑:责任编辑:徐威特作者:阿肆阿肆2009-04-02
Tag:文本Tag:Android【IT168技术文档】这个文档的题目叫做《Android程式设计及调试新手入门V1.0.0》,现在想想,感觉有点叫的太大了⊙﹏⊙b汗,程式设计对于我来说,特别是对我这种Java代码可能到目前位置还亲手写到还不到100行,看的代码还不到1000行的人来说,基本上就是有点班门弄斧。但是我想有一个东西是不得不承认,程式这个东西都是相通的(继续汗⊙﹏⊙b汗),思想还是一个比较重要的东西在真个程式的设计中。当然,在文档中我会有一些关于程式设计的一些习惯来跟大家分享下。同时,对于Java这个纯面向对象(OO)的语言来说,还是很喜欢。好了,闲话少说,在接下来的文字我们一起来分享一些经验。阅读本文档您需要准备的和知道的在这篇文档阅读前,您首先要确认的是,您已经安装好了我们所需要的一些软件和SDK,具体的清单如下所示:lllllADT-0.8.0.zip以上版本android-sdk-windows-1.0_r2.zip以上版本eclipse-jee-ganymede-SR1-win32.zip或者3.3版wtp-wst-R-3.0.4
-20090213193639.zip以上版本jdk-6u11-windows-i586-p.exe以上版本这里需要说明的是,以上这些都是调试Android应用程式的必须,这些是调试Android程式官方推荐调试IDE的必要部分。如果您是第一次接触,请您阅读我的第一份关于Android的文档——《Android模拟器及编译环境安装新手入门》,这份文档在我的个人站点有连载,版本在Androidin有发布,PDF具体参考的地址可以见最下面的参考网站。如果您尚未准备好关于我上面提及的文档中相关内容,请先完成上个文档中所提及的内容,如果您已经完成了以上的,请继续阅读下面的内容。好啦,到这里一些朋友肯定摩拳擦掌准备大干一番,另外一些朋友可能会有一下的忧虑,我们先花点时间来分析下这个问题,因为这也许决定了您是是否能够坚持下去继续学习这个东东,或者说,您可以检查自己学习这个出发点,从而为今后的学习方向和学习强度来指定一个计划,那我们就开始,以下以判断分支的形式来做选择。首先,您学习Android开发之前对Java了解的程度是多少?
非常熟悉:您可以跳过这个文档中的大部分内容,您可以选择的看看就好了。记得给作者一些建议和意见哦^_^~~;一般熟悉:您比作者好多了O(∩_∩)O哈哈~,写这个文档的小子Java的代码还没写过100行,可能您只是对Android以及Eclipse有些操作上不太熟悉,您可以看看这篇文档,找到您想了解的部分就可以了,同样,记得给作者一些建议和意见哦^_^~~;完全不懂:好了,您和写这个文档的我是一样的起点呢。所以啊。没关系,继续看下去就好了;其次,您学习Android的动机是什么?完全是为了工作:汗,这个文档写的可能过于初级和语无伦次,阅读他也许浪费您宝贵的时间,您完全可以节选其中您所需要的部分阅读,不必完整阅读;完全是爱好到您的地方。最后,我到底能否坚持下去呢?完全是工作逼迫:这个。。。。。。您不得不坚持下去了,除非你不做这份工了,瀑布汗;我爱好,我坚持:一起加油吧!犹豫中:对于这类朋友,我想说的是,您犹豫的时间里,也许,您用这些时间您都已经完全学好了Android的开发也不一定,所以,不要再犹豫了,学下去总有收获,就算Android不能像预计那样的火爆,至少您也算学习了些东西,也和作者在前面所说的,什么什么都是相同的如此这般。。。。。。汗。好了,不要再犹豫了。Let’sGO!?Vamos!差点忘记了。您可以准备一些轻快的歌曲(推荐安室奈美惠的歌曲)、一杯水(温暖的饮料更加)和一个舒服的环境,写程式在一个轻松的环境下会事半功倍
的!从一个ExampleCode开始学习开始本章前的一些话接下来我们就开始学习,我们的学习方式参考欧美一些国家大学计算机专业的学习方法,直接从一个大程式的阅读和调试开始,也许您会说,我完全不懂Java怎么调试啊,语法不懂,关键字不懂。我想说的是,这个不是问题,我也是完全不懂Java的状态下开始Android学习的。您可以跟着本文档的节奏来学习,如果您觉得跟不上节奏,您可以反复的做一些试验,或者放慢一些节奏来,但是一定要跟着走完一下的步骤。另外,本文档所用到的code的下载我会在最后的相关网站中提及到,请自行下载,具体请见下。:这个动机和笔者是一直的,希望您能在这篇文档中找到可以帮助
再次提醒大家确认好调试所需要的所有环境以及SDK已经确认装好,如没有装好请参考我上面提及的文档完成安装。如确认好了,请继续。打开首先,我们打开Eclipse,我们会看到一个完全干净的IDE编译环境如下图1所示:
图1EclipseIDE接下来,我来介绍下我们所用的code的来源,因为笔者学习计划是阅读完ChrisHaseman的,所以参考的code也来自这里,笔者选的是第三章的Code,选择这章节Code原因有一下几点,第一,笔者已经完全调试通过这个章节的Code,确认是可以运行;第二,这张的code对新手来说长度还算是适中,但是内容比较丰富,适合初学者学习;第三,原始code中的一些Bug比较容易修改而且有针对性,常常是大家在调试过程中会遇到的。您可以到最后章节中推荐的下载地址去下载。这里我先给出该书的所有的原始code,我们需要的是其中的Chapter3。下载地址:51wince/webblog/android/android_essentials-4026.zip.首先,我们来打开这个项目,我们选择File,选择New,我们会看到AndroidProject选项,具体如下图2所示:
图2打开step1接下来我们会看到一个选择对话框,标题为“NewAndroidProject”,这里大家不要被这个标题吓到了,大家会说,我们不是读一个已经现成的code吗,为什么还叫New一个呢?这里我们要做的是选择“createprojectformexistingsource”,然后在“Location”的地方选择我们code的路径,点击“Browse”,找路径形如图3所示:
图3Code路径的选择选择好了后,我们点击确定,eclipse会自动帮我们获取好整个project的一些信息,比如projectname,packagename等等,我们会看到如图4所示的一个界面:
图4Eclipse自动获取project信息
这里,我们会看到一个感叹号的提示,“AnEclipseprojectalreadyexistsinthisdirectory.ConsiderusingFile>Import>ExistingProje
ctinstead”,这个提示告诉我们可以有另外一种更好的方式去获取已经存在的方式,也就是从File>Import>ExistingProjectinstead这样的方式打开,这里我们不去操作,大家可以自己去尝试下。接下来我们点击“Finish”,整个Projectcode就导入到了Eclipse之中。我们可以在Eclipse左边的PackageExplorer中看到整个project的结构树,形如图5所示:
图5project结构树在这个树结构中我们可以了解的有如下一些信息,我们逐个分析下:1.2.式;3.4.上需要删除;5.中的库集合;6.7.置了项目的资源;8.9.文件,以XML为主;10.11.12.rawvaluesAndroidManifest.xml自定义文件夹,存放音频文件;存放string.xml;每个项目必备,存放项目描述;drawablelayout图片文件习惯放这里;存放的外观assetsres这个文件这里放夹不常用,具体解释见下;AndroidLibraryAndroidSDK包comcom.haseman早期项目接早期项目接口,同口,这里我们需要删除;getSplashysrc项目名称;项目程