Android 开发技术培训.ppt

上传人:文库蛋蛋多 文档编号:2312235 上传时间:2023-02-10 格式:PPT 页数:180 大小:6.52MB
返回 下载 相关 举报
Android 开发技术培训.ppt_第1页
第1页 / 共180页
Android 开发技术培训.ppt_第2页
第2页 / 共180页
Android 开发技术培训.ppt_第3页
第3页 / 共180页
Android 开发技术培训.ppt_第4页
第4页 / 共180页
Android 开发技术培训.ppt_第5页
第5页 / 共180页
点击查看更多>>
资源描述

《Android 开发技术培训.ppt》由会员分享,可在线阅读,更多相关《Android 开发技术培训.ppt(180页珍藏版)》请在三一办公上搜索。

1、Android 开发技术培训,沈大海,Android 的历史,2003,2004,2005,2006,2007,2008,2009,2010,2,Android and OHA(Open Handset Alliance),Google与2007年11月5日宣布组建的一个全球性的联盟组织。联盟成员将支持盟主Google 发布的Android 手机操作系统或者应用软件,共同开发名为Android 的开放源代码的移动系统。共同对抗 Symbian,Windows Mobile,iphone等系统。,3,Android OHA 生态系统,4,Android 市场份额,5,Android Kernel

2、 version,Android based on generic Linux 2.6 kernel Android 1.0 based on Linux2.6.25Android 1.5(cupcake)based on Linux2.6.27Android 1.6(donut)based on Linux2.6.29Android 2.0/2.1(clair)based on Linux2.6.29Android 2.2(Froyo)based on Linux 2.6.32Android 2.3(Gingerbread)based on Linux 2.6.35Android 3.0(H

3、oneycomb)based on Linux 2.6.36 Android special drivers:Ashmem Logger Binder Android power management Low memory killer and Android pmem,Android Release History,Android 1.0(Sept 2008),Android 1.1(Feb 2009),Android 1.5Cupcake(April 2009),Android 1.6Donut(Sept 2009),Android 2.0/2.1Eclair(Oct 2009),Andr

4、oid 2.2Froyo(May 2010),Android 2.3Gingerbread(Dec 2010),Android 3.0Honeycomb(Feb 2011),Android 3.xIce Cream Sandwich(Oct/Nov 2011?)Release DateNot Yet Announced,Android release cycles range from 1 to 9 months.,Android Framework Architecture,9,Android体系结构,应用程序(Applications):依据User的期望而将AF的组件及Libaraies

5、组件组合而成的高阶服务。应用框架(Application Framework,简称AF):这是结合Applications与Libraries的幕后主架构,让Libraries组件能不断地为Applications所重复使用(Reuse)。丰富而又可扩展的视图(Views)内容提供器(Content Providers)资源管理器(Resource Manager)通知管理器(Notification Manager)活动管理器(Activity Manager)Libraries:Android里已经提供的C/C+库存组件(或称模块)。例如,SQLite数据库系统、OpenGL 3D绘图系统

6、等。Android Runtime:Java语言层级的Virtual Machine。Linux核心:Android依赖Linux 2.6来提供核心的服务,例如内存管理、进程(Process)管理、执行绪(Thread)管理等。,10,Android层次-kernel,Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。使用binder作为进程间通讯机制,取代传统进程间通讯机制,11,Android Hardware Abstraction La

7、yer,用户空间的C/C+库遵循Apache协议定义Android需要linux driver实现的接口将Android彻底和硬件抽象出来,12,Android层次结构-Android Runtime,Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。Dalvik虚拟机则是基于寄存器的,而非大多数 虚拟机所采用的基于栈的实现Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。,13,Android包含一个C/C+库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framew

8、ork)暴露给开发者。下面列出一些核心库:系统C库多媒体库:OpenCore界面管理LibWebCoreSGL3D库FreeTypeSQLite,Android层次结构-Libraries,14,Android层次结构Application Framework,通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(

9、需要服从框架执行的安全限制)。这一机制允许用户替换组件。所有的应用程序其实是一组服务和系统,包括:ViewActivityManagerContentProviderNotificationManager,15,Android层次结构Applications,Android魅力的终极体现:对用户:良好的用户体验,强大的用户亲和力 对开发者:快速而灵活的开发平台,让开发者的灵感能快速转化为产品,16,Android Processes,Android Applications,Android apk build and packaging,Android application unpackag

10、ing and run,三种开发形式,SDK开发Windows linux macNDK开发Windows linux源码开发(完全源代码,Linux中开发),Linux操作系统知识 Linux内核知识(C语言)Linux驱动程序知识(C语言)Android底层库(C语言、C+)Dalvik虚拟机(C+、JAVA)Android GUI系统(C+、JAVA)音频、视频和多媒体(C语言、C+、JAVA)电话部分的(C语言、C+、JAVA)连接部分(C语言、C+、JAVA)传感器部分(C语言、C+、JAVA),Android源码开发知识结构:,Android应用开发知识结构:,JAVA语言知识 应

11、用程序架构 GUI设计基础知识 各种视图的使用 2D/3D图形API 应用程序的设计思想,AndroidNDK开发知识结构:,JAVA语言知识 应用程序架构 JNI技术 Linux下C编程,Android debug tools,Adb(Android debug bridge)DmtracedumpEmulatorLogcat MksdcardMonkeySqlite3Eclips Gdb/gdbserver,搭建开发环境Eclipse/ADT,下载并安装eclipse:http:/www.eclipse.org/downloads/下载SDK安装包:http:/启动eclipse-help

12、-Install New Softwares2 在”Work with”中输入一个任意名字3 将https:/dl-添加到网址栏,点击”Add”按钮4 在”Work with”的下拉列表中选定刚刚添加的item,在详细信息框中会有选择列表,推荐全部安装,将开始在线安装过程,31,搭建开发环境Eclipse/ADT,32,搭建开发环境安装SDK,点击Window-Android SDK and AVD Manager-Available Packages,安装需要的SDK创建一个新的AVD1 通过Window-Android SDK and AVD Manager-Virtual Devices

13、-New通过命令行创建:开始-运行-cmd-android create avd n avd-name t 6(创建2.0的)默认创建的路径是C:Documents and SettingsUser-name.androidavd,33,生成一个新的工程,用eclipse创建一个新的android应用:File-New-Android Project在弹出的提示对话框中所有填写所有项目:项目名称所使用SDK版本应用程序名称包名,34,35,运行第一个HelloAndroid,36,从HelloAndroid分析Android应用的要素,AndroidManifest.xmlres-所有的资源

14、Drawable-图片文件 Layout-布局文件 Values-字符串以及属性定义文件Src-代码目录,37,目录的组织,anim/drawable/layout/values/xml/raw/,1)anim目录录下存放着描述animation类型的xml文件。2)drawable目录该目录下存放着.png,.jpg等图片文件。3)layout目录下存放着屏幕UI的layout文件,格式为xml。4)values目录下可以存放多种资源类型的xml文件,例如定义了数组的array.xml,定义了颜色的colors.xml,定义了dimension的dimnes.xml,定义了字符串的strin

15、gs.xml,定义了style的styles.xml。5)xml目录存放了用户自定义的xml文件。6)raw目录可存放了用户的原始数据文件,如声音文件等,这些文件在编译应用程序过程中不被编译,直接加到apk文件中。,38,AAPT打包示意图,39,限定符的类型和有效的值,40,资源管理框架,41,Android应用的要素AndroidManifest,AndroidManifext的作用:描述了程序包的全局变量,包括暴露的应用组件(activities,services等等)和为每个组件的实现类,什么样的数据可以操作,以及在什么地方运行,42,AndroidManifest的主要元素,几乎所有

16、的AndroidManifest.xml(以及许多其他Android的xml的文件)在第一个元素中包含了命名空间的声明xmlns:android=“http:/application:application是Android应用内最高级别(top level)的模块,每个应用内最多只能有一个application,如果应用没有指定该模块,一个默认的application将被启用。application将在应用启动时最先被加载,并存活在应用的整个运行时生命周期。因此一些初始化的工作适合在本模块完成.Application元素有许多属性,其中:“persistent”表示本应用是否为常驻内存,“en

17、able”表示本应用当前是否应当被加载。,43,Android-activity,1.创建activityXxxActivity extends Activity.2.配置AndroidManifest.xml文件launchMode:standard:每次启动新的活动窗口(new操作)singleTop:如果在栈顶是目标活动,则直接打开.否则开启新的活动窗口(new).singleTask:同一任务内不再实例化,不同任务需要实例化.singleInstance:不论是否是同一任务,只要打开就共享.,AndroidManifest的主要元素,activity:activity是applicat

18、ion模块的运行时子元素,标识了一个UI。除了application,一个应用可以声明并实现零至多个其它运行时模块,activity也同样。activity也包含了许多定义它工作状态的属性,其中:“name”是必须的,它指定了该activity所在的文件名,如果该文件所属包不同于该应用的包名(即本描述文件的最开始处),那么名字前面需要加入所在包名。activity通过增加intent-fliter来标识哪些intent可以被处理,同时intent也是调度activity的主要参数。service:service也是application的运行时子元素。Service属于后台模块,启动后将长时间

19、运行,除非停止该service或所在应用进程被杀死,45,Android应用组成元素layout,Android 的UI 布局都以Layout 作为容器,在上面按照规定排列控件,这方面跟JAVA 的Swing 和LWUIT 很像。控件跟Layout 有很多属性是一样的,可以在Properties 里面修改,跟.NET/Delphi 等RAD 类似,其中最常用的属性有以下这些:id=“+id/edtInput”,ID 是连接UI 与代码的桥梁 layout_width=fill_parent,自动填充至屏幕宽度,layout_height 同理 常用的layout有:LinearlayoutRe

20、lativelayoutFramelayoutAbsoluteLayoutAdapterView,46,Android应用四大组件简介,ActivityServiceContentProviderBroadcastReceiver,47,Activity简介,展现为一个用户可视化界面Activity可以多种形式呈现,如全屏模式,对话框模式,透明模式等Activity的部分重要属性:android:label=string resource android:icon=drawable resource android:launchMode=multiple|singleTop|singleTas

21、k|singleInstance,48,Activity的四个状态,Active/Runing一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。2.Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。3.Stoped 当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped状态。4.Killed Activity 被系统杀死回收或者没有

22、被启动时处于 Killed状态。,49,Activity的各个回调函数与状态 之间的关系,protected void onCreate(Bundle savedInstanceState);protected void onStart();protected void onResume();protected void onPause();protected void onStop();protected void onDestroy();,50,Android-应用程序的响应性,在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理器(Window Ma

23、nager(这两个系统服务所监视.当用户触发了输入事件(如键盘输入,点击按钮等),如果应用5秒内没有响应用户的输入事件,那么,Android会认为该应用无响应,便弹出ANR(Application No Response)对话框,如右图.在正常情况下,Android程序会在一条单线程里运行.如果Activity要处理一件比较耗时的工作,应该交给子线程完成,否侧会因为主线程被阻塞,后面的用户输入事件因没能在5秒内响应,导致应用出现ANR对话框.,Service简 介,是什么:Service在Android中是一种长生命周期的组件,它不实现任何用户界面用来做什么:实现不需要用户界面但是需要一直运行

24、的功能,如:音乐播放器怎么用:实现一个自己的service启动执行:context.startService()/context.bindService(),52,ContentProvider简介,ContentProvider是Android提供的一种标准的共享数据的机制,应用程序可以通过content provider访问其它应用程序的一些私有数据ContentProvider的优点:屏蔽了内部数据的存储细节,向外提供了上述统一的接口模型,53,BroadcastReceiver简介,BroadcastReceiver的作用:每个Broadcast Receiver都可以接收一种或若干种

25、Intent作为触发事件BroadcastReceiver不执行任何任务,仅仅是接受并响应广播通知的一类组件。BroadcastReceiver 不包含任何用户界面,54,基础UI,menu:如何打造友好的菜单ListView:用好列表,做好程序Dialog:人机友好互动交流Toast和Notification:温馨的提醒,55,Android的菜单Menu,menu负责管理MenuItem添加一个menuItemadd(int groupId,int itemId,intorder,CharSequence title)删除所有的menuItemclear()MenuItem一个菜单的条目常

26、用的方法:setTitlesetIcongetItemId(),56,Android的菜单Menu,1.)通过代码创建Menupublic boolean onCreateOptionsMenu(Menu menu)/分组id,Item的id,顺序,名字menu.add(0,M_FBACK,0,反馈).setAlphabeticShortcut(F);menu.add(0,M_HELP,1,帮助).setAlphabeticShortcut(H).setIcon(android.R.drawable.ic_menu_help);return true;,57,Android的菜单Menu,2.

27、)通过xml创建Menu在Android工程的res/目录下新增一个menu/子目录,然后建立option_menu.xml文件onCreateOptionsMenu()方法里通过MenuInflater类引入定义好的菜单文件,58,option_menu.xml文件,option_menu.xml文件,59,public boolean onCreateOptionsMenu(Menu menu)MenuInflater inflater=getMenuInflater();inflater.inflate(R.menu.option_menu,menu);return true;,60,6

28、1,Android 的对话框 Dialog,生成AlertDialog三步走生成一个AlertDialog的构造者AlertDialog.BuilderAlertDialog.Builder builder=new AlertDialog.Builder(context);设置属性,包括标题、按钮和图标builder.setIcon();builder.setTitle();builder.setPositiveButton();builder.setNegativeButton();最后生成AlertDialogbuilder.create();,62,提醒 Toast,Toast是Andr

29、oid提供的轻量级的提醒机制Toast永远不会获得聚焦不会打断用户当前的操作信息在floating view呈现,然后会自动消失,63,如何创建Toast1.)简单文字信息通过make()方法创建Toast信息调用show()方法来显示Toast提示信息2.)复杂Toast信息Toast支持通过setView(view)添加view组件,64,Android UI组件,65,常用UI组件,66,自动文本和选择组件,67,日期和时间选择器,68,GirdView Gallery ImageSwitcher,69,RatingBar ProgressBar,70,Activity之间的跳转,Int

30、ent intent=new Intent();intent.setClass(MainActivity.this,SpinnerActivity.class);startActivity(intent);,71,Intent,72,73,74,action,75,data,76,category,77,78,79,80,81,编写电话拨号程序,if(PhoneNumberUtils.isGlobalPhoneNumber(t01.getText().toString()Intent t=new Intent(Intent.ACTION_CALL,Uri.parse(tel:/+t01.get

31、Text().toString();CallTel.this.startActivity(t);else Toast.makeText(CallTel.this,呼叫电话错误,Toast.LENGTH_LONG).show();,82,83,Android 系统标准action,84,Intent 跟pendingIntent 间的联系,intent英文意思是意图,pending表示即将发生或来临的事情。PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。Intent 是及时启动,intent 随所在的activity 消失

32、而消失。PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent的。正由于pendingintent中 保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent,就算在执行时当前App已经不存在了,也能通过存在pendingintent里的Context照样执行In

33、tent。另外还可以处理,85,Intent 跟pendingIntent 间的联系,intent执行后的操作。常和alermanger 和notificationmanager一起使用。Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在 Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装。,86,BroadcastReceiver,BroadcastReceiver的作用BroadcastReceiver的类别BroadcastRecei

34、ver的工作流程,87,BroadcastReceiver 的作用,作用:接收由sendBroadcast()或者sendOrderedBroadcast发送的Intent,88,BroadcastReceiver的类别,sendBroadcast:称为Normal broadcast,所有关注该消息的Receiver,都有机会获得并进行处理 sendOrderedBroadcast 称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的只能吃前面吃剩下的,前面的心情不好私吞了,后面的只能喝西北风了(有可能拿不到)。,89,Android系统标准broadcast,

35、90,Service,Service 的定义如何使用serviceService 的生命周期,91,Service 的定义,运行在后台可以活在自己进程或者其他应用程序的上下文(context)里面默认情况下仍然是活在主线程的,所以耗时操作要起线程来处理,92,如何使用service,通过Context.startService()启动,ontext.stopService结束:(1)生成-开始(onCreate-onStart)过程(2)Service停止的时候进入(onDestroy)过程(3)如果调用者退出不调用stopServie,服务还会活着,93,如何使用service,通过Cont

36、ext.bindService启动(1)只运行onCreate,调用Context.unbindservice()结束(2)可以通过ServiceConnection访问Service(3)调用者退出,service则调用onUnbind(4)可以实现IPC,94,Service 的生命周期,调用startService的生命周期为:onCreate-onStart(可多次调用)-onDestroy调用bindService的生命周期为:onCreate-onBind(只一次,不可多次绑定)-onUnbind-onDestory,95,Service 的生命周期,96,文件操作Preferen

37、cesSQLite库存储网络content provider,Android中的数据保存,97,文件操作,openFileInputopenFileOutput 读取资源文件getResource().openRawResource(R.raw.xxx),98,Preferences,轻量级的保存的是原始数据类型常用于保存程序配置信息,SharedPreferences settings=getSharedPreferences(SETTING_INFOS,0);String name=settings.getString(NAME,);String password=settings.get

38、String(PASSWORD,);,99,过Context.getSharedPreferences()得到一个SharedPreferences。获取一个Editor,对保存的参数进行编辑:commit(),进行提交。SharedPreferences settings=getSharedPreferences(“info”,0);Editor editor=settings.edit();editor.putString(“name”,nameEditText.getText().toString().putString(“pwd”,passwordEditText.getText().

39、toString().commit();,100,Android-使用嵌入式SQLite,Android平台上集成的一个嵌入式关系型数据库,SQLite3支持 NULL,INTEGER,REAL(浮点数字),TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n),char(n),decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型.SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么.但定义为INTEGER PRIMARY KEY的字段只能存储6

40、4位整数,当向这种字段保存除整数以外的数据时,将会产生错误.另外,SQLite在解析CREATE TABLE语句时,会忽略字段名后面的数据类型信息.SQLite可以解析大部分标准SQL语句,如:查询语句:select*from.where group by.having.order by 排序子句SQLite分页同mysql相同:.limit 5 offset 3|limit 3,5,101,Android-使用嵌入式SQLite,首次使用数据库需要创建表及初始化一些信息,升级时需要修改表信,android提供了抽象类SQLiteOpenHelper完成此类功能.onCreate(SQLite

41、Database db)方法用于首次使用时创建库,onUpgrade(SQLiteDatabase db,int oldVersion,int ewVersion)方法检测版本发生变化时更新库.getWritableDatabase()和getReadableDatabase()方法均获取一个用于操作数据库的SQLiteDatabase实例.getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写.倘若使用getWritableDatabase()打开数据库就会出错.getReadableDatabase()方法先以读写方式打开数据库

42、,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.,102,Android-使用嵌入式SQLite,public class DatabaseHelper extends SQLiteOpenHelper private static final String name=“lg;/数据库名称private static final int version=1;/数据库版本public DatabaseHelper(Context context)super(context,name,null,version);public void onCreate(SQL

43、iteDatabase db)db.execSQL(CREATE TABLE IF NOT EXISTS person(personid integer primary key autoincrement,name varchar(20),age INTEGER);public void onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion)db.execSQL(ALTER TABLE person ADD phone VARCHAR(12)NULL);,103,Android-使用嵌入式SQLite,使用SQLiteDataBase

44、数据库SQLiteDatabase db=.;db.execSQL(insert into person(name,age)values(?,?),new Object.);db.close();/查询操作Cursor cursor=db.rawQuery(select*from person,null);while(cursor.moveToNext()int personid=cursor.getInt(0);String name=cursor.getString(1);int age=cursor.getInt(2);cursor.close();db.close();SQLiteDa

45、tabase db=databaseHelper.getWritableDatabase();ContentValues values=new ContentValues();values.put(“name”,“亚嵌教育);.long rowid=db.insert(person,null,values);/,104,Android-使用嵌入式SQLite,/删除SQLiteDatabase db=databaseHelper.getWritableDatabase();db.delete(person,personid?,new String2);db.close();/更新SQLiteD

46、atabase db=databaseHelper.getWritableDatabase();ContentValues values=new ContentValues();/key为字段名,value为值values.put(“name”,“亚嵌教育);db.update(person,values,personid=?,new String1);db.close();注:第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常

47、情况下会维持数据库的打开状态,所以在你不再需要SQLiteDatabase实例时,请及时调用close()方法释放资源.一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()方法得到的都是同一实例.,105,Android-单元测试,.public class XMLTest extends AndroidTestCase public void testSomething()throws Throwable Log.i(Test,this is test 日志);System.out.println(ddd)

48、;Assert.assertTrue(1+1=3);,Android-SQLite3工具使用,cmd cd./toolsadb shell#sqlite3 data/data/cn.lg.android/databases/android sqlite.tables|.schemas|.help|.exit(.quit)|select*.nullvalue NULL/空值数据显示问题 例:.nullvlaue NULL.header(s)ON|OFF/是否显示列头信息 例:.headers ON.mode MODE?table?/指定数据显示风格 例:.mode column创建表时,只能用i

49、nteger类型,不能用int作为主键,否则不支持autoincrement.create table customers(id integer primary key autoincrement,name text);,107,Android-SQLite3工具使用,108,Android-使用ContentProvider,使用内容供应商共享数据.如果直接访问磁盘文件(SDCard|File|SQLite数据库|首选项),需要很多底层的交互细节,但是用该种方式,只使用url即可对应用程序进行访问,并统一了数据访问方式.public class PersonContentProvider e

50、xtends ContentProviderpublic boolean onCreate()public Uri insert(Uri uri,ContentValues values).,109,Android-使用ContentProvider,URI:content:/cn.lg.providers.personprovider/10scheme:android规定,必须是content:/authority:惟一标识该供应商.path:代表操纵的数据./person/person/10/person/10/name/将字符串转换成Uri对象Uri uri=Uri.parse(cont

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号