Android应用开发简介_第1页
Android应用开发简介_第2页
Android应用开发简介_第3页
Android应用开发简介_第4页
Android应用开发简介_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android应用开发2010年8月13日Android平台架构Android环境配置和开发Android应用程序构成如何开发一个例子目录Android平台架构JNIJAVAC/汇编简介Linux核心:Android依赖Linux2.6来提供核心的效劳,例如存储管理、进程(Process)管理等AndroidRuntime:Java语言层级的VirtualMachineLibraries:Android里已经提供的C/C++组件。例如,SQLite、OpenGL3D等。应用框架(ApplicationFramework,):这是结合Applications和Libraries的主架构,让Libraries組件能不断地为Applications所重复使用应用程序(Applications):根据用户的期望而将AF的组件及Libraries组件组合而成的效劳。用汉堡比喻Android平台架构Android环境配置和开发Android平台架构Android应用程序构成如何开发一个例子目录如何安装AndroidSDK和Eclipse插件所需开发环境:JDK5或JDK6(仅有JRE不够)Eclipse3.5(galileo)下载ADT的Eclipse插件://dl.google安装Eclipse插件(ADT)启动Eclipse,选择Help>InstallNewSoftware,在出现的对话框里,点击Add按钮,在对话框的name一栏输入“ADT”,然后点击Archive...,浏览和选择已经下载的ADT插件压缩文件。点击OK.。返回可用软件的视图,你会看到这个插件,然后选择DeveloperTools(会选中下面的“AndroidDeveloperTools”和“AndroidEditors“),点击Next,最后重启Eclipse。下载AndroidSDK:://dl.google/android/android-sdk_r04-windows.zip下载完SDK后,把.zip文件解压到你电脑上适宜位置。启动Eclipse,选择window->preferences,在翻开的视图左边点击android,在右边的SDKLocation中选择AndroidSDK所在位置。开发第一个Android应用

翻开Eclipse,新建工程(点击FileNewProject),在工程列表中展开Android目录,选择AndroidProject,如以下图:开发第一个Android应用开发第一个Android应用点击”finish”即可完成工程的创立,创立后的工程已经是一个可运行的Android应用,我们可以通过下面方式运行此应用:点击工具栏上形状的虚拟设备管理器〔简称“AVD“〕,如下:开发第一个Android应用在翻开的虚拟设备管理器中创立一个虚拟:开发第一个Android应用在工程上右键点击runasAndroidapplication,如以下图:Android应用程序架构src/java原代码存放目录gen/自动生成目录gen目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的xml界面文件、图标与常量,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应防止手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在占用的空间。res/资源(Resource)目录在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。AndroidManifest.xml功能清单文件这个文件列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的效劳(如效劳、互联网效劳、短信效劳、GPS效劳等等)。另外当你新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activity。perties工程环境信息,一般是不需要修改此文件目录Android环境配置和开发Android平台架构Android应用程序构成如何开发一个例子Android应用程序构成ActivityServiceBroadcastReceiverContentProviderIntentActivityAvisualuserinterface通过view管理UI每一个有用户界面的应用至少包含一个activity一个应用可以有多个activity,其中一个作为mainactivity用于启动显示Activity通过startActivity或startActivityForResult启动另外的activityActivity生命周期Activity通过onCreate被创立当一个activity失去焦点,该activity将进入pause状态,系统在内存缺乏时会将其终止当一个activity被另一个activity覆盖,该activity将进入stop状态,系统在需要内存的时候会将其终止Intent类似于消息、事件通知Intent构成:action、category、dataActivity、Service、broadcastreceiver之间的桥梁IntentactivityserviceBroadcastreceiverIntent两类intent:显式:指定具体的目标组件处理startActivity(newIntent(ActivityLifecycle.this,AnotherActivity.class));隐式:由系统接受并决定如何处理startActivity(newIntent(Intent.ACTION_DIAL));在AndroidManifest.xml中定义activity、service、broadcastreceiver接受的intentIntentIntentfilter:action、category、dataframeworkComponentnameActionDataCategoryintentcomponentactivityserviceBroadcastreceiver实例action--DIALdata--tel:01038639592action--VIEWdata--://googleService没有UI,启动之后一直运行于后台例子:音乐播放器与应用程序的其他模块〔例如activity〕一同运行于主线程中通过startService或bindService创立Service通过stopService或stopSelf终止Service一般的,在activity中启动和终止serviceService生命周期Context.stopService()Serivce.stopSelf()Context.startService()Context.bindService()效劳--ServiceAndroid中的效劳和windows中的效劳是类似的东西,效劳一般没有用户操作界面,它运行于系统中不容易被用户觉察,可以使用它开发如监控之类的程序。效劳的开发比较简单,如下:第一步:继承Service类publicclassSMSServiceextendsService{}效劳--Service第二步:在AndroidManifest.xml文件中的<application>节点里对效劳进行配置:<serviceandroid:name=".SMSService"/>效劳不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动效劳。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用效劳,调用者与效劳之间没有关连,即使调用者退出了,效劳仍然运行。使用bindService()方法启用效劳,调用者与效劳绑定在了一起,调用者一旦退出,效劳也就终止。如果打算采用Context.startService()方法启动效劳,在效劳未被创立时,系统会先调用效劳的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前效劳已经被创立,屡次调用startService()方法并不会导致屡次创立效劳,。采用startService()方法启动的效劳,只能调用Context.stopService()方法结束效劳,效劳结束时会调用onDestroy()方法。效劳--Service如果打算采用Context.bindService()方法启动效劳,在效劳未被创立时,系统会先调用效劳的onCreate()方法,接着调用onBind()方法。这个时候调用者和效劳绑定在一起,调用者退出了,系统就会先调用效劳的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前效劳已经被绑定,屡次调用bindService()方法并不会导致屡次创立效劳及绑定(也就是说onCreate()和onBind()方法并不会被屡次调用)。如果调用者希望与正在绑定的效劳解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用效劳的onUnbind()-->onDestroy()方法。效劳--Service效劳常用生命周期回调方法如下:onCreate()该方法在效劳被创立时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,效劳也只被创立一次。onDestroy()该方法在效劳被终止时调用。与采用Context.startService()方法启动效劳有关的生命周期方法onStart()只有采用Context.startService()方法启动效劳时才会回调该方法。该方法在效劳开始运行时被调用。屡次调用startService()方法尽管不会屡次创立效劳,但onStart()方法会被屡次调用。与采用Context.bindService()方法启动效劳有关的生命周期方法onBind()只有采用Context.bindService()方法启动效劳时才会回调该方法。该方法在调用者与效劳绑定时被调用,当调用者与效劳已经绑定,屡次调用Context.bindService()方法并不会导致该方法被屡次调用。onUnbind()只有采用Context.bindService()方法启动效劳时才会回调该方法。该方法在调用者与效劳解除绑定时被调用。采用startService()启动效劳采用Context.startService()方法启动效劳的代码如下:publicclassHelloActivityextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){......Buttonbutton=(Button)this.findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener(){ publicvoidonClick(Viewv){ Intentintent=newIntent(HelloActivity.this,SMSService.class); startService(intent); }});}}采用bindService()启动效劳采用Context.startService()方法启动效劳的代码如下:publicclassHelloActivityextendsActivity{ServiceConnectionconn=newServiceConnection(){ publicvoidonServiceConnected(ComponentNamename,IBinderservice){ } publicvoidonServiceDisconnected(ComponentNamename){ }};@OverridepublicvoidonCreate(BundlesavedInstanceState){Buttonbutton=(Button)this.findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener(){ publicvoidonClick(Viewv){ Intentintent=newIntent(HelloActivity.this,SMSService.class); bindService(intent,conn,Context.BIND_AUTO_CREATE); //unbindService(conn);//解除绑定 }});}}何为Contentprovider什么是Contentprovider?ContentProvider是Android应用程序的四大组成局部之一是android中的跨应用访问数据机制为何需要contentprovider?Android中每一个app的资源是私有的app通过contentprovider和其他app共享私有数据如何使用contentprovider通过contentresolver访问Context.getContentResolver()appContentResolverContentProviderAContentProviderBContentResolverContentResolverappapp如何使用contentproviderURI定位资源content://contacts/people类似关系数据库的访问方式以二维数据表的格式暴露数据,缺省都包含_id字段delete(Uri

url,

Stringwhere,

String[]

selectionArgs)insert(Uri

url,

ContentValues

values)query(Uri

uri,

String[]

projection,

String

selection,

String[]

selectionArgs,

String

sortOrder)update(Uri

uri,

ContentValues

values,

String

where,

String[]

selectionArgs)定义自己的contentproviderAndroid的存储一般的,应用程序的数据〔包括文件〕都是私有的四种持久存储方式Preferences——类似properties,xml文件FilesDatabase——SQLiteNetworkBroadcastreceiver接收和处理android的播送消息Android的播送机制系统事件——例如变换时区、电量低等应用程序发出播送消息:sendBroadCast播送消息:intentandroidappBroadcastreceiverSendbroadcast创立BroadcastReceiver实现一个BroadcastReceiverpublicclassMyAndroidReceiverextendsBroadcastReceiveroverrideonReceive(Contextcontext,IntentsIntents)注册BroadcastReceiver在AndroidManifest.xml文件当中进行注册在代码当中直接进行注册<receiverAndroid:name=“MyAndroidReceiver"><Intents-filter><actionAndroid:name=”com.eoeAndroid.action.NEW_BROADCAST”/></Intents-filter></receiver>IntentsFilterfilter=newIntentsFilter(NEW_BROADCAST);MyAndroidReceiverMyAndroidReceiver=newMyAndroidReceiver();registerReceiver(MyAndroidReceiver,filter);Broadcastreceiver生命周期Broadcastreceiver对象在onReceive返回后被销毁onReceive中不适合处理异步过程。例如弹出对话框与用户交互,可使用消息栏替代。Android权限控制在AndroidManifest.xml中描述一个app的权限例如:<manifestxmlnsapk/res/android"package="com.android.app.myapp"><uses-permissionandroid:name="android.permission.RECEIVE_SMS"/></manifest>权限举例(参考android.Manifest.permission)

权限名称权限描述接收短信android.permission.RECEIVE_SMS拨打电话android.permission.CALL_PHONE系统启动完毕通知android.permission.RECEIVE_BOOT_COMPLETED读取联系人信息android.permission.READ_CONTACTS修改联系人信息android.permission.WRITE_CONTACTS目录Android环境配置和开发Android平台架构Android应用程序构成如何开发一个例子从Internet获取数据利用HttpURLConnection对象,我们可以从网络中获取网页数据.URLurl=newURL("://sina");HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(6*1000);//设置连接超时if(conn.getResponseCode()!=200)thrownewRuntimeException("请求url失败");InputStreamis=conn.getInputStream();//得到网络返回的输入流Stringresult=readData(is,"GBK");conn.disconnect();System.out.println(result);//第一个参数为输入流,第二个参数为字符集编码publicstaticStringreadData(InputStreaminSream,StringcharsetName)throwsException{ ByteArrayOutputStreamoutStream=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intlen=-1; while((len=inSream.read(buffer))!=-1){ outStream.write(buffer,0,len); } byte[]data=outStream.toByteArray(); outStream.close(); inSream.close(); returnnewString(data,charsetName);}从Internet获取数据利用HttpURLConnection对象,我们可以从网络中获取文件数据.URLurl=newURL("://sinaapp/Img269812337.jpg");HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(6*1000);if(conn.getResponseCode()!=200)thrownewRuntimeException("请求url失败");InputStreamis=conn.getInputStream();readAsFile(is,"Img269812337.jpg");publicstaticvoidreadAsFile(InputStreaminSream,Filefile)throwsException{ FileOutputStreamoutStream=newFileOutputStream(file); byte[]buffer=newbyte[1024]; intlen=-1; while((len=inSream.read(buffer))!=-1){ outStream.write(buffer,0,len); } outStream.close(); inSream.close();}向Internet发送请求参数利用HttpURLConnection对象,我们可以向网络发送请求参数.StringrequestUrl="://localhost:8080/itcast/contanctmanage.do";Map<String,String>requestParams=newHashMap<String,String>();requestParams.put("age","12");requestParams.put("name","中国");StringBuilderparams=newStringBuilder();for(Map.Entry<String,String>entry:requestParams.entrySet()){ params.append(entry.getKey()); params.append("="); params.append(URLEncoder.encode(entry.getValue(),"UTF-8")); params.append("&");}if(params.length()>0)params.deleteCharAt(params.length()-1);byte[]data=params.toString().getBytes();URLrealUrl=newURL(requestUrl);HttpURLConnectionconn=(HttpURLConnection)realUrl.openConnection();向Internet发送请求参数conn.setDoOutput(true);//发送POST请求必须设置允许输出conn.setUseCaches(false);//不使用Cacheconn.setRequestMethod("POST"); conn.setRequestProperty("Connection","Keep-Alive");//维持长连接conn.setRequestProperty("Charset","UTF-8");conn.setRequestProperty("Content-Length",String.valueOf(data.length));conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");DataOutputStreamoutStream=newDataOutputStream(conn.getOutputStream());outStream.write(data);outStream.flush();if(conn.getResponseCode()==200){Stringresult=readAsString(conn.getInputStream(),"UTF-8");outStream.close();System.out.println(result);}=向Internet发送xml数据利用HttpURLConnection对象,我们可以向网络发送xml数据.StringBuilderxml=newStringBuilder();xml.append("<?xmlversion=\"1.0\"encoding=\"utf-8\"?>");xml.append("<M1V=10000>");xml.append("<UI=1D=\"N73\">中国</U>");xml.append("</M1>");byt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论