• 1. Android开发简介
  • 2. 前言前言
  • 3. 前言 Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统。 该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。而且不存在任何以往阻碍移动产业创新的专有权障碍。
  • 4. 前言 系统级开发 利用源码定制Android系统,例如Ophone。 Native开发 使用NDK和C++语言开发高效,实时性强的应用。 应用层开发 使用SDK和Java(Simple)以及应用框架,可以完成应用的快速开发。 Widget开发 借助Html,JavaScript及Css等技术,快速开发基于浏览器,可用于Android的轻量级小应用
  • 5. Android开发环境Android开发环境
  • 6. Android开发环境Java Eclipse ADT(Android Development Toolkit) SDK
  • 7. Android体系结构Android体系结构
  • 8. Android体系结构
  • 9. Android体系结构程序库( Libraries) SGL - 底层的2D图形引擎 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 OpenGL ES - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。 FreeType -位图(bitmap)和矢量(vector)字体显示。 Webkit - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。 SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。 Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
  • 10. Android体系结构应用框架( Application Framework) XMPP Service -可扩展消息处理现场协议 LocationManager - 定位管理模块 ResourceManager - 资源管理模块 TelephonyManager - 电话及语音管理模块 PackageManager - 软件包(应用)管理模块 NotificationsManager - 通知管理模块 ViewSystem - 显示框架(包含显示控件及相关操作类) ContentProviders - 内容提供模块(应用间共享数据的桥梁) WindowManager - 窗体管理模块 ActivityManager - 活动管理模块(Android应用的调度者)
  • 11. Android体系结构应用程序( Application) Android还会发布一系列优秀的应用程序,例如email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。 Android独特的应用模型使其允许将已经发布的应用作为软件模块,重复使用。例如开发者可以直接调用上面提到的应用。同时,开发者也可以利用此模式,分享自身的API,允许其它软件调用。 对于运营商而言,可以借此嵌入自身的增值应用,同时开放其API,建立自己的软件生态圈。
  • 12. Android应用组件Android应用组件
  • 13. Android应用组件Android应用程序一般由以下四种组件构成: 活动(Activity) 服务(Service) 广播接收器(BroadcastReceiver) 内容提供器(ContentProvider) 此外,Intent作为Android独有的设计,用于各组件之间的消息传递,它被翻译为“意图”
  • 14. Android应用组件Activity是最基本的Andorid应用程序组件。 应用程序中,一个Activity通常是一个单独的屏幕。 Activity类将会显示由视图控件组成的用户接口,并对事件做出响应。 当打开新的Activity时,当前的Activity会压入堆栈,当新的Activity生命结束的时候,以前压入堆栈的Activity就会显示出来。Android系统自己来负责对Activity堆栈的管理和回收。
  • 15. Android应用组件
  • 16. Android应用组件广播接收器(BroadcastReceiver) 你可以使用BroadcastReceiver来让你的应用对一个外部的事件做出响应。 比如:当电话呼入时,数据网络可用时,或者到了晚上时。 服务( Services) 一个服务是具有一段较长生命周期且没有用户界面的程序。例如:一个正在从播放列表中播放歌曲的媒体播放器。 内容提供者( ContentProviders) 当需要将应用数据与其它的应用共享时,内容提供其将会很有用。一个内容提供者类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。
  • 17. 意图(Intent)简介意图(Intent)简介
  • 18. 意图(Intent)简介Intent(意图),是一个将要执行的动作的抽象的描述.一般是作为参数来使用,协助完成Android各个组件之间的通讯。 Intent不仅可用于Activity,也可用于Service,BroadcastReceiver,ContentProvider之间的交互。它是Android的一大特点,是模块或应用的粘合剂。
  • 19. 意图(Intent)简介Intent由六个部分组成: Action Data Category Extras Type Component
  • 20. 意图(Intent)简介Standard Activity Actions ACTION_MAIN ACTION_VIEW ACTION_ATTACH_DATA ACTION_EDIT ACTION_PICK ACTION_CHOOSER ACTION_GET_CONTENT ACTION_DIAL ACTION_CALL ACTION_SEND ACTION_SENDTO ACTION_ANSWER ACTION_INSERT ACTION_DELETE ACTION_RUN ACTION_SYNC ACTION_PICK_ACTIVITY ACTION_SEARCH ACTION_WEB_SEARCH ACTION_FACTORY_TEST
  • 21. 意图(Intent)简介Standard Broadcast Actions ACTION_TIME_TICK ACTION_TIME_CHANGED ACTION_TIMEZONE_CHANGED ACTION_BOOT_COMPLETED ACTION_PACKAGE_ADDED ACTION_PACKAGE_CHANGED ACTION_PACKAGE_REMOVED ACTION_PACKAGE_RESTARTED ACTION_PACKAGE_DATA_CLEARED ACTION_UID_REMOVED ACTION_BATTERY_CHANGED ACTION_POWER_CONNECTED ACTION_POWER_DISCONNECTED ACTION_SHUTDOWN
  • 22. 意图(Intent)简介Standard Extra Data EXTRA_ALARM_COUNT EXTRA_BCC EXTRA_CC EXTRA_CHANGED_COMPONENT_NAME EXTRA_DATA_REMOVED EXTRA_DOCK_STATE EXTRA_DOCK_STATE_CAR EXTRA_DOCK_STATE_DESK EXTRA_DOCK_STATE_UNDOCKED EXTRA_DONT_KILL_APP EXTRA_EMAIL EXTRA_INITIAL_INTENTS EXTRA_INTENT EXTRA_KEY_EVENT EXTRA_PHONE_NUMBER EXTRA_REMOTE_INTENT_TOKEN EXTRA_REPLACING EXTRA_SHORTCUT_ICON EXTRA_SHORTCUT_ICON_RESOURCE EXTRA_SHORTCUT_INTENT EXTRA_STREAM EXTRA_SHORTCUT_NAME EXTRA_SUBJECT EXTRA_TEMPLATE EXTRA_TEXT EXTRA_TITLE EXTRA_UID
  • 23. 意图(Intent)简介显式调用: 指定了一个明确的组件(setComponent或setClass)来使用处理Intent。 Intent intent = new Intent(getApplicationContext(), IntentTest.class); startActivity(intent); 别忘了被启动的Activity需要在AndroidManifest.xml中进行定义。
  • 24. 意图(Intent)简介隐式调用(不明确的意图) 没有制定明确的组件来处理该Intent,但它包含足够的信息,可以让系统确定最合适处理这个Intent的组件。 使用这种方式时,需要让Intent与应用中的IntentFilter描述表相匹配。更多细节可浏览IntentFilter类的文档。 Intent intent = new Intent(); intent.setAction("otheri.test.intent.IntentTest"); startActivity(intent);
  • 25. 意图(Intent)简介回传参数 Intent常用于系统组件之间传递消息,同时,也可以使用它来回传参数给之前的Activity。前提是实现Activity的onActivityResult方法。 A: startActivityForResult(intent, RESULT_OK); 。。。。。。 protected void onActivityResult(int requestCode, int resultCode, Intent data) { Bundle bundle = data.getExtras(); String ret = bundle.getString("ret"); } B: Intent data = new Intent(); data.putExtra("ret", "return from IntentTest"); setResut(RESULT_OK, data );
  • 26. 意图(Intent)简介Intent的使用者,需要在AndroidManifest.xml中进行定义 Activity使用Intent时,category一般都需要支持android.intent.category.DEFAULT (详情见参考用例)
  • 27. Android的UI框架Android的UI框架
  • 28. Android的UI框架View view是存储屏幕上的特定的矩形区域的内容的输出. 一个view对象处理屏幕上的测量和输出,绘图,聚焦改变,状态栏,键盘的输入输出等. Viewgroup Viewgroup是一个特殊的view对象,它的功能是包含和管理了一组。它可以用于创建复杂的屏幕元素。
  • 29. Android的UI框架常用布局: AbsoluteLayout 绝对坐标布局 - 使用绝对坐标来指定控件的显示位置。不推荐使用这种布局,因为它无法自动适应屏幕尺寸,不利于软件适配。 FrameLayout 分层布局 – 控件以(0,0)点作为参考点依次显示,控件之间会产生遮盖。 LinearLayout 线性布局 – 控件按顺序从左到右或从上到下依次排列 RelativeLayout 相对布局 – 按照控件之间所指定的相对位置参数来自动对控件进行排列。实际开发中,比较推荐使用这种布局。
  • 30. Android的UI框架第三方UI设计工具: Visio DroidDraw (详情见演示)
  • 31. Android的UI框架常用控件介绍: (详情见APIDemo及演示)
  • 32. 资源的使用资源的使用
  • 33. 资源的使用 资源(Res)是引入应用程序的一些外部元素。如图片、字符串、布局、主题等。 Android项目的资源可以通过R类访问。R类是自动生成的,不能手动编辑。当资源更新时,它会根据需要重新产生。 资源从源代码中被抽取出来,被编译成二进制、可以快速加载的形式。
  • 34. 资源的使用可以通过如下操作创建Res: File->New->Android->Android XML File Res可分为以下几种类型: anim drawable layout , menu values xml raw
  • 35. 资源的使用 可以根据产品语言,硬件,设置不同的资源。Android会检测并选择合适的资源 去加载。
  • 36. 资源的使用 Resources and Internationalization android-sdk-Windows/docs/guide/topics/resources/resources-i18n.html Available Resource Types android-sdk-windows/docs/guide/topics/resources/available-resources.html Localization android-sdk-windows/docs/guide/topics/resources/localization.html
  • 37. 数据的存储数据的存储
  • 38. 数据的存储Andoid存储方式: SharedPreferences File SQLite
  • 39. 数据的存储SharedPreferences是一个用来存放和提取元数据类型,键-值对的轻量级存储机制。 通过调用Context.getSharedPreferences(),可以获取一个可共享的SharedPreferences。也可以使用Activity.getPreferences()来获取一个私有的SharedPreferences。 编辑内容时需使用SharedPreferences.Editor
  • 40. 数据的存储使用SharePreferences: // 读取数据 SharedPreferences settings = getSharedPreferences(SETTING_INFOS, Context.MODE_PRIVATE); String name = settings.getString(NAME, ""); String password = settings.getString(PASSWORD, ""); // 编辑并提交数据 SharedPreferences settings = getSharedPreferences(SETTING_INFOS, 0); settings.edit().putString(NAME, field_name.getText().toString()) .putString(PASSWORD, filed_pass.getText().toString()).commit();
  • 41. 数据的存储Android可以直接使用Java的文件操作类。FileInputStream和FileOutputStream。 读取文件可调用Context.openFileInput()方法并返回标准的FileInputStream 。 写文件可调用Context.openFileOutput()并返回FileOutputStream。 从其它的应用程序中调用这些方法将不起作用,只能访问本地文件。 可直接读取sd卡的文件 (如:/sdcard/android.txt)
  • 42. 数据的存储SQLite是轻量级的、嵌入式的、关系型数据库。Android API包含对创建和使用SQLite数据库的支持。 每个数据库都是创建它的应用程序所私有的。 SQLite4大基本操作:添加(insert)、删除(delete)、查询(query)、修改(update)。 Android使用记录游标Cursor类来操作记录集。
  • 43. 绘图框架摘要绘图框架摘要
  • 44. 绘图框架摘要android.graphics包: View/SurfaceView Android中可用于进行基本2D绘图的控件,重载onDraw方法即可。 Canvas 包含基本的绘画操作,如绘线条,绘矩形,绘图,绘文字等.同时还具有控制缩放,旋转,透明度等高级方法。 Paint 可用于控制绘制的色彩,风格,样式等。
  • 45. 绘图框架摘要android.graphics.drawable包: Android提供了一系列可绘画的类,它们是对开发过程中所用到的可绘画的对象的包装。 这些包装类有助于开发者将低层绘制操作,用面向对象的方式来表达。(例如:使用现有的动画框架控制低层绘画)
  • 46. 绘图框架摘要
  • 47. 绘图框架摘要
  • 48. 绘图框架摘要3D with OpenGL: 3D图形主要使用OpenGL接口,通过继承 GLSurfaceView和调用OpenGL接口来实现3D的图形的功能(GLSurfaceView本身继承了SurfaceView)。 建议使用第三方开源3D引擎.
  • 49. WebKit及WebViewWebKit及WebView
  • 50. WebKit及WebViewAndroid应用层可以通过WebView来创建一个可以显示Web内容的控件。 WebKit常用到的类有:WebView,WebViewClient, CacheManager, CookieManager
  • 51. WebKit及WebView小技巧: 可以使用WebView做应用的快速开发。首先使用html和css制作适合手机的静态页面。然后可利用JavaScript技术与程序中的Java代码互相调用。最后从本地读取这些html页面进行显示即可。
  • 52. WebKit及WebView
  • 53. WebKit及WebViewpublic class WebViewer extends WebView { public static final String SYS_CMD_QUIT = "quit"; public static final String SYS_CMD_BACK = "back"; private WebActivity webActivity; private WebViewer instance; public WebViewer(final WebActivity webActivity) { super(webActivity); this.webActivity = webActivity; instance = this; this.getSettings().setJavaScriptEnabled(true); this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
  • 54. WebKit及WebViewsetWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } public boolean shouldOverrideUrlLoading(WebView view, final String url) { if (url.indexOf(AnimHelp.PROTOCOL_ANIM) == 0) { AnimHelp.instance.playDemo(webActivity, url); return true; } else if (url.indexOf(AnimHelp.PROTOCOL_SYS) == 0) { // 系统命令 String cmdName = url.substring(AnimHelp.PROTOCOL_SYS .length(), url.length()); if (cmdName.equals(SYS_CMD_QUIT)) { webActivity.finish(); } else if (cmdName.equals(SYS_CMD_BACK)) { back(); } return true; } return false; } }); }
  • 55. 联网框架摘要联网框架摘要
  • 56. 联网框架java.net包 HttpUrlConnenction,Proxy org.apache.http包 HttpEntity, HttpRequest, HttpResponse, HttpStatus, HttpConnection (CTWAP连接时需要注意端口号的设定方法)
  • 57. 联网框架public class CTWAP { private HttpHost proxy; private HttpClient httpClient; private static final boolean DEBUG = false; public CTWAP() { if (DEBUG) { httpClient = new DefaultHttpClient(); } else { proxy = new HttpHost("10.0.0.200", 80); httpClient = new DefaultHttpClient(); httpClient.getParams().setParameter(ConnRoutePNames. DEFAULT_PROXY,proxy); } httpClient.getParams().setParameter("User-Agent", "XT800"); }
  • 58. 联网框架public HttpResponse get(String url) throws Exception { if (DEBUG) { HttpGet httpGet = new HttpGet(url); return httpClient.execute(httpGet); } else { HttpGet httpGet = new HttpGet(url); return httpClient.execute(proxy, httpGet); } } public HttpResponse post(String url, HttpEntity entity) throws Exception { if (DEBUG) { HttpPost httpPost = new HttpPost(url); httpPost.setEntity(entity); return httpClient.execute(httpPost); } else { HttpPost httpPost = new HttpPost(url); httpPost.setEntity(entity); return httpClient.execute(proxy, httpPost); }
  • 59. XML类库简介XML类库简介
  • 60. XML类库简介Android内置了丰富的XML类库: DOM org.w3c.dom SAX org.xml.sax Xmlpull org.xmlpull.v1 (xmlpull及dom都存在一些小bug,建议使用第三方xml类库,或者用其它类库替代XML)
  • 61. XML类库简介Hessian http://hessian.caucho.com/ Protobuf http://code.google.com/p/protobuf/ ICE http://www.zeroc.com/ice.html AMF http://en.wikipedia.org/wiki/Action_Message_Format
  • 62. 其它功能包介绍其它功能包介绍
  • 63. 其它功能包介绍Media Android带有丰富的多媒体功能,flv正在支持中。 Location 智能手机最火热的功能之一,但国内由于Provider的关系,个人开发者难以获得支持。Google Map可以实现定位。 Bluetooth 蓝牙将成为智能手机与其它设备互联的首选方案。 Speech Android最新的版本中内置了TTS引擎,可以轻松实现文本到声音的转换,但是,中文支持还需要国内厂商的进一步努力。 Wifi wifi是手机联网的最佳接入方案之一,在国内虽然受到限制,但相信很快也会出现WAPI的替代方案。
  • 64. 其它功能包介绍//从SD卡播放一个多媒体文件 Uri uri = Uri.parse("file:///sdcard/test_cbr.mp3"); Intent it = new Intent(Intent.ACTION_VIEW, uri); it.setDataAndType(uri, "audio/mp3"); startActivity(it);
  • 65. 其它功能包介绍//定位(国内暂时找不到合适的Provider) Location loc; LocationManager locMan; LocationProvider locPro; List providerNames; // 获取LocationManager locMan = (LocationManager) getSystemService(LOCATION_SERVICE); // 得到可用的provider名称 providerNames = locMan.getProviders(true); if (providerNames.size() > 0) { // 注册一个周期性的位置更新事件 locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) 2.1000, (float) 0, this); // 得到名称对应的provider locPro = locMan.getProvider(providerNames.get(0)); loc = locMan.getLastKnownLocation(locPro.getName()); float latitude = (float) loc.getLatitude(); float Longitude = (float) loc.getLongitude(); float altitude = (float) loc.getAltitude(); textView.append("维度=" + latitude); textView.append("经度=" + Longitude); textView.append("海拔=" + altitude); } else { textView.append("无法找到合适的GPS服务提供商"); } }
  • 66. 其它功能包介绍//Wifi的控制 WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); msg = (TextView) findViewById(R.id.msg); updateMsg(); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(false); } else { wifiManager.setWifiEnabled(true); } try { Thread.sleep(4000); updateMsg(); } catch (Exception e) { // ignore } } });
  • 67. 问答与讨论问答与讨论
  • 68. 谢 谢 !