Android 开发技术培训1.ppt

上传人:爱问知识人 文档编号:5015071 上传时间:2020-01-28 格式:PPT 页数:180 大小:7.19MB
返回 下载 相关 举报
Android 开发技术培训1.ppt_第1页
第1页 / 共180页
Android 开发技术培训1.ppt_第2页
第2页 / 共180页
Android 开发技术培训1.ppt_第3页
第3页 / 共180页
Android 开发技术培训1.ppt_第4页
第4页 / 共180页
Android 开发技术培训1.ppt_第5页
第5页 / 共180页
点击查看更多>>
资源描述

《Android 开发技术培训1.ppt》由会员分享,可在线阅读,更多相关《Android 开发技术培训1.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 Ke

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

3、5 Android 3.0(Honeycomb) 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.5 Cupcake (April 2009),Android 1.6 Donut (Sept 2009),Android 2.0/

4、2.1 Eclair (Oct 2009),Android 2.2 Froyo (May 2010),Android 2.3 Gingerbread (Dec 2010),Android 3.0 Honeycomb (Feb 2011),Android 3.x Ice Cream Sandwich (Oct/Nov 2011?) Release Date Not Yet Announced,Android release cycles range from 1 to 9 months.,Android Framework Architecture,9,Android体系结构,应用程序(Appl

5、ications):依据User的期望而将AF的组件及Libaraies组件组合而成的高阶服务。 应用框架(Application Framework, 简称AF):这是结合Applications与Libraries的幕后主架构,让Libraries组件能不断地为Applications所重复使用(Reuse)。 丰富而又可扩展的视图(Views) 内容提供器(Content Providers) 资源管理器(Resource Manager) 通知管理器 (Notification Manager) 活动管理器( Activity Manager) Libraries:Android里已经

6、提供的C/C+库存组件(或称模块)。例如,SQLite数据库系统、OpenGL 3D绘图系统等。 Android Runtime:Java语言层级的Virtual Machine。 Linux核心:Android依赖Linux 2.6来提供核心的服务,例如内存管理、进程(Process)管理、执行绪(Thread)管理等。,10,Android层次-kernel,Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。 使用binder作为进程间通讯

7、机制,取代传统进程间通讯机制,11,Android Hardware Abstraction Layer,用户空间的C/C+库 遵循Apache协议 定义Android需要linux driver实现的接口 将Android彻底和硬件抽象出来,12,Android层次结构-Android Runtime,Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。 Dalvik虚拟机则是基于寄存器的,而非大多数 虚拟机所采用的基于栈的实现 Dalvik虚拟机依赖于Linux 内核提供基本功能, 如线程和底层内存管理。,13,Android包含一个C/C+库的集合,供A

8、ndroid系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库: 系统C库 多媒体库:OpenCore 界面管理 LibWebCore SGL 3D库 FreeType SQLite,Android层次结构-Libraries,14,Android层次结构Application Framework,通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。 开发者可以完全使用核心应用

9、程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。 所有的应用程序其实是一组服务和系统,包括: View ActivityManager ContentProvider NotificationManager,15,Android层次结构Applications,Android魅力的终极体现: 对用户:良好的用户体验,强大的用户亲和力 对开发者:快速而灵活的开发平台,让开发者的灵感能快速转化为产品,16,Android Processes,Android App

10、lications,Android apk build and packaging,Android application unpackaging and run,三种开发形式,SDK开发 Windows linux mac NDK开发 Windows linux 源码开发 (完全源代码,Linux中开发), Linux操作系统知识 Linux内核知识(C语言) Linux驱动程序知识(C语言) Android底层库(C语言、C+) Dalvik虚拟机(C+、JAVA) Android GUI系统(C+、JAVA) 音频、视频和多媒体(C语言、C+、JAVA) 电话部分的(C语言、C+、JAV

11、A) 连接部分(C语言、C+、JAVA) 传感器部分(C语言、C+、JAVA),Android源码开发知识结构:,Android应用开发知识结构:, JAVA语言知识 应用程序架构 GUI设计基础知识 各种视图的使用 2D/3D图形API 应用程序的设计思想,AndroidNDK开发知识结构:, JAVA语言知识 应用程序架构 JNI技术 Linux下C编程,Android debug tools,Adb (Android debug bridge) Dmtracedump Emulator Logcat Mksdcard Monkey Sqlite3 Eclips Gdb /gdbserve

12、r,搭建开发环境Eclipse/ADT,下载并安装eclipse:http:/www.eclipse.org/downloads/ 下载SDK安装包: http:/ 安装ADT: 1 启动eclipse-help-Install New Softwares 2 在”Work with”中输入一个任意名字 3 将https:/dl- 添加到网址栏,点击”Add”按钮 4 在”Work with”的下拉列表中选定刚刚添加的item,在详细信息框中会有选择列表,推荐全部安装,将开始在线安装过程,31,搭建开发环境Eclipse/ADT,32,搭建开发环境安装SDK,点击Window-Android

13、SDK and AVD Manager-Available Packages, 安装需要的SDK创建一个新的AVD 1 通过Window-Android SDK and AVD Manager-Virtual Devices-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 在弹出的提示对

14、话框中所有填写所有项目: 项目名称 所使用SDK版本 应用程序名称 包名,34,35,运行第一个HelloAndroid,36,从HelloAndroid分析Android应用的要素,AndroidManifest.xml res-所有的资源 Drawable-图片文件 Layout-布局文件 Values-字符串以及属性定义文件 Src-代码目录,37,目录的组织,anim/ drawable/ layout/ values/ xml/ raw/,1)anim目录录下存放着描述animation类型的xml文件。 2) drawable目录该目录下存放着.png,.jpg等图片文件。 3)

15、layout目录下存放着屏幕UI的layout文件,格式为xml。 4)values目录下可以存放多种资源类型的xml文件,例如定义了数组的array.xml,定义了颜色的colors.xml,定义了dimension的dimnes.xml,定义了字符串的strings.xml,定义了style的styles.xml。 5)xml目录存放了用户自定义的xml文件。 6) raw目录可存放了用户的原始数据文件,如声音文件等,这些文件在编译应用程序过程中不被编译,直接加到apk文件中。,38,AAPT打包示意图,39,限定符的类型和有效的值,40,资源管理框架,41,Android应用的要素And

16、roidManifest,AndroidManifext的作用:描述了程序包的全局变量, 包括暴露的应用组件(activities, services等等) 和为每个组件的实现类, 什么样的数据可以操作, 以及在什么地方运行 ,42,AndroidManifest的主要元素,几乎所有的AndroidManifest.xml(以及许多其他Android的xml的文件) 在第一个元素中包含了命名空间的声明xmlns:android=“ http:/ 属性能在文件中使用,提供了大部分元素中的数据。 包名(package):指定本应用内java主程序包的包名。当没有指定apk的文件名 时,编译后产生程

17、序包将以此命名。本包名应当在Android系统运行时唯一。 application:application是Android应用内最高级别(top level)的模块,每个应用 内最多只能有一个application,如果应用没有指定该模块,一个默认的 application将被启用。application将在应用启动时最先被加载,并存活在应用 的整个运行时生命周期。因此一些初始化的工作适合在本模块完成. Application元素有许多属性,其中:“persistent”表示本应用是否为常驻内存, “enable”表示本应用当前是否应当被加载。,43,Android-activity,1.创建

18、activity XxxActivity extends Activity. 2.配置AndroidManifest.xml文件 launchMode: standard:每次启动新的活动窗口(new操作) singleTop:如果在栈顶是目标活动,则直接打开.否则开启新的活动窗口(new). singleTask:同一任务内不再实例化,不同任务需要实例化. singleInstance:不论是否是同一任务,只要打开就共享.,AndroidManifest的主要元素,activity:activity是application模块的运行时子元素,标识了一个UI。除了 application,一个

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

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

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

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

23、ity 被系统杀死回收或者没有被启动时处于 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 Mana

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

25、 任何用户界面 用来做什么: 实现不需要用户界面但是需要一直运行的功能,如:音乐播放器 怎么用: 实现一个自己的service 启动执行:context.startService()/context.bindService(),52,ContentProvider简介,ContentProvider是Android提供的一种标准的共享数据的机制, 应用程序可以通过content provider访问其它应用程序的一些私有数据 ContentProvider的优点:屏蔽了内部数据的存储细节,向外提供 了上述统一的接口模型,53,BroadcastReceiver简介,BroadcastRecei

26、ver的作用:每个Broadcast Receiver都可以接收 一种或若干种Intent作为触发事件 BroadcastReceiver不执行任何任务,仅仅是接受并响应广播 通知的一类组件。 BroadcastReceiver 不包含任何用户界面,54,基础UI,menu:如何打造友好的菜单 ListView:用好列表,做好程序 Dialog:人机友好互动交流 Toast和Notification:温馨的提醒,55,Android的菜单Menu,menu 负责管理MenuItem 添加一个menuItem add (int groupId, int itemId, int order, Ch

27、arSequence title) 删除所有的menuItem clear() MenuItem 一个菜单的条目 常用的方法: setTitle setIcon getItemId(),56,Android的菜单Menu,1.) 通过代码创建Menu public boolean onCreateOptionsMenu(Menu menu) / 分组id,Item的id,顺序,名字 menu.add(0, M_FBACK, 0, “反馈“) .setAlphabeticShortcut(F); menu.add(0, M_HELP, 1, “帮助“) .setAlphabeticShortcu

28、t(H) .setIcon(android.R.drawable.ic_menu_help); return true; ,57,Android的菜单Menu,2.) 通过xml创建Menu 在Android工程的res/目录下新增一个menu/子目录,然后建立option_menu.xml文件 onCreateOptionsMenu()方法里通过MenuInflater类引入定义好的菜单文件,58,option_menu.xml文件,option_menu.xml文件 ,59,public boolean onCreateOptionsMenu(Menu menu) MenuInflater

29、 inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); return true; ,60,61,Android 的对话框 Dialog,生成AlertDialog三步走 生成一个AlertDialog的构造者AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(context); 设置属性,包括标题、按钮和图标 builder.setIcon(); builder.setTitle(); builder.se

30、tPositiveButton(); builder.setNegativeButton(); 最后生成AlertDialog builder.create();,62,提醒 Toast,Toast是Android提供的轻量级的提醒机制 Toast永远不会获得聚焦不会打断用户当前的操作 信息在floating view呈现,然后会自动消失,63,如何创建Toast 1.)简单文字信息 通过make()方法创建Toast信息 调用show()方法来显示Toast提示信息 2.)复杂Toast信息 Toast支持通过setView(view)添加view组件,64,Android UI组件,65,

31、常用UI组件,66,自动文本和选择组件,67,日期和时间选择器,68,GirdView Gallery ImageSwitcher,69,RatingBar ProgressBar,70,Activity之间的跳转,Intent 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(PhoneNu

32、mberUtils.isGlobalPhoneNumber(t01.getText().toString() Intent t=new Intent(Intent.ACTION_CALL, Uri.parse(“tel:/“+t01.getText().toString(); CallTel.this.startActivity(t); else Toast.makeText(CallTel.this, “呼叫电话错误“, Toast.LENGTH_LONG).show(); ,82,83,Android 系统标准action,84,Intent 跟pendingIntent 间的联系,int

33、ent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。 PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent的。正由于pendinginte

34、nt中 保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent, 就算在执行时当前App已经不存在了,也能通过存在pendingintent里的Context照样执行Intent。另外还可以处理,85,Intent 跟pendingIntent 间的联系,intent执行后的操作。常和alermanger 和notificationmanager一起使用。 Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在

35、Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装。,86,BroadcastReceiver,BroadcastReceiver的作用 BroadcastReceiver的类别 BroadcastReceiver的工作流程,87,BroadcastReceiver 的作用,作用:接收由sendBroadcast()或者sendOrderedBroadcast发送的Intent,88,BroadcastReceiver的类别,sendBroadcast : 称为Normal broadcast,所有关注该消息的Receiver,都有

36、机会获得并进行处理 sendOrderedBroadcast 称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的只能吃前面吃剩下的,前面的心情不好私吞了,后面的只能喝西北风了(有可能拿不到)。,89,Android系统标准broadcast,90,Service,Service 的定义 如何使用service Service 的生命周期,91,Service 的定义,运行在后台 可以活在自己进程或者其他应用程序的上下文(context)里面 默认情况下仍然是活在主线程的,所以耗时操作要起线程来处理,92,如何使用service,通过Context.startSe

37、rvice()启动, ontext.stopService 结束: (1)生成-开始(onCreate-onStart) 过程 (2)Service停止的时候进入(onDestroy) 过程 (3)如果调用者退出不调用stopServie,服务还会活着,93,如何使用service,通过Context.bindService启动 (1)只运行onCreate,调用Context.unbindservice()结束 (2) 可以通过ServiceConnection访问Service (3)调用者退出,service则调用onUnbind (4)可以实现IPC,94,Service 的生命周期,

38、调用startService的生命周期为:onCreate onStart(可多次调用) onDestroy 调用bindService的生命周期为:onCreate onBind(只一次,不可多次绑定) onUnbind onDestory,95,Service 的生命周期,96,文件操作 Preferences SQLite库存储 网络 content provider,Android中的数据保存,97,文件操作,openFileInput openFileOutput 读取资源文件 getResource().openRawResource(R.raw.xxx),98,Preferenc

39、es,轻量级的 保存的是原始数据类型 常用于保存程序配置信息,SharedPreferences settings = getSharedPreferences(SETTING_INFOS, 0); String name = settings.getString(NAME, “); String password = settings.getString(PASSWORD, “);,99,过Context.getSharedPreferences()得到一个 SharedPreferences。 获取一个Editor,对保存的参数进行编辑: commit(),进行提交。 SharedPref

40、erences settings = getSharedPreferences(“info”, 0); Editor editor = settings.edit(); editor.putString(“name”, nameEditText.getText().toString() .putString(“pwd”, passwordEditText.getText().toString() .commit();,100,Android-使用嵌入式SQLite,Android平台上集成的一个嵌入式关系型数据库,SQLite3支持 NULL,INTEGER,REAL(浮点数字),TEXT(字

41、符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n),char(n),decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型. SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 但定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外 的数据时,将会产生错误.另外, SQLite在解析CREATE TABLE语句时,会忽略字段名后面的数据类型信息. SQLite可以解析大部分标准SQL语句,如: 查询语句:

42、select * from where group by having . order by 排序子句 SQLite分页同mysql相同: . limit 5 offset 3 | limit 3,5,101,Android-使用嵌入式SQLite,首次使用数据库需要创建表及初始化一些信息,升级时需要修改表信,android提供了抽象类SQLiteOpenHelper完成此类功能. onCreate(SQLiteDatabase db)方法用于首次使用时创建库, onUpgrade(SQLiteDatabase db, int oldVersion, int ewVersion)方法检测版本发

43、生变化时更新库. getWritableDatabase()和getReadableDatabase()方法均获取一个用于操作数据库的SQLiteDatabase实例. getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写.倘若使用getWritableDatabase()打开数据库就会出错.getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.,102,Android-使用嵌入式SQLite,public class Databa

44、seHelper 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(SQLiteDatabase db) db.execSQL(“CREATE TABLE IF NOT EXISTS person (personid i

45、nteger 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数据库 SQLiteDatabase db = ; db.execSQL(“insert into person(n

46、ame,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(); SQLiteDatabase db = databaseHelper.ge

47、tWritableDatabase(); 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 String“2“); db.close(); /更新 SQLit

48、eDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); /key为字段名,value为值 values.put(“name”, “亚嵌教育“); db.update(“person“,values,“personid=?“,new String“1“); db.close(); 注: 第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper 会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态, 所以在你不再需要SQLiteDatabase实例时,请及时调用close()方法释放资源.一旦 SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase() 方法得到的都是同一实例.,105,Android-单元测试, public class XMLTest extends AndroidTestCase public void testSomething() throws Throwabl

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1