版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
智能手機開發(fā)教案周次第周,第次課授課時間20年月日/星期授課時數(shù)5章節(jié)名稱第1章Android開發(fā)環(huán)境授課方式課堂講授();實驗課();多媒體教學(xué)(√);網(wǎng)絡(luò)教學(xué)();雙語()教學(xué)目的1.了解Android系統(tǒng)的發(fā)展和特點;2.熟悉Android系統(tǒng)的平臺架構(gòu);3.掌握Android應(yīng)用程序開發(fā)環(huán)境的搭建。教學(xué)重點Android應(yīng)用程序開發(fā)環(huán)境的搭建教學(xué)難點Android系統(tǒng)架構(gòu)的組成教學(xué)方法講授+實驗教學(xué)環(huán)境J115教學(xué)用具多媒體教學(xué)設(shè)備教學(xué)過程及內(nèi)容備注1.1Android的發(fā)展和簡介Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機和平板電腦,由Google公司和開放手機聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。尚未有統(tǒng)一中文名稱,中國大陸地區(qū)較多人使用“安卓”或“安致”。Android操作系統(tǒng)最初由AndyRubin開發(fā),主要支持手機。2005年8月由Google收購注資。2007年11月,Google與84家硬件制造商、軟件開發(fā)商及電信營運商組建開放手機聯(lián)盟共同研發(fā)改良Android系統(tǒng)。隨后Google以Apache開源許可證的授權(quán)方式,發(fā)布了Android的源代碼。第一部Android智能手機發(fā)布于2008年10月。1.2Android平臺架構(gòu)與特性1.2.1Android平臺架構(gòu)Android平臺采用了軟件堆層的架構(gòu),從高層到低層分別是應(yīng)用層,應(yīng)用框架層,系統(tǒng)運行庫層和Linux內(nèi)核層。(1)Linux內(nèi)核硬件和其他軟件堆層之間的一個抽象隔離層,提供安全機制、內(nèi)存管理、進程管理、網(wǎng)絡(luò)協(xié)議堆棧、和驅(qū)動程序等(2)中間件層由函數(shù)庫和Android運行時構(gòu)成,函數(shù)庫,主要提供一組基于C/C++的函數(shù)庫。核心庫,提供Android系統(tǒng)的特有函數(shù)功能和Java語言函數(shù)功能Dalvik虛擬機,教學(xué)過程及內(nèi)容備注實現(xiàn)基于Linux內(nèi)核的線程管理和底層內(nèi)存管理。(3)應(yīng)用程序框架這一層是Android平臺為應(yīng)用程序的開發(fā)而提供的API框架,它提供了Android平臺基本的管理功能和組件重用機制,這一機制允許開發(fā)人員替換組件來開發(fā)自己的應(yīng)用程序。API框架中的所有組件和服務(wù)都可以被用戶的應(yīng)用重復(fù)利用。每個應(yīng)用程序有可能會使用到的應(yīng)用框架如下。(1)豐富的、可擴展的視圖集合(Views)。該視圖集合中包括列表框(ListView)、編輯框(EditText)、按鈕(Button)、網(wǎng)格(GridView)甚至內(nèi)嵌的網(wǎng)頁瀏覽器等??梢杂盟鼈冊O(shè)計應(yīng)用程序視圖部分,也就是用戶界面(UI)。(2)內(nèi)容提供器(ContentProviders)。提供了一種共享私有數(shù)據(jù),實現(xiàn)跨進程的數(shù)據(jù)訪問機制,使得應(yīng)用程序能訪問其他應(yīng)用程序(如通訊錄)的數(shù)據(jù)或共享自己的數(shù)據(jù)。(3)資源管理器(ResourceManager)??梢杂盟鼘Ρ镜鼗址?、圖片、涉及布局的XML文件等非代碼資源進行訪問。(4)活動管理器(ActivityManager)。它管理著應(yīng)用程序的生命周期,并且提供了常用的導(dǎo)航回退機制。(5)位置管理器(LocationManager)。用來管理與地圖相關(guān)的服務(wù)功能。它提供了一系列方法來解決地理位置相關(guān)的問題。(4)應(yīng)用程序Google發(fā)行的AndroidSDK包中就自帶了一個核心應(yīng)用程序集合,這些程序是用Java語言編寫的運行在虛擬機上的,如E-mail客戶端、SMS短消息程序、瀏覽器、地圖、聯(lián)系人管理程序等。如圖1.3中最上層部分所示。用戶也可以用Java語言開發(fā)更加豐富的應(yīng)用程序在該層上運行。1.2.2Android平臺架構(gòu)特性隨著Android系統(tǒng)的發(fā)展和用戶體驗的好評逐年上升,其市場占有率也已經(jīng)取代Symbian成為全球第一大的智能系統(tǒng),表現(xiàn)出了極大的市場潛力。Android系統(tǒng)有以下幾方面的優(yōu)點。(1)開源特性,得到眾多廠商的支持。由于Android的開源特性,所以得到了眾多的廠商的支持,除了諾基亞和蘋果之外,其他的手機大牌廠商基本都支持Android系統(tǒng),通過廠商的努力開發(fā),Android的界面非常豐富,可選擇性很強。Android的開源特性使各種基本Android系統(tǒng)的智能終端定制界面豐富。(2)軟件發(fā)展速度快。Android雖然從發(fā)布第一個版本到現(xiàn)在只經(jīng)過6年多的發(fā)展,但是也得到了開發(fā)者的青睞,目前AndroidMarket的軟件數(shù)量已經(jīng)達(dá)到了幾十萬之多,對于一個新生的系統(tǒng)而言已經(jīng)非常不錯。伴隨著Android系統(tǒng)的發(fā)展,AndroidMarket發(fā)展很快,還有很多免費軟件。(3)界面UI、系統(tǒng)優(yōu)化令人滿意。Android來源于Google,目前來看,Android的UI設(shè)計和系統(tǒng)優(yōu)化還是非常不錯的,是除了iOS之外最受好評的系統(tǒng),而且Android對于系統(tǒng)的要求并不苛刻,所以很多機型可以流暢運行。教學(xué)過程及內(nèi)容備注1.3Android開發(fā)環(huán)境搭建(1)安裝JDK和Eclipse下載JDK,安裝,然后設(shè)置JDK的環(huán)境變量:path和classpath。Eclipse只要下載后解壓縮就行無需安裝。(2)安裝AndroidSDKAndroid開發(fā)站點:/android,直接安裝。(3)安裝ADT插件下載網(wǎng)址:/android/eclipse/,然后手機安裝,安裝插件:啟動Eclipse.選擇Help→InstallNewSoftware,打開Eclipse插件的安裝界面。課程作業(yè)在自己的機器上配置Android應(yīng)用開發(fā)環(huán)境完成方式書面版()電子版()提交時間討論練習(xí)Android平臺的優(yōu)點和缺點預(yù)習(xí)復(fù)習(xí)2.1和2.2教學(xué)后記智能手機開發(fā)教案周次第周,第次課授課時間20年月日/星期授課時數(shù)10章節(jié)名稱第5章菜單和對話框授課方式課堂講授(√);實驗課();多媒體教學(xué)();網(wǎng)絡(luò)教學(xué)();雙語()教學(xué)目的1.掌)的常用屬性和方法以及它們的應(yīng)用;掌握如何用XML文件自定義菜單;3掌握AlertDialog(提示對話框)的常用屬性和方法,以及幾種不同風(fēng)格對話框的實現(xiàn);4.掌握日期和時間對話框的使用;5.熟悉進度條對話框的使用;教學(xué)重點1.Android應(yīng)用程序的選項菜單、子菜單和快捷菜單;2.Android應(yīng)用程序中的對話框的使用。教學(xué)難點進度條對話框中使用線程更新進度條。教學(xué)方法講授+實驗教學(xué)環(huán)境教學(xué)用具多媒體教學(xué)設(shè)備教學(xué)過程及內(nèi)容備注5.1選項菜單當(dāng)手機應(yīng)用程序在前臺運行時,如果用戶按手機上的MENU鍵,此時就會在屏幕底端彈出相應(yīng)的選項菜單,如圖5.1所示。選項菜單分為兩種:圖標(biāo)菜單和擴展菜單。Android系統(tǒng)的菜單支持主要通過android.view.Menu接口來體現(xiàn)的,Android系統(tǒng)用它來管理各種菜單項。Menu接口中常用的方法見表5-1。表5-1Menu常用方法方法名功能MenuItemadd(CharSequencetitle)添加一個新的菜單項MenuItemadd(intgroupId,intitemId,intorder,CharSequencetitle)添加一個新的菜單項SubMenuaddSubMenu(intgroupId,intitemId,intorder,CharSequencetitle)添加一個新的子菜單教學(xué)過程及內(nèi)容備注為了能夠在Android應(yīng)用程序中使用選項菜單,必須覆寫Activity中的onCreateOptionMenu()方法。該方法在用戶第一次使用選項菜單時被調(diào)用,一般用來初始化菜單項,代碼如下:finalstaticintM1=Menu.FIRST;finalstaticintM2=Menu.FIRST+1;publicbooleanonCreateOptionsMenu(Menumenu){menu.add(0,M1,0,"向左");menu.add(0,M2,0,"向右");returntrue;}add()方法的返回值為一個MenuItem對象,可以用一個MenuItem引用變量來接收它,代碼如下:MenuItemitem1=menu.add(0,M1,0,"向左");item1.setIcon(R.drawable.left);item1.setShortcut('1','f');獲得MenuItem對象后,就可以調(diào)用setIcon()方法設(shè)置選項菜單的圖標(biāo),圖標(biāo)要預(yù)先保存在res/drawable目錄中。也可以調(diào)用setShortcut()方法為菜單項設(shè)置快捷鍵。onCreateOptionsMenu()方法僅在第一次使用菜單時調(diào)用,如果想每次使用菜單時都能動態(tài)地改變菜單項的某些屬性,就需要覆寫Activity的onPrepareOptionsMenu()方法,每次用戶使用選項菜單時都會調(diào)用該方法,代碼如下:publicbooleanonPrepareOptionsMenu(Menumenu){MenuItemitem=menu.findItem(M1);item.setTitle("重新設(shè)置標(biāo)題");returntrue;}如果希望選擇菜單某個選項時,執(zhí)行相應(yīng)動作,需要覆寫onOptionsItemSelected(MenuItemitem)方法,方法的參數(shù)為用戶所選擇的那個菜單項,代碼如下:publicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){caseM1:tvmsg.setText("向左");returntrue;caseM2:tvmsg.setText("向右");returntrue;}returnfalse;}可以通過onOptionsItemSelected()方法的參數(shù),獲取被選擇的菜單項,再調(diào)用getItemId()方法獲取菜單項的ID,最后通過switch語句判斷所選擇的是哪個菜單項,進而執(zhí)行相應(yīng)的操作。o5.2子菜單Android系統(tǒng)提供的子菜單(SubMenu)用于更加詳細(xì)地顯示信息,選擇子菜單將彈出懸浮窗口顯示子菜單項。但是Android系統(tǒng)中的子菜單不支持嵌套,即子菜單中不能再包括其他子菜單。教學(xué)過程及內(nèi)容備注表5-2SubMenu常用方法方法名功能SubMenusetHeaderIcon(Drawableicon)設(shè)置菜單頭的圖標(biāo)SubMenusetHeaderIcon(inticonRes)設(shè)置菜單頭的圖標(biāo)SubMenusetHeaderTitle(CharSequencetitle)設(shè)置菜單頭的標(biāo)題SubMenusetHeaderTitle(inttitleRes)設(shè)置菜單頭的標(biāo)題SubMenu.setIcon(Drawableicon)設(shè)置子菜單圖標(biāo)SubMenusetIcon(inticonRes)設(shè)置子菜單圖標(biāo)和選項菜單一樣,子菜單也是通過重載onCreateOptionsMenu()方法創(chuàng)建,不同的是子菜單需要調(diào)用menu.addSubMenu()方法,而不是menu.add()方法,具體代碼如下:SubMenusbmenu=menu.addSubMenu(0,MENU_area,1,"選擇地區(qū)");sbmenu.setIcon(R.drawable.area);sbmenu.setHeaderTitle("選擇居住的城市");sbmenu.setHeaderIcon(R.drawable.area);sbmenu.add(0,MENU_area+1,0,"北京");sbmenu.add(0,MENU_area+2,1,"上海");5.3快捷菜單快捷菜單又稱為上下文菜單,與Windows操作系統(tǒng)中的快捷菜單一樣都是與某個組件相關(guān)的菜單,只是彈出的方式不一樣,Windows操作系統(tǒng)中的快捷菜單是右擊彈出,而Android系統(tǒng)中的快捷菜單是在某個組件(視圖)上長按(超過2秒)后彈出??旖莶藛?ContextMenu)繼承于Menu,常用的方法見表5-3。表5-3ContextMenu的常用方法方法名功能ContextMenusetHeaderIcon(Drawableicon)設(shè)置快捷菜單圖標(biāo)ContextMenusetHeaderIcon(inticonRes)設(shè)置快捷菜單圖標(biāo)ContextMenusetHeaderTitle(CharSequencetitle)設(shè)置快捷菜單標(biāo)題ContextMenusetHeaderTitle(inttitleRes)設(shè)置快捷菜單標(biāo)題創(chuàng)建快捷菜單,需要覆寫onCreateContextMenu()方法,在該方法中創(chuàng)建菜單項,以及()方法,每次使用快捷菜單都會調(diào)用onCreateContextMenu()方法,創(chuàng)建快捷菜單的關(guān)鍵代碼如下:publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo){super.onCreateContextMenu(menu,v,menuInfo);menu.setHeaderTitle("請選擇某門課程");menu.add(0,M1,0,"軟件工程");menu.add(0,M2,1,"android軟件開發(fā)");menu.add(0,M3,1,"C#程序設(shè)計");}教學(xué)過程及內(nèi)容備注處理菜單的單擊事件需要覆寫onContextItemSelected(MenuItemitem)方法,當(dāng)菜單項被選中時,自動調(diào)用該方法,方法中的參數(shù)就是被選中的菜單項。實現(xiàn)代碼如下:publicbooleanonContextItemSelected(MenuItemitem){switch(item.getItemId()){caseM1:tvmsg.setText("軟件工程");returntrue;caseM2:……快捷菜單是與某個組件相關(guān)的菜單,所以創(chuàng)建好快捷菜單后還需要將其和某個組件關(guān)聯(lián)起來,也就是需要調(diào)用registerForContextMenu(Viewview)方法,將快捷菜單注冊到View上,實現(xiàn)View組件與快捷菜單的關(guān)聯(lián)。實例代碼如下:publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);tvmsg=(TextView)findViewById(R.id.tvmsg);this.registerForContextMenu(tvmsg);}5.4使用XML生成菜單前面都是直接在代碼中創(chuàng)建菜單,添加菜單項,這是比較常規(guī)的做法,簡單但同時也存在著不足。例如,需要使用常量來保存每個菜單項的ID。Android中提供了另一種創(chuàng)建菜單的方法,就是把菜單也定義為應(yīng)用程序的資源,通過Android對資源的本地支持,方便地實現(xiàn)菜單的創(chuàng)建和響應(yīng)。1.使用XML文件創(chuàng)建菜單使用XML文件創(chuàng)建菜單的步驟如下。(1)在項目的res目錄下創(chuàng)建menu文件夾,并在menu目錄下使用與menu相關(guān)的元素定義XML文件。group常用屬性見表5-4,item常用屬性見表5-5。表5-4group常用屬性及說明屬性名說明android:id設(shè)置groupid(組id)android:orderInCategory定義這組菜單在菜單中的默認(rèn)次序,為整數(shù)值android:checkableBehavior定義這組菜單是否checkable,有效值:none、all(單選按鈕)、single(復(fù)選框)android:visible設(shè)置菜單是否可見,值為true或falseandroid:enabled設(shè)置菜單是否可用,值為true或false(2)使用XML文件的資源ID,將XML文件中定義的菜單項添加到menu對象中。(3)響應(yīng)菜單項時,使用每個菜單項對應(yīng)的資源ID。2.具體實現(xiàn)(1)定義菜單資源文件。在res目錄中創(chuàng)建menu文件夾,并在menu中創(chuàng)建一個XML資源文件,本案例XML資源文件的文件名為menu.xml,詳細(xì)代碼如下:教學(xué)過程及內(nèi)容備注<menuxmlns:android="/apk/res/android"><groupandroid:id="@+id/group1"><itemandroid:id="@+id/m1"android:title="選項1"/><itemandroid:id="@+id/m2"android:title="選項2"/>"</group>……(2)使用MenuInflater添加菜單項。MenuInflater在Android中建立了從資源文件到對象的橋梁,MenuInflater對象通過Activity的getMenuInflater()方法得到,通過調(diào)用inflate(intmenuRes,Menumenu)方法把菜單資源文件轉(zhuǎn)換為對象并添加到menu對象中。代碼如下:publicbooleanonCreateOptionsMenu(Menumenu){MenuInflaterinflater=getMenuInflater();inflater.inflate(R.menu.menu,menu);returntrue;}inflate(intmenuRes,Menumenu)方法的第一個參數(shù)表示待轉(zhuǎn)換的菜單資源文件,第二個參數(shù)表示菜單對象。(3)響應(yīng)菜單項。如果希望選擇菜單某個選項時,執(zhí)行相應(yīng)動作,同樣需要覆寫onOptionsItemSelected(MenuItemitem)方法,具體實現(xiàn)可以參考5.1節(jié)選項菜單的操作。本案例中只用了較少的屬性,讀者可自行嘗試使用其他屬性來創(chuàng)建菜單。5.5提示對話框在Android開發(fā)中,經(jīng)常需要在Android應(yīng)用程序界面上彈出對話框,以節(jié)省界面空間。Dialog的直接子類有AlertDialog(提示對話框)、CharacterPickerDialog(字符選擇對話框);間接子類有DatePickDialog(日期選擇對話框)、ProgressDialog(進度對話框)、TimePickerDialog(時間選擇對話框)。下面首先介紹AlterDialog。AlertDialog的功能比較強大,可以生成4種預(yù)定義對話框:(1)帶消息和多個按鈕的提示對話框。(2)帶列表和多個按鈕的列表對話框。(3)帶多個單選列表項和多個按鈕的對話框。(4)帶多個復(fù)選列表項和多個按鈕的對話框。AlertDialog類的構(gòu)造方法全部都是protected的,所以不能直接通過AlertDialog類創(chuàng)1.帶消息和按鈕的提示對話框此類對話框不需要界面布局,實現(xiàn)比較簡單,具體實現(xiàn)代碼如下:AlertDialog.BuilderalertDialog=newAlertDialog.Builder(this);//設(shè)置標(biāo)題alertDialog.setTitle("請認(rèn)真選擇");//設(shè)置提示信息alertDialog.setMessage("你喜歡智能手機開發(fā)這門課嗎?");//設(shè)置圖標(biāo)alertDialog.setIcon(R.drawable.ic_launcher);教學(xué)過程及內(nèi)容備注//添加PositiveButtona@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//設(shè)置選擇PositivieButton時所執(zhí)行的操作}});……有時候系統(tǒng)提供的預(yù)定義AlertDialog不能夠滿足實際應(yīng)用的需要,例如,要實現(xiàn)一個登錄對話框,需要在對話框中輸入用戶名和密碼。這時就需要用到自定義View的AlertDialog。實現(xiàn)一個自定義對話框的步驟如下。(1)自定義對話框的界面布局,本案例中用到了TextView組件和EditText組件。布局文件login.xml代碼如下:<LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/user"/><EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"/>……(類中的inflate(intresource,ViewGrouproot)方法取得自定義的界面布局,第一個參數(shù)表示自定義的界面布局文件的ID,第二個參數(shù)表示提供的父類視圖(若沒有則為null)。詳細(xì)代碼如下:LayoutInflaterlayoutInflater=LayoutInflater.from(this);ViewloginView=layoutInflater.inflate(R.layout.login,null);AlertDialog.BuilderalertDialog=newAlertDialog.Builder(this);alertDialog.setTitle("用戶登錄");alertDialog.setIcon(R.drawable.ic_launcher);//為對話框設(shè)置視圖alertDialog.setView(loginView);alertDialog.setPositiveButton("登錄",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){}});教學(xué)過程及內(nèi)容備注5.6日期/時間選擇對話框Android系統(tǒng)開發(fā)中提供了DatePickerDialog組件和TimePickerDialog組件,分別用于選擇日期和時間。它們與DatePicker和TimePicker不同的是以彈出式對話框形式顯示在界面上。DatePickerDialog由OnDateSetListener監(jiān)聽設(shè)置日期事件,設(shè)置日期后會調(diào)用OnDateSetListene接口中的OnDateSet()方法。TimePickerDialog由OnTimeSetListener監(jiān)聽設(shè)置時間事件,設(shè)置時間后會調(diào)用OnTimeSetListener接口中的onTimeSet()方法。創(chuàng)建對話框部分,對兩個按鈕實現(xiàn)單擊事件監(jiān)聽,分別調(diào)用showDateDialog()方法和showTimeDialog()方法來創(chuàng)建日期對話框和時間對話框。在showDateDialog()方法中調(diào)用了DatePickerDialog類的構(gòu)造方法DatePickerDialog(Contextcontext,DatePickerDialog.OnDateSetListenercallBack,intyear,intmonthOfYear,intdayOfMonth)來創(chuàng)建對話框,方法中第一個參數(shù)表示創(chuàng)建DatePickerDialog的Activity;第二個參數(shù)表示監(jiān)聽日期發(fā)生改變的監(jiān)聽器;第三個參數(shù)表示年份;第四個參數(shù)表示月份;最后一個參數(shù)表示月份中哪一天。在showTimeDialog()方法中調(diào)用了TimePickerDialog類的構(gòu)造方法is24HourView),方法中第一個參數(shù)表示創(chuàng)建TimePickerDialog的Activity;第二個參數(shù)表示監(jiān)聽時間發(fā)生改變的監(jiān)聽器;第三個參數(shù)表示小時;第四個參數(shù)表示分鐘;最后一個參數(shù)表示是否是24小時制。需要注意的是,在創(chuàng)建日期對話框和時間對話框時分別需要實現(xiàn)OnDateSetListener和OnTimeSetListener接口。5.7進度條對話框ProgressDialog(進度條對話框)和ProgressBar(進度條)有著異曲同工之處,都是用于顯示程序的執(zhí)行進度,不同的是ProgressDialog以對話框的形式展示出來。ProgressDialog對話框也可以通過相應(yīng)方法設(shè)置對話框上顯示的文字、圖標(biāo)、進度條的樣式,當(dāng)然也需要使用線程來控制進度條的顯示。ProgressDialog常用方法見表5-7。表5-7ProgressDialog常用方法及功能方法名功能getMax()獲取進度條最大值getProgress()獲取當(dāng)前進度值getSecondaryProgress()獲取第二進度條的值setMax(int
max)設(shè)置進度條的最大值setMessage(CharSequence
message)設(shè)置提示信息文字setIcon(DrawableIcon)設(shè)置進度條圖標(biāo)setIndeterminate(booleanindeterminate)設(shè)置進度條是否明確通過調(diào)用setProgressStyle(ProgressDialog.STYLE_SPINNER)方法設(shè)置為圓形進度條,調(diào)用setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)方法設(shè)置為長形的進度條。教學(xué)過程及內(nèi)容備注課程作業(yè)編寫一個簡單的菜單應(yīng)用程序完成方式書面版()電子版(√)提交時間一周討論練習(xí)幾種菜單的實現(xiàn)方式預(yù)習(xí)復(fù)習(xí)下一章教學(xué)后記智能手機開發(fā)教案周次第周,第次課授課時間20年月日/星期授課時數(shù)15章節(jié)名稱第6章組件通信與服務(wù)授課方式課堂講授(√);實驗課();多媒體教學(xué)();網(wǎng)絡(luò)教學(xué)();雙語()教學(xué)目的1.理解Intent進行組件通信的原理;2.掌握使用Intent顯示啟動Activity和隱式啟動Activity的方法;3.掌握如何啟動子Activity并獲取子Activity的返回值;4.理解Service的原理和應(yīng)用;掌握Service的兩種使用方法;5.掌握廣播的發(fā)送和接收機制。教學(xué)重點1.使用Intent啟動Activity;2.Service的原理和使用方法。教學(xué)難點Android應(yīng)用程序開發(fā)中所有類型XML文件的定義和使用方法。教學(xué)方法講授+實驗教學(xué)環(huán)境教學(xué)用具多媒體教學(xué)設(shè)備教學(xué)過程及內(nèi)容備注6.1概述1.IntentIntent用于組件間的通信,通常包含信息的發(fā)出者和信息的接收者,以及要傳遞的信息。也可以在發(fā)出信息的時候不指定信息的接收者而是使用Intent過濾器來匹配接收信息的組件,收到信息后的組件可以從Intent中獲取相應(yīng)的數(shù)據(jù),Intent為Activity、Service和BroadcastReceiver等組件提供相互通信的能力,最為常見的用法是使用一個Intent啟動一個Activity,或啟動一個Service,另外一個應(yīng)用就是在Android系統(tǒng)上發(fā)布一個廣播消息。2.ServiceService是Android系統(tǒng)提供的后臺服務(wù)組件,用于運行那些需要長時間運行且不需要界面的程序,如手機中的下載程序,當(dāng)下載某個軟件時,即使退出下載界面,也不會中斷程序的下載,而是轉(zhuǎn)到后臺繼續(xù)下載。此外,Service比Activity具有更高的優(yōu)先級,在系統(tǒng)資源緊張的時候,系統(tǒng)也不會輕易地終止Service,即使Service被終止,當(dāng)系統(tǒng)資源恢復(fù)時,系統(tǒng)也將自動恢復(fù)Service的運行。3.廣播消息Android系統(tǒng)提供了一種稱為廣播的機制,應(yīng)用程序和Android系統(tǒng)可以使用Intent發(fā)送廣播消息,應(yīng)用程序可以注冊接收某種廣播消息,廣播消息的內(nèi)容可以是系統(tǒng)的一些狀態(tài),如電量過低、收到短息,或者系統(tǒng)設(shè)置的變化,也可以是應(yīng)用程序自定義的一些消息。教學(xué)過程及內(nèi)容備注6.2私密聯(lián)系簿的設(shè)計與實現(xiàn)6.2.1預(yù)備知識,Intent可以實現(xiàn)不同Activity之間的切換和數(shù)據(jù)傳遞,通常啟動Activity的方式有3種,即顯式啟動、隱式啟動以及啟動子Activity獲取返回值。1.顯式啟動顯式啟動Activity,必須在Intent中指明要啟動的Activity,代碼如下所示:Intentintent=newIntent(MainActivity.this,OtherActivity.class);startActivity(intent);在創(chuàng)建Intent類的對象時,其構(gòu)造方法的第一個參數(shù)是當(dāng)前Activity,第二個Activity就是目標(biāo)Activity,即被啟動者,最后調(diào)用startActivity()方法啟動相應(yīng)的Activity。2.隱式啟動隱式啟動Activity,不需要指明被啟動者,只需要在Intent中包含需要執(zhí)行的動作和所包含的數(shù)據(jù),由Android系統(tǒng)根據(jù)Intent的動作和數(shù)據(jù)來決定啟動哪一個Activity。代碼如下所示:IstartActivity(intent);Intent的構(gòu)造方法中,第一個參數(shù)是指定Intent的動作,第二個參數(shù)是Intent中包含的數(shù)據(jù),當(dāng)Android系統(tǒng)收到這個Intent后根據(jù)指定的動作以及包含的數(shù)據(jù),啟動瀏覽器打開百度網(wǎng)頁(需要在配置文件AndroidManifest.xml中添加相應(yīng)的許可權(quán)限)。除了ACTION_VIEW之外,Android系統(tǒng)還支持一些常見動作字符串,其表達(dá)的意義見表6-1。表6-1常用Action字符串常量名類型描述ACTION_CALLActivity打電話ACTION_EDITActivity數(shù)據(jù)編輯ACTION_VIEWActivity數(shù)據(jù)查看表6-1列舉的是系統(tǒng)自定義的動作,用戶也可以自己定義動作字符串,通常將項目的包名作為動作的字符串。當(dāng)采用隱式方式啟動一個自定義的Activity時,需要給被啟動的Activity設(shè)置Intent過濾器。Intent過濾器是一種根據(jù)Intent中的action(動作)、category(類別)和data(數(shù)據(jù))等內(nèi)容,對接收組件進行匹配和篩選的機制。也就說,每個組件可以在AndroidManifest.xml文件中注冊時制定<intent-filter>節(jié)點,該節(jié)點中可以包含<action>、<category>以及<data>等標(biāo)簽來匹配相應(yīng)的Intent,相關(guān)標(biāo)簽的說明見表6-2。表6-2Intent過濾器標(biāo)簽標(biāo)簽屬性說明<action>android:name指定組件所能響應(yīng)的動作,用字符串表示,通常使用Java類名和包的完全限定名構(gòu)成<category>android:category指定以何種方式服務(wù)Intent請求的動作<data>Android:host指定一個有效的主機名android:mimetype指定組件能處理的數(shù)據(jù)類型android:path有效的URI路徑名android:port主機的有效端口號android:scheme所需要的特定的協(xié)議教學(xué)過程及內(nèi)容備注例如,下面是某個Acitvity在AndroidManifest.xml文件中注冊的代碼,其中增加了一個Intent過濾器,說明該Acitvity只接收動作為VIEW、類別為DEFAULT,并且數(shù)據(jù)中的協(xié)議是schemodemo,主機號是.nnutc的Intent。<activityandroid:name=".ActivityToStart"android:label="@string/app_name"><intent-filter><actionandroid:name="ent.action.VIEW"/><categoryandroid:name="ent.category.DEFAULT"/><</intent-filter></activity>那么在啟動該Activity時需要在Intent構(gòu)造方法中指定相關(guān)要求,代碼如下所示:Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse("schemodemo://.nnutc"));startActivity(intent);3.啟動子Activity獲取返回值有時啟動Activity后,需要從該Activity中獲取返回值,如讓用戶選擇所在省份或城市等,這些數(shù)據(jù)需要返回到原先的Activity中,此時就可以使用啟動子Activity的模式,代碼如下所示:intSUBACTIVITY1=1;Intentintent=newIntent(this,SubActivity1.class);startActivityForResult(intent,SUBACTIVITY1);以上代碼采用startActivityForResult()方法啟動子Activity,在該方法中,第一個參數(shù)是Intent對象,第二個參數(shù)是給子Activity定義的標(biāo)記,當(dāng)收到子Activity的返回值時,用此標(biāo)記判斷是哪個子Activity的返回值。在子Activity中可以設(shè)置返回值,并通過setResult()方法返回值,代碼如下所示:Uridata=Uri.parse("tel:"+tel_number);Intentresult=newIntent(null,data);setResult(RESULT_OK,result);finish();setResult()方法的第一個參數(shù)是Activity的結(jié)果碼,可以為Activity.RESULT_OK或者Activity.RESULT_CANCELED,或自定義的結(jié)果碼,結(jié)果碼均為整數(shù)類型,用于標(biāo)記子Activity結(jié)果狀態(tài)。當(dāng)主Activity收到子Activity的返回值時,會自動調(diào)用onActivityResult()方法,可以在Activity中重載該方法。該方法的定義如下:publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata);方法中的第一個參數(shù)是子Activity的請求碼,用于判斷收到的是哪個子Activity的值,該值是在啟動子Activity時設(shè)置的,第二個參數(shù)是子Activity的結(jié)果碼,該結(jié)果碼在子Activity返回時設(shè)置的,最后一個就是子Activity的返回值。6.3啟動式音樂服務(wù)的設(shè)計與實現(xiàn)6.3.1預(yù)備知識1.Service簡介Service是Android系統(tǒng)的后臺服務(wù)組件,適用于開發(fā)無界面、長時間運行的應(yīng)用程序,其具有如下特點。教學(xué)過程及內(nèi)容備注(1)沒有用戶界面。(2)比Activity的優(yōu)先級高,不會輕易被Android系統(tǒng)終止。(3)即使Service被系統(tǒng)終止,在系統(tǒng)資源恢復(fù)后Service也將自動恢復(fù)運行狀態(tài)。2.啟動式Service的生命周期Service的使用方法分為兩種:啟動式和綁定式。啟動式Service的生命周期如圖6.4所示。其中onCreate()事件回調(diào)方法為:Service的生命周期開始,完成Service的初始化工作。onStart()事件回調(diào)方法為:活動生命周期開始,但沒有與之對應(yīng)的“停止”方法,因此可以近似認(rèn)為活動生命周期也是以onDestroy()標(biāo)志結(jié)束。onDestroy()事件回調(diào)方法為:Service的生命周期結(jié)束,釋放Service所有占用的資源。圖6.4啟動式Service的生命周期需要注意的是,如果Service還沒有運行,則Android系統(tǒng)先調(diào)用onCreate()方法,然后調(diào)用onStart()方法;如果Service已經(jīng)運行,則只調(diào)用onStart()方法,所以一個Service的onStart()方法可能會重復(fù)調(diào)用多次。另一方面,采用啟動式啟動Service后,調(diào)用者不能訪問Service中的方法,這時需要Service自己管理自身。在調(diào)用stopService()方法停止Service的時候直接調(diào)用onDestroy()方法,如果是調(diào)用者自己直接退出而沒有調(diào)用stopService()方法,Service會一直在后臺運行。該Service的調(diào)用者再啟動起來后可以通過stopService()方法關(guān)閉Service。3.啟動Service和關(guān)閉Service的方法采用啟動式啟動Service時需要調(diào)用startService(Intentservice),該方法中只包含一個即通過Intent過濾器指定。關(guān)閉Service時需要調(diào)用stopService(Intentname)方法,參數(shù)與startService()中的參數(shù)相同。4.Service中的代碼在使用Service時,需要創(chuàng)建一個子類繼承Service類,并且重載Service類中的一些方法,當(dāng)創(chuàng)建一個子類繼承Service類時會自動產(chǎn)生如下代碼:教學(xué)過程及內(nèi)容備注publicclassSimpleServiceextendsService{@OverridepublicIBinderonBind(Intentarg0){returnnull;}}onBind()方法是在Service被綁定后調(diào)用的方法,能夠返回Service的對象,然后通過Service的對象可以調(diào)用Service中的方法。然而默認(rèn)的代碼集并不能完成任何實際的功能,需要重載onCreate()、onStart()和onDestroy()等方法,才使Service具有實際意義。因為Service也是Android系統(tǒng)的四大組件之一,所以創(chuàng)建完Service對象后需要在AndroidManifest.xml文件中注冊,注冊代碼如下:<serviceandroid:name=".SimpleService"/>其中,<service>標(biāo)簽聲明服務(wù),android:name表示服務(wù)的名稱,一定要和所建立的Service名稱相同。6.4綁定式音樂服務(wù)的設(shè)計與實現(xiàn)Service的使用方式有啟動式和綁定式兩種,它們啟動的Service有著不一樣的生命周期和不一樣的特性。下面首先介紹綁定式Service的生命周期以及與啟動式的區(qū)別,然后用一個案例項目介紹具體的使用方法。6.4.1預(yù)備知識1.綁定式Service的生命周期綁定式Service的生命周期如圖6.7所示,調(diào)用bindService()方法綁定服務(wù),如果綁定成功則執(zhí)行onCreate()方法,之后執(zhí)行onBind()方法(只綁定一次,不可多次綁定),之后服務(wù)開始運行,調(diào)用unbindService()方法取消綁定,之后會執(zhí)行onDestroy()以及onUnbind()方法。綁定成功后,onBind()方法將返回給客戶端一個IBind接口實例,IBind允許客戶端回和Service綁定在一起,退出Context,Service就會相繼調(diào)用onUnbind()方法和onDestroy()方法退出。教學(xué)過程及內(nèi)容備注圖6.7綁定式Service的生命周期2.綁定和取消綁定Service采用bindService()方法綁定服務(wù),其語法結(jié)構(gòu)如下所示:bindService(Intentservice,ServiceConnectionconn,intflags);其中第一個參數(shù)是Intent對象指定要綁定的服務(wù),第二個參數(shù)是服務(wù)連接對象,如果連接成功則綁定用于返回的IBind接口實例,第三個參數(shù)是一個標(biāo)識,用于說明只要綁定)。為了調(diào)用bindService()方法,需要在程序中創(chuàng)建ServiceConnection的子類,并實現(xiàn)其中的抽象方法,代碼如下所示:privateclassConnectionimplementsServiceConnection{@OverridepTS}@OverridepublicvoidonServiceDisconnected(ComponentNamename){Toast}}取消綁定需要調(diào)用unbindService(ServiceConnectionconn)方法,該方法中的ServiceConnection對象要和bindService()方法中設(shè)置的參數(shù)相同。教學(xué)過程及內(nèi)容備注3.綁定式和啟動式的區(qū)別啟動式和綁定式的區(qū)別主要表現(xiàn)在兩方面:①啟動式啟動Service后,Service和調(diào)用者之間沒有必然的聯(lián)系,即使調(diào)用者關(guān)閉Serice仍然繼續(xù)運行,而綁定式啟動Service后,如果調(diào)用者關(guān)閉,Service也隨之關(guān)閉;②啟動式啟動Service后不能調(diào)用Service中的方法,而綁定式可以通過返回的Service對象調(diào)用Service中的方法。6.5跨進程計算器的設(shè)計與實現(xiàn)6.5.1預(yù)備知識1.進程通信機制在Android系統(tǒng)中,每個應(yīng)用程序在各自的進程中運行,而且出于安全原因的考慮,這些進程之間彼此是隔離的,如果需要在進程之間傳遞數(shù)據(jù)和對象,那么就要使用Android支持的進程通信(Inter-ProcessCommunication,IPC)機制。進程通信機制有以下兩種。(1)Intent,是一種簡單、高效且易于使用的IPC機制。(2)遠(yuǎn)程服務(wù),服務(wù)和調(diào)用者在兩個不同的進程中,調(diào)用過程需要跨進程才能實現(xiàn)。2.服務(wù)創(chuàng)建和調(diào)用實現(xiàn)遠(yuǎn)程服務(wù)的步驟如下。(1)使用AIDL語言定義跨進程服務(wù)的接口。(2)根據(jù)AIDL語言定義的接口,在具體的Service類中實現(xiàn)接口中定義的方法和屬性。(3)在需要調(diào)用跨進程服務(wù)的組件中,通過相同的AIDL接口文件,調(diào)用跨進程服務(wù)。AIDL(AndroidInterfaceDefinitionLanguage)是Android系統(tǒng)自定義的接口描述語言,可以簡化進程間數(shù)據(jù)格式轉(zhuǎn)換和數(shù)據(jù)交換的代碼,通過定義Service內(nèi)部的公共方法,允許調(diào)用者和Service在不同進程間相互傳遞數(shù)據(jù)。AIDL語言的語法與Java語言的接口定義非常相似,唯一不同之處是:AIDL允許定義方法參數(shù)的傳遞方向。AIDL支持以下4種方向。(1)標(biāo)識為in的參數(shù)將從調(diào)用者傳遞到跨進程服務(wù)中。(2)標(biāo)識為out的參數(shù)將從跨進程服務(wù)傳遞到調(diào)用者中。(3)標(biāo)識為inout的參數(shù)將先從調(diào)用者傳遞到跨進程服務(wù)中,再從跨進程服務(wù)返回給調(diào)用者。(4)在不標(biāo)識參數(shù)的傳遞方向時,默認(rèn)所有方法的傳遞方向為in。6.5.2跨進程計算器的實現(xiàn)下面通過一個跨進程服務(wù)示例,來介紹如何創(chuàng)建遠(yuǎn)程服務(wù),以及應(yīng)用程序如何調(diào)用遠(yuǎn)程服務(wù)。示例分為兩個項目:RemoteServiceTest和RemoteServiceCall。RemoteServiceTest中創(chuàng)建遠(yuǎn)程Service提供求階乘的服務(wù),RemoteServiceCall調(diào)用Service中的服務(wù),計算數(shù)據(jù)的階乘。1.RemoteServiceTest要創(chuàng)建一個遠(yuǎn)程服務(wù),首先需要使用AIDL語言定義跨進程服務(wù)的接口,新建一個RemoteServiceTest項目,然后在src文件夾下新建一個名為IJiechengService.aidl的文件,文件中的代碼如下:package.nnutc.Service;interfaceIJiechengService{longJC(inta);}教學(xué)過程及內(nèi)容備注然后編寫一個jiechengService類繼承Service類,在該類中實現(xiàn)IJiechengService接口中定義的抽象方法JC()。這里需要注意的是onBind()方法返回的不再是自定義的Binder類的對象,而是IJiechengService.Stub類的對象,代碼如下:publicclassjiechengServiceextendsService{priv@OverridepubliclongJC(inta)throwsRemoteException{longp=1;for(inti=1;i<=a;i++){p=p*i;}returnp;}};@OverridepublicIBinderonBind(Intentarg0){returnmBinder;}@OverridepublicbooleanonUnbind(Intentintent){returnsuper.onUnbind(intent);}}定義完jiechengService后,需要在AndroidManifest.xml文件中注冊,這里不再詳述,讀者可參見前面章節(jié)的內(nèi)容在配置文件中注冊。2.RemoteServiceCall因為在RemoteServiceCall項目中使用了遠(yuǎn)程服務(wù),所以在該項目中同樣需要定義IJiechengService.aidl文件,該文件與RemoteServiceTest項目中的IJiechengService.aidl文件要完全一致,RemoteServiceCall項目的文件結(jié)構(gòu)如圖6.10所示。RemoteServiceCall包含一個項目主界面文件MainActivity.java。程序運行界面如圖6.11所示,單擊“綁定遠(yuǎn)程服務(wù)”按鈕綁定服務(wù),然后在文本框中輸入某一數(shù)字,單擊“計算階乘”按鈕,會在界面下方的TextView組件上顯示調(diào)用服務(wù)的結(jié)果,單擊“取消綁定服務(wù)”按鈕則取消綁定服務(wù)。教學(xué)過程及內(nèi)容備注6.6廣播接收器的設(shè)計與實現(xiàn)BroadcastReceiver作為Android四大組件之一,不像Activity,它沒有可顯示的界面。BroadcastReceiver包括兩個概念:廣播發(fā)送者和廣播接收者(Receiver),這里的廣播實際就是指Intent,程序可以自己發(fā)送廣播自己接收,也可以接收系統(tǒng)或其他應(yīng)用的廣播或是發(fā)送廣播給其他應(yīng)用程序。6.6.1預(yù)備知識1.廣播信息的使用方法要創(chuàng)建廣播信息,需要執(zhí)行兩個步驟。(1)創(chuàng)建一個Intent,需要注意的是在構(gòu)造Intent時必須用一個全局唯一的字符串標(biāo)記其要執(zhí)行的動作,通常使用應(yīng)用程序包的名稱,如果要在Intent傳遞額外數(shù)據(jù),可以用Intent的putExtra()方法。(2)調(diào)用sendBroadcast()方法,就可以將Intent攜帶的消息廣播出去,代碼如下所示:StringUNIQUE_STRING=".nnutc";Intentintent=newIntent(UNIQUE_STRING);intent.putExtra("key1","value1");intent.putExtra("key2","value2");sendBroadcast(intent);2.接收廣播信息的方法接收廣播消息,需要使用BroadcastReceiver,創(chuàng)建BroadcastReceiver需繼承BroadcastReceiver類,并重載onReceive()方法。代碼如下:publicclassMyBroadcastReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){}}定義完BroadcastReceiver類后需要在AndroidManifest.xml文件中注冊,注冊代碼如下:<receiverandroid:name=".myBroadcast"><intent-filter><actionandroid:name=".nnutc"/></intent-filter></receiver>其中<intent-filter>標(biāo)簽定義過濾器,里面的<action>標(biāo)簽說明接收廣播的類型,以上代碼只接收action為“.nnutc”的廣播。教學(xué)過程及內(nèi)容備注BroadcastReceiver的應(yīng)用程序不需要一直運行,當(dāng)Android系統(tǒng)接收到與之匹配的廣播消息時,會自動啟動此BroadcastReceiver,在BroadcastReceiver接收到與之匹配的廣播消息后,onReceive()方法會被調(diào)用。所以BroadcastReceiver適合做一些資源管理的工作,如手機電量低或收到短信等消息彈出一些提示信息等,但是onReceive()方法必須要在5s內(nèi)執(zhí)行完畢,否則Android系統(tǒng)會認(rèn)為該組件失去響應(yīng),并提示用戶強行關(guān)閉該組件。6.6.2廣播接收器的實現(xiàn)“發(fā)送消息”按鈕的單擊事件的監(jiān)聽器代碼如下:classsendListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewarg0){Intentintent=newIntent();Stringmsg=etMessage.getText().toString();intent.setAction(actionString);intent.putExtra("msg",msg);sendBroadcast(intent);}}上面代碼中首先獲取etMessage組件中的內(nèi)容,然后通過intent.putExtra()方法將信息添加到Intent中,最后通過sendBroadcast(intent)發(fā)送消息。MessageReceive類的代碼如下所示,其中僅僅從傳來的Intent中把消息取出,然后通過Toast顯示出來。publicclassMessageReceiveextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringmsg=intent.getStringExtra("msg");Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();}}課程作業(yè)編寫一個多界面的登陸程序完成方式書面版()電子版(√)提交時間一周討論練習(xí)啟動Activity的幾種方法預(yù)習(xí)復(fù)習(xí)數(shù)據(jù)存儲教學(xué)后記智能手機開發(fā)教案周次第周,第次課授課時間20年月日/星期授課時數(shù)20章節(jié)名稱第7章數(shù)據(jù)存儲與訪問授課方式課堂講授(√);實驗課();多媒體教學(xué)();網(wǎng)絡(luò)教學(xué)();雙語()教學(xué)目的1.掌握SharedPreferences的原理與使用方法;2.掌握訪問Android內(nèi)部文件的方法;3.了解手動創(chuàng)建SQLite數(shù)據(jù)庫的方法以及對SQLite數(shù)據(jù)庫的訪問方法;4.掌握使用代碼創(chuàng)建以及訪問SQLite數(shù)據(jù)庫的方法;5.了解ContentProvider的原理和用途教學(xué)重點1.訪問Android內(nèi)部和外部文件的方法;2.對SQLite數(shù)據(jù)庫的訪問教學(xué)難點ContentProvider的原理和用途。教學(xué)方法講授+實驗教學(xué)環(huán)境教學(xué)用具多媒體教學(xué)設(shè)備教學(xué)過程及內(nèi)容備注7.1概述Android系統(tǒng)提供了多種數(shù)據(jù)存儲的方法,其中包含SharedPreferences、文件存儲、訪問外部存儲器SD卡,以及SQLite數(shù)據(jù)庫。其中SharedPreferences只能存儲簡單的鍵值對,文件存儲可以存儲各種類型的文件,SQLite數(shù)據(jù)庫為應(yīng)用程序提供數(shù)據(jù)庫的支持。此外,Android還提供了ContentProvider組件,可以使應(yīng)用程序共享底層的數(shù)據(jù),如使用ContentProvider訪問Android系統(tǒng)中的通訊錄等。7.2個人信息注冊的設(shè)計與實現(xiàn)SharedPreferences是Android為開發(fā)人員提供的一種簡單的數(shù)據(jù)存儲方式,是一種輕量級的數(shù)據(jù)保存方法,通過SharedPreferences開發(fā)人員可以將數(shù)據(jù)以NVP(Name/ValuePair,名稱/值對)的形式保存在Android的文件系統(tǒng)中,下面通過一個個人信息注冊的示例,來介紹SharedPreferences的原理和使用方法。7.2.1預(yù)備知識1.通過SharedPreferences寫數(shù)據(jù)在對象,代碼如下所示:教學(xué)過程及內(nèi)容備注SharedPreferencespreference=getSharedPreferences(fileName,MODE);getSharedPreferences(
)方法有兩個參數(shù),第一個參數(shù)為在文件系統(tǒng)中創(chuàng)建的文件名,第二個參數(shù)是文件的訪問模式,SharedPreferences支持以下3種訪問模式。(1)私有(MODE_PRIVATE):只有創(chuàng)建文件的程序可以讀和寫。(2)讀。(3)全局寫(MODE_WORLD_WRITEABLE):創(chuàng)建文件的程序可讀可寫,其他程序只能寫。有時需要將SharedPreferences的訪問模式定義為既可全局讀也可以全局寫,那么可以將兩種模式相加,代碼如下:publicstaticintMODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;獲得SharedPreferences對象后,需要通過SharedPreferences.Editor類對文件內(nèi)容進行編輯,最后調(diào)用commit(
)方法提交修改的內(nèi)容,代碼如下所示:SharedPreferences.Editoreditor=preference.edit();editor.putString("name",name);editor.putInt("age",age);editor.putBoolean("isBoy",isBoy);editor.putFloat("weight",weight);mit();2.通過SharedPreferences讀數(shù)據(jù)當(dāng)需要從已經(jīng)存在的SharedPreferences文件中讀取數(shù)據(jù)時,仍然先通過getShared-Preferences(
)獲取SharedPreference對象,然后通過SharedPreference對象的get<Type>(
)方法,從文件中取出相應(yīng)數(shù)據(jù),get<Type>(
)方法的第一個參數(shù)是變量名稱,第二個參數(shù)是默認(rèn)值,即如果沒有成功取出第一個參數(shù)指定的變量的值,那么該變量使用默認(rèn)值。代碼如下所示:SharedPreferencespreference=getSharedPreferences(fileName,MODE);msg+="姓名:"+preference.getString("name","張三")+",";msg+="年齡"+preference.getInt("age",22)+",";SharedPreferences創(chuàng)建的文件不僅創(chuàng)建程序本身可以訪問,其他程序同樣可以訪問,前提是文件的訪問模式必須設(shè)有相應(yīng)的權(quán)限。此外,還要知道文件創(chuàng)建程序所在的包和文件的名稱,以及文件中保存的變量的名稱和類型,下面用一個示例說明,代碼如下:publicclassOtherSharedPreferencesDemoextendsActivity{TextViewtvMessage;publicstaticfinalStringfileName="SimpleFile";publicstaticintMODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;publicstaticfinalStringPACK=".nnutc";@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);tvMessage=(TextView)findViewById(R.id.tvMessage);Contextcontext=null;教學(xué)過程及內(nèi)容備注try{
context=this.createPackageContext(PACK,Context.CONTEXT_IGNORE_SECURITY);}catch(NameNotFoundExceptione){e.printStackTrace();}7.3電話號碼文件存儲的設(shè)計與實現(xiàn)SharedPreferences只能向系統(tǒng)文件中寫入NVP這樣的鍵值對,如果要寫入更多信息可以使用文件存儲,Android系統(tǒng)為開發(fā)者提供了內(nèi)部文件的存儲機制以及對外部存儲器的訪問機制,開發(fā)者可以在程序中實現(xiàn)對內(nèi)部文件和外部文件的訪問。7.3.1預(yù)備知識Android中不僅支持Java中的IO類和方法,還提供了兩個方法:openFileOutput(
)和openFileInput(
),用于簡化文件的讀寫操作。openFileOutput(
)方法用于打開文件,為寫入數(shù)據(jù)而作準(zhǔn)備。如果文件不存在則會自動創(chuàng)建一個新文件,其格式如下:publicFileOutputStreamopenFileOutput(StringfileName,intmode)該方法返回一個FileOutputStream對象,使用FileOutputStream對象就可以向文件中寫入二進制數(shù)據(jù)。它的第一個參數(shù)filenName,指的是文件的名稱,注意,這里文件的名稱不能帶有路徑,只能包含文件名和擴展名,如“SimpleFile.txt”,如果文件創(chuàng)建成功,系統(tǒng)會將其保存在/data/data/<packagename>/files目錄中,因此不需要指定文件的路徑。方法的第二個參數(shù)mode,是文件的訪問模式,Android支持4種訪問模式,見表7-1。openFileInput(
)方法用于打開文件,讀取文件的內(nèi)容。如果文件不存在會拋出一個FileNotFoundException異常。其格式如下:publicFileInputStreamopenFileInput(StringfileName)該方法返回一個FileInputStream對象,使用FileInputStream對象就可以從文件中讀取二進制數(shù)據(jù)。它的參數(shù)是文件名稱,同樣不需要包含文件的路徑。表7-14種文件訪問模式模式名說明MODE_PRIVATE私有模式,只有文件的創(chuàng)建程序能訪問文件MODE_APPEND追加模式,將內(nèi)容追加到文件的末尾MODE_WORLD_READABLE全局讀,允許其他程序讀文件MODE_WORLD_WRITEABLE全局寫,允許其他程序?qū)懳募?.3.2電話號碼文件存儲的實現(xiàn)首先建立如圖7.3所示的界面,界面中包含兩個EditText組件分別用于輸入姓名和電話;兩個Button組件:“寫數(shù)據(jù)”按鈕用于保存姓名和電話到“SimpleFile.txt”文件中,“讀數(shù)據(jù)”按鈕用于從“SimpleFile.txt”文件中讀出數(shù)據(jù)并顯示在TextView組件上。教學(xué)過程及內(nèi)容備注圖7.3文件訪問示例“寫數(shù)據(jù)”按鈕的事件處理代碼:classWriteListenerimplementsOnClickListener{@OverridepublicvoidonClick(Viewarg0){FileOutputStreamfos=null;try{fos=openFileOutput(fileName,Context.MODE_APPEND);StringName=editName.getTe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省商丘市九校聯(lián)考2025-2026學(xué)年上學(xué)期期末九年級物理試卷(含答案)
- 化工公司級安全培訓(xùn)課件
- 2026年美國經(jīng)濟展望:邁向更大失衡
- 2026年濟南商河縣事業(yè)單位公開招聘初級綜合類崗位人員(59人)備考考試題庫及答案解析
- 市場調(diào)查及咨詢服務(wù)公司管理制度
- 2026四川宜賓市珙縣退役軍人事務(wù)局招聘民兵專職教練員3人備考考試題庫及答案解析
- 化學(xué)幫扶活動策劃方案(3篇)
- 內(nèi)部管理制度的依據(jù)(3篇)
- 培訓(xùn)機構(gòu)健康排查管理制度(3篇)
- 怎么策劃母嬰活動方案(3篇)
- 書館數(shù)據(jù)管理制度規(guī)范
- 2025年延安市市直事業(yè)單位選聘(76人)考試參考試題及答案解析
- 學(xué)堂在線 雨課堂 學(xué)堂云 唐宋詞鑒賞 章節(jié)測試答案
- GB/T 31051-2025起重機工作和非工作狀態(tài)下的錨定裝置
- 科大訊飛招聘在線測評題
- 醫(yī)療護具租賃合同模板
- 兒童性格發(fā)展與個性獨立性的培養(yǎng)
- 2024常壓儲罐檢驗人員能力評價導(dǎo)則
- 大學(xué)生預(yù)征對象登記表模板
- 胸外科-胸部創(chuàng)傷
- 2023版設(shè)備管理體系標(biāo)準(zhǔn)
評論
0/150
提交評論