您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 高焕堂android讲义
整理:onelong主页:高焕堂讲义之一:Intent-basedProgrammingAndroid的4种嫡系组件(即Activity、Service、IntentReceiver和ContentProvider)之间如何互相沟通呢?这4种嫡系组件都是由Android启动的,并不是组件之间透过直接呼叫而启动的。就像我们打手机去车行叫出租车,而不是直接到街道上叫车。我们送给行一个简讯一通电话,表明我们的「意图」(Intent),当车行经理接到此意图,就依据你的意图的内含条件而去挑选最合适的出租车,然后派遣它去接你。「意图」(Intent)本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作、与动作有关的数据等。Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将Intent对象传递给所找到的组件,Android的媒婆任务就完成了。因此,Intent对象扮演着媒体中介的角色,提供「Client组件àAndroidàServer组件」之间互相沟通的相关信息,实现了Client组件与Server组件之间『不知而亦能用』之效果,这又称为疏结合(Loosely-coupled)效果。其创造了Server组件抽换的自由度,这又称为PnP(PlugandPlay)。兹以下图为例,Activity主要是提供UI画面来与User进行互动,两个Activity之间的直接互动较少。其它如ContentProvider则常是为Activity等提供服务的。所以Activity发出Intent对象委托Android挑选到适当的ContentProvider对象(并且将Intent对象传递给ContentProvider对象)之后,通常会透过ContentProvider接口而呼叫ContentProvider的各项服务或功能。在此图所示的范例里,当我们在一个订单列表画面(如Activity-1),点选某个订单之后,希望能够呈现出此订单的采购细项画面(如Activity-2)。此时,Activity-1需要发出一个Intent对象,这个Intent对象说明了意图:包括“查找”(Get)动作、订单ID等数据,然后呼叫Activity父类别的startActivity(Intentintent)函数,将此Intent对象传送给Android。而Android会根据此Intent对象中的叙述,与AndroidManifest.xml所叙述的各嫡系类别之条件相比较,找出与此Intent叙述相配的组件(如Activity-2),然后Android将该Intent对象递交给它,于是Activity-2会根据此Intent对象之叙述而执行相应的动作。高焕堂讲义之二:ContentProvider范例1.何谓Android的嫡系组件Android有4项一等公民(或称为嫡系亲属),包括:Activity、ContentProvider、IntentReceiver与Service。它们都必须宣告于AndroidManifest.xml档案里,如下:复制到剪贴板XML/HTML代码1.?xmlversion=1.0encoding=utf-8?2.manifestxmlns:android==com.misoo.SQ034.uses-permissionxmlns:android=:name=android.permission.INTERNET6./uses-permission7.applicationandroid:icon=@drawable/iconandroid:label=@string/app_name8.providerandroid:name=DataProvider9.android:authorities=com.misoo.provider.SQ0310./provider11.activityandroid:name=.ac01android:label=@string/app_name12.intent-filter13.actionandroid:name=android.intent.action.MAIN/14.categoryandroid:name=android.intent.category.LAUNCHER/15./intent-filter16./activity17.activityandroid:name=.DispActivityandroid:label=DispActivity18./activity19./application20./manifest这让Android知道我们城市里定义了多少个嫡系组件类别;Android可以在启动时就将它们执行起来,成为共享的(Shared)服务组件。这些嫡系服务组件间的沟通,通常是透过「意图」(Intent)对象来请Android转达给对方,Android则会依据意图而找出最佳的配对。配对成功,就展开相互的沟通与服务了。编辑本段回目录2.什么是ContentProvider嫡系组件----以SQLite为例在Android里,SQLite数据库是最典型的ContentProvider,负责储存各式各样的内容。除了数据库之外,还有许多其它种类的ContentProvider。在这里并不是要介绍这些ContentProvider,而是要透过SQLite认识ContentProvider接口,然后将舶来Linter组件,配上这种ContentProvider接口,让它摇身一变成为Android的嫡系组件。2.1一般(即非嫡系)SQLite的范例没有透过ContentProvider接口来使用SQLite,就是对SQLite的「非嫡系」用法。此时,应用程序透过JDBC接口和SQL语句来与SQLite沟通,以存取数据库里的内容。先认识这种传统用法。此范例将从SQLite读取数据。首先建立一个程序项目,其含有两个Java程序文件:ac01.java和DataProvider.java。其中,ac01.java是典型的Activity类别,负责UI画面的显示工作,而DataProvider则负责与SQLite沟通。其详细程序代码为:/*-----ac01.java程序代码------*/复制到剪贴板Java代码1.packagecom.misoo.pklx;2.importjava.util.ArrayList;3.importjava.util.HashMap;4.importjava.util.Map;5.importandroid.app.ListActivity;6.importandroid.database.Cursor;7.importandroid.os.Bundle;8.importandroid.view.View;9.importandroid.widget.ListView;10.importandroid.widget.SimpleAdapter;11.12.publicclassac01extendsListActivity{13.privatestaticfinalString[]PROJECTION=newString[]{stud_no,stud_name};14.15.@OverrideprotectedvoidonCreate(BundlesavedInstanceState){16.super.onCreate(savedInstanceState);17.DataProviderdp=newDataProvider(this);18.Cursorcur=dp.query(PROJECTION,null,null,null);19.ArrayListMapString,Objectcoll20.=newArrayListMapString,Object();21.MapString,Objectitem;22.cur.moveToFirst();23.while(!cur.isAfterLast()){24.item=newHashMapString,Object();25.item.put(c1,cur.getString(0)+,+cur.getString(1));26.coll.add(item);27.cur.moveToNext();28.}29.dp.close();30.this.setListAdapter(newSimpleAdapter(this,coll,31.android.R.layout.simple_list_item_1,newString[]{c1},32.newint[]{android.R.id.text1}));33.}34.@Override35.protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){36.finish();37.}}指令:DataProviderdp=newDataProvider(this);这和一般类别之用法是一样的。ac01对象指名要诞生一个DataProvider的物件。然后呼叫它,如下指令:Cursorcur=dp.query(PROJECTION,null,null,null);这要求SQLite从数据库查询出某些数据。详细的DataProvider.java程序代码如下:/*-----DataProvider.java程序代码------*/Java代码1.packagecom.misoo.pklx;2.importandroid.content.Context;3.importandroid.database.Cursor;4.importandroid.database.SQLException;5.importandroid.database.sqlite.SQLiteDatabase;6.importandroid.util.Log;7.8.publicclassDataProvider{9.privatestaticfinalStringDATABASE_NAME=StudDB;10.privatestaticfinalStringTABLE_NAME=Student;11.privatefinalintDB_MODE=Context.MODE_PRIVATE;12.privateSQLiteDatabasedb=null;13.14.publicDataProvider(Contextctx){15.try{db=ctx.openOrCreateDatabase(DATABASE_NAME,DB_MODE,null);}16.catch(Exceptione){Log.e(ERROR,e.toString());return;}17.18.try{db.execSQL(droptable+TABLE_NAME);}19.catch(Exceptione){Log.e(ERROR,e.toString());}20.21.db.execSQL(CREATETABLE+TABLE_NAME+(+stud_no+TEXT,22.+stud_name+TEXT+););23.Stringsql_1=insertinto+TABLE_NAME+24.(stud_no,stud_name)values('S101','Lily');;25.Stringsql
本文标题:高焕堂android讲义
链接地址:https://www.777doc.com/doc-4461006 .html