版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android平板應(yīng)用開發(fā)教程輕松自信地設(shè)計(jì)和交付精美的平板App。課程概述培養(yǎng)基于Android平臺(tái)的平板應(yīng)用開發(fā)與設(shè)計(jì)能力,培養(yǎng)具有開發(fā)優(yōu)質(zhì)用戶體驗(yàn)和高可靠性的平板App。教學(xué)內(nèi)容Android開發(fā)基礎(chǔ)View與WidgetsAndroid四大組件平板UI設(shè)計(jì)模式使用Fragment設(shè)計(jì)UI平板特色控件設(shè)計(jì)平板桌面開發(fā)使用HTML5開發(fā)平板應(yīng)用課程核心培養(yǎng)目標(biāo)教學(xué)目標(biāo)
1、熟練使用Android基本開發(fā)工具與研發(fā)環(huán)境的能力。2、熟練使用AndroidActivity、View、ViewGroup等視圖組件,能夠通過(guò)實(shí)踐項(xiàng)目理解如何構(gòu)建優(yōu)秀用戶體驗(yàn)的人機(jī)對(duì)話界面。3、熟練使用Android布局套件,能夠通過(guò)實(shí)踐項(xiàng)目了解Fragment在項(xiàng)目中不同的運(yùn)用場(chǎng)景。4、深入理解Android視圖組件的構(gòu)建規(guī)則、能夠合理修改Android視圖的各個(gè)部件,形成合理的自定義視圖,滿足復(fù)雜的工程級(jí)平板人機(jī)對(duì)話要求。Android開發(fā)基礎(chǔ)1Eclipse中的Android開發(fā)創(chuàng)建項(xiàng)目①啟動(dòng)Eclipse集成開發(fā)環(huán)境。②運(yùn)行File→New→AndroidApplicationProject菜單命令,打開NewProject向?qū)А"蹎螕鬘ext按鈕,缺省ConfigureProject設(shè)置和Configuretheattributeoftheiconset界面設(shè)置,選擇BlankActivity,單擊Finish按鈕,完成項(xiàng)目的創(chuàng)建。Eclipse中的Android開發(fā)創(chuàng)建SDCard①在Windows中,運(yùn)行“開始”→“運(yùn)行”菜單命令,在打開的“運(yùn)行”窗口中輸入“cmd”并單擊“確定”按鈕,打開命令行窗口。②在窗口中輸入如下命令:mksdcard-lmycard500MF:\\mysdcard.imgEclipse中的Android開發(fā)創(chuàng)建AVD①在Eclipse中,運(yùn)行Window→AndroidVirtualDeviceManager菜單命令,打開AndroidVirtualDeviceManager對(duì)話框。Eclipse中的Android開發(fā)運(yùn)行項(xiàng)目①在Eclipse的項(xiàng)目窗口中,右擊項(xiàng)目節(jié)點(diǎn)名稱HelloWorld,運(yùn)行Runas→RunConfigurations菜單命令,打開RunConfigurations對(duì)話框。②在對(duì)話框的左側(cè)選擇AndroidApplication,并單擊上方的Newlaunchconfiguration按鈕,在右側(cè)的Android標(biāo)簽頁(yè)中單擊Browse按鈕,打開ProjectSelection對(duì)話框,選擇項(xiàng)目。③在對(duì)話框的Target標(biāo)簽頁(yè)中的AVD列表中勾選合適的Android模擬器。單擊Apply和Run按鈕,運(yùn)行程序。Android項(xiàng)目架構(gòu)SRCMainActivity是一個(gè)用戶定義的Activity,繼承自android.app.Activity類。Activity是應(yīng)用程序的表示層,用于構(gòu)建應(yīng)用程序的UI界面。onCreate(Bundle)方法是Activity生命周期的組成部分,用于初始化Activity.調(diào)用setContentView()方法來(lái)指定顯示布局,然后通過(guò)findViewById(int)方法在布局中檢索需要交互的UI控件。Bundle類用于Activity之間傳遞數(shù)據(jù)。Android項(xiàng)目架構(gòu)RESdrawabledrawable用于存放圖片文件資源,或者能被編譯為drawable類型的XML文件。包括drawable-hdpi、drawable-mdpi、drawable-ldpi和drawable-xhdpi等多個(gè)存放圖片的文件夾。對(duì)drawable中的圖片資源的引用主要有3種形式:①②在Java代碼中引用的方法是R.drawable.image_name。③在Java代碼中也可以通過(guò)getResources().getDrawable(R.drawable.image_name)方法返回R.drawable.image_name所代表的Drawable對(duì)象,或通過(guò)getResources().openRawResource(R.drawable.image_name)方法獲取Drawable的輸入流。Android項(xiàng)目架構(gòu)RESlayoutlayout中存放用于編譯成屏幕布局的XML文件。這些文件可以使用可視化編輯器生成,也可以通過(guò)編寫XML生成。對(duì)layout中的布局資源的引用主要有2種形式:①在Java代碼中引用的方法是R.layout.。②Android項(xiàng)目架構(gòu)RESvaluesstrings.xml用于定義字符串和數(shù)值。array.xml用于定義數(shù)組信息。colors.xml用于定義顏色。dimens.xml用于定義尺寸數(shù)據(jù)。styles.xml用于定義樣式。Android項(xiàng)目架構(gòu)AndroidManifest.xmlAndroidManifest.xml是一個(gè)用來(lái)描述Android應(yīng)用程序整體信息的結(jié)構(gòu)化的XML配置文件。該文件描述了應(yīng)用程序的環(huán)境及其支持的Activity、Service、Intent接收器和ContentProvider提供程序以及權(quán)限、外部庫(kù)和設(shè)備特性等信息。在Android啟動(dòng)一個(gè)組件之前,它必須能夠了解到這個(gè)組件的存在。因此,應(yīng)用程序?qū)⑺鼈兊慕M件定義在Android包中的AndroidManifest.xml文件中。在所有的應(yīng)用程序中都以AndroidManifest.xml命名,并保存在項(xiàng)目的根目錄下。Eclipse常用窗口開啟窗口①執(zhí)行Window→ShowView→others菜單命令,在打開的ShowView對(duì)話框中,展開Android節(jié)點(diǎn)。②執(zhí)行Window→OpenPerspective→others菜單命令,打開OpenPerspective對(duì)話框。Eclipse常用窗口Console窗口Console窗口輸出一些程序運(yùn)行過(guò)程中的相關(guān)信息。Eclipse常用窗口LogCat窗口LogCat有5種信息:①Log.v():Log.v的輸出顏色是黑色。②Log.d():Log.d的輸出顏色是藍(lán)色。③Log.i():Log.i的輸出顏色是綠色。④Log.w():Log.w的輸出顏色是橙色。⑤Log.e():Log.e的輸出顏色是紅色。Eclipse常用窗口DDMS
窗口DDMS提供了設(shè)備截屏、針對(duì)特定的進(jìn)程查看正在運(yùn)行的線程以及堆信息、模擬電話呼叫以及虛擬地理坐標(biāo)等服務(wù)。View與Widgets2圖形布局編輯器ADTADT(AndroidDevelopmentTools,是一款用于開發(fā)Android應(yīng)用程序的Eclipse插件)為AndroidUI提供了一種圖形布局編輯器,當(dāng)打開layout下的xml布局文件時(shí),系統(tǒng)自動(dòng)打開這個(gè)UI設(shè)計(jì)工具。圖形布局編輯器Palette窗口Palette窗口提供了構(gòu)建AndroidUI的基本控件,可以直接拖動(dòng)Palette窗口中的控件到上圖中部的布局容器中。圖形布局編輯器Configuration面板Configuration面板可以根據(jù)項(xiàng)目的不同應(yīng)用環(huán)境設(shè)置不同的參數(shù)。圖形布局編輯器布局容器窗口布局容器窗口就是中部的圖形化編輯區(qū)域,該區(qū)域展示了在當(dāng)前硬件環(huán)境配置下的顯示效果??梢灾苯訌腜alette窗口拖動(dòng)控件到布局容器窗口中。圖形布局編輯器Outline窗口Outline窗口包括兩個(gè)部分:上方的窗口顯示了當(dāng)前布局的層次結(jié)構(gòu),也可以直接從Palette窗口拖動(dòng)控件到Outline窗口中。下方的窗口是當(dāng)前選中的控件的屬性設(shè)置窗口,在屬性設(shè)置窗口中,可以設(shè)置控件的布局參數(shù)、顯示樣式等信息。常見布局方式創(chuàng)建布局①在Android項(xiàng)目的res/layout節(jié)點(diǎn)上右單擊,執(zhí)行New→AndroidXMLFile命令,打開NewAndroidXMLFile對(duì)話框。②在File框中輸入布局文件名,在RootElement列表中選擇布局的根節(jié)點(diǎn),單擊Next按鈕,打開ChooseConfigurationFolder對(duì)話框。常見布局方式相對(duì)布局相對(duì)布局(RelativeLayout)方式是將ViewGroup以相對(duì)位置顯示它的子視圖元素,一個(gè)視圖可以指定相對(duì)于它的兄弟視圖的位置(例如在給定視圖的左邊或者下面)或相對(duì)于RelativeLayout的特定區(qū)域的位置(例如底部對(duì)齊或中間偏左)。常見布局方式線性布局線性布局(LinearLayout)方式是將ViewGroup以線性方向顯示它的子視圖元素,即后一個(gè)元素垂直或水平顯示在上一個(gè)子元素之后。常見布局方式幀布局幀布局(FrameLayout)方式是將ViewGroup中的視圖自動(dòng)的按照層次堆放在左上角,后加進(jìn)來(lái)的控件覆蓋前面的控件。定義任何空間的位置相關(guān)的屬性都毫無(wú)意義。優(yōu)化布局復(fù)用布局兩種復(fù)用布局方式:通過(guò)<include>標(biāo)簽來(lái)嵌入布局通過(guò)Fragment來(lái)復(fù)用布局。優(yōu)化布局多設(shè)備支持創(chuàng)建不同的Layout布局文件MyProject/res/layout/main.xmllayout-large/main.xml優(yōu)化布局多設(shè)備支持創(chuàng)建橫豎屏Layout布局文件MyProject/res/layout/main.xmllayout-land/main.xml優(yōu)化布局調(diào)試用戶界面HierachyViewer的主要功能有:從可視化的角度直觀地獲得UI布局設(shè)計(jì)結(jié)構(gòu)和各種屬性的信息,幫助開發(fā)者優(yōu)化布局設(shè)計(jì);結(jié)合調(diào)試幫助觀察特定的UI對(duì)象進(jìn)行invalidate和requestLayout操作的過(guò)程。表單控件文本控件TextViewandroid.widget.TextView是android.view.View類的直接子類,TextView自身的直接子類包括Button、EditText等,間接子類包括AutoCompleteTextView、CheckBox、RadioButton等。表單控件文本控件EditTextEditText是一個(gè)用于文本輸入的控件,是TextView的直接子類。EditText常見使用inputType屬性為文本框指定輸入類型,使用hint屬性為文本框指定輸入提示信息。表單控件按鈕控件ButtonButton是一個(gè)按鈕控件,用來(lái)響應(yīng)用戶的單擊事件。對(duì)每個(gè)Button實(shí)例設(shè)置setOnClickListener()方法,然后使當(dāng)前Activity實(shí)現(xiàn)OnClickListener接口,然后重載接口方法onClick()來(lái)處理按鈕的響應(yīng)事件。表單控件選擇控件RadioGroup與RadioButtonRadioButton是一種雙狀態(tài)的按鈕,或處于選中狀態(tài),或處于未選中狀態(tài)。表單控件選擇控件CheckBoxCheckBox是一種有雙狀態(tài)按鈕的特殊類型,可以選中或者不選中。其使用方式與RadioButton類似,主要區(qū)別是可以在一組CheckBox中有多個(gè)被選中。表單控件進(jìn)度條
控件ProgressBarProgressBar一般用在某項(xiàng)延續(xù)性工作的進(jìn)展過(guò)程中,為了不讓用戶覺得程序無(wú)響應(yīng),需要有個(gè)活動(dòng)的進(jìn)度條,表示此過(guò)程正在進(jìn)行中。或者是在某些操作的進(jìn)度中的可視指示器,為用戶呈現(xiàn)操作的進(jìn)度。ProgressBar有一個(gè)次要的進(jìn)度條,用來(lái)顯示中間進(jìn)度,如流媒體播放的緩沖區(qū)的進(jìn)度。一個(gè)進(jìn)度條也可不確定其進(jìn)度。在不確定模式下,進(jìn)度條顯示循環(huán)動(dòng)畫。這種模式常用于應(yīng)用程序使用任務(wù)的長(zhǎng)度是未知的情況下。適配器控件適配器適配器(Adapter)是Android中數(shù)據(jù)和適配器控件之間的橋接,負(fù)責(zé)將每個(gè)數(shù)據(jù)項(xiàng)顯示在子View上。Android系統(tǒng)提供了如下幾種適配器:ArrayAdapter<T>、BaseAdapter、CursorAdapter、HeaderViewListAdapter、ListAdapter、ResourceCursorAdapter、SimpleAdapter、SimpleCursorAdapter、SpinnerAdapter、WrapperListAdapter,比較常用的有BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。適配器控件BaseAdapter使用BaseAdapter一般遵循以下步驟:①定義AdapterView子Item的布局。②獲取數(shù)據(jù)集合。③實(shí)現(xiàn)BaseAdapter實(shí)例,主要是實(shí)現(xiàn)一個(gè)構(gòu)造方法(主要用于獲取數(shù)據(jù)集合),并重載BaseAdapter的4個(gè)方法。應(yīng)用適配器的一般格式:AdapterView.setAdapter(myBaseAdapter)適配器控件GalleryGallery是一個(gè)鎖定中心條目并且擁有水平滾動(dòng)列表的視圖,一般用于一組相同尺寸圖片的顯示。適配器控件SpinnerSpinner是下拉列表框控件。Spinner的使用一般遵循以下過(guò)程:①生成一個(gè)ArrayAdapter,用于Spinner下拉列表的內(nèi)容。②通過(guò)adapter.setDropDownViewResource()方法設(shè)置下拉列表樣式。③使用Spinner.setAdapter(adapter)方法將數(shù)據(jù)源綁定。④使用Spinner.setOnItemSelectedListener()方法響應(yīng)下拉列表的選擇。適配器控件ListViewListView是用于顯示一組列表項(xiàng)的列表視圖。ListActivity是Activity的子類,用于顯示一個(gè)綁定到數(shù)組或游標(biāo)等數(shù)據(jù)源的列表,并且為列表的每一項(xiàng)提供一個(gè)單擊事件的管理方法,當(dāng)用戶單擊其中的列表項(xiàng)時(shí)就能進(jìn)行相應(yīng)的處理。適配器控件GridViewGridView是一種在平面上可顯示多個(gè)條目的可滾動(dòng)的柵格視圖控件,該控件中的條目通過(guò)一個(gè)Adapter和該控件進(jìn)行關(guān)聯(lián)。Widgets事件處理按鍵事件處理物理鍵盤監(jiān)聽對(duì)物理鍵盤使用onKeyDown(intkeyCode,KeyEventevent)、onKeyUp(intkeyCode,KeyEventevent)方法來(lái)監(jiān)聽按鍵的按下和釋放事件。Widgets事件處理按鍵事件處理軟鍵盤監(jiān)聽使用dispatchKeyEvent(KeyEventKEvent)方法對(duì)軟鍵盤的按鍵進(jìn)行監(jiān)聽。Widgets事件處理觸屏事件處理觸屏事件通過(guò)onTouchEvent(MotionEventevent)方法進(jìn)行監(jiān)聽。多點(diǎn)觸屏也是使用onTouchEvent(MotionEventevent)方法進(jìn)行監(jiān)聽,在監(jiān)聽時(shí),通過(guò)Event的getPointerCount()獲取觸屏點(diǎn)個(gè)數(shù),然后進(jìn)行多點(diǎn)觸屏事件處理。Widgets事件處理手勢(shì)事件處理Android系統(tǒng)提供了GestureDetector類,將基本的觸屏事件轉(zhuǎn)變成各種不同的手勢(shì)動(dòng)作。通過(guò)實(shí)現(xiàn)GestureDetector.OnGestureListener接口來(lái)構(gòu)造一個(gè)GestureDetector的一個(gè)實(shí)例。如果僅僅只是想處理少部分的手勢(shì)動(dòng)作,可以選擇繼承GestureDetector.SimpleOnGestureListener而不用去實(shí)現(xiàn)GestureDetector.OnGestureListener接口。Widgets事件處理感應(yīng)事件處理傳感器是通過(guò)監(jiān)聽機(jī)制來(lái)實(shí)現(xiàn)的,一般步驟如下:①創(chuàng)建SensorManager對(duì)象。②實(shí)現(xiàn)SensorListener接口。③注冊(cè)SensorListener。對(duì)話框ToastToast是一個(gè)簡(jiǎn)單的彈出式信息,最適合于確定用戶正在關(guān)注屏幕時(shí)顯示簡(jiǎn)短信息。對(duì)話框NotificationNotification顯示一些簡(jiǎn)要的信息,用戶在任何時(shí)候都可以從狀態(tài)欄訪問(wèn)它們。它提供升級(jí)、提醒以及一些重要但不至于直接打斷用戶的信息。將狀態(tài)欄滑下可以打開通知抽屜。單擊消息將會(huì)打開相關(guān)的應(yīng)用。對(duì)話框Alert
DialogAlertDialog.Builder中的重要方法:
setTitle():為對(duì)話框設(shè)置標(biāo)題。
setIcon():為對(duì)話框設(shè)置圖標(biāo)。
setMessage:為對(duì)話框設(shè)置內(nèi)容。
setView():給對(duì)話框設(shè)置自定義樣式。
setItems():設(shè)置對(duì)話框要顯示的一個(gè)列表,一般用于顯示幾個(gè)命令時(shí)使用。
setPositiveButton():給對(duì)話框添加"Yes"按鈕。setNegativeButton():對(duì)話框添加"No"按鈕。
create():創(chuàng)建對(duì)話框。
show():顯示對(duì)話框。菜單OptionsMenuOptionsMenu是作用于當(dāng)前Activity全局的一種菜單,其中的菜單項(xiàng)命令對(duì)當(dāng)前Activity的進(jìn)程都有效。在大部分的手機(jī)上,用戶按下"MENU"鍵就會(huì)在屏幕下方顯示OptionsMenu。用戶再次按下"MENU"鍵或"返回"鍵就會(huì)關(guān)閉OptionsMenu。菜單OptionsMenu創(chuàng)建OptionsMenu的三個(gè)回調(diào)方法:onCreateOptionsMenu(Menu)onOptionsItemSelected(MenuItem)onPrepareOptionsMenu(Menu)菜單ContextMenuContextMenu是當(dāng)用戶長(zhǎng)按一個(gè)注冊(cè)了ContextMenu的View時(shí)出現(xiàn)的浮動(dòng)菜單項(xiàng)目列表。ContextMenu類似于桌面操作系統(tǒng)的右鍵菜單,對(duì)于不同的對(duì)象給出不同的菜單命令。菜單ContextMenu創(chuàng)建ContextMenu的三個(gè)回調(diào)方法:onCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo)onContextItemSelected()registerForContextMenu(Viewview)動(dòng)作欄動(dòng)作欄設(shè)計(jì)創(chuàng)建菜單資源時(shí),如果為某一菜單項(xiàng)添加android:showAsAction=“ifRoom”聲明,則該菜單項(xiàng)將作為動(dòng)作欄子項(xiàng)來(lái)顯示。動(dòng)作欄ActionModeActionMode是一個(gè)顯示在屏幕頂部的操作欄,允許用戶選擇多個(gè)選項(xiàng),ActionMode在AndroidAPI11之后才有支持。當(dāng)用戶激活A(yù)ctionMode后,一個(gè)上下文操作欄會(huì)出現(xiàn)在屏幕的頂端,呈現(xiàn)出用戶可以對(duì)當(dāng)前選中項(xiàng)目進(jìn)行的操作選項(xiàng)。Android四大組件3Activity創(chuàng)建Activity①在Eclipse中,選擇項(xiàng)目src下的包節(jié)點(diǎn)。②單擊工具欄上的新建按鈕,在打開的新建對(duì)話框中選擇Android→AndroidActivity,單擊下一步。③選擇BlankActivity,單擊下一步,打開NewActivity對(duì)話框,并輸入Activity的相關(guān)信息。ActivityActivity生命周期ActivityActivity狀態(tài)遷移
Resumed狀態(tài)處于Resumed狀態(tài)(有時(shí)也簡(jiǎn)稱為運(yùn)行狀態(tài))的Activity處于棧頂,且是可見的,有焦點(diǎn)的,能夠與用戶互動(dòng)。當(dāng)另一個(gè)Activity進(jìn)入棧頂時(shí),當(dāng)前的Activity將進(jìn)入Paused狀態(tài)。
Paused狀態(tài)另一個(gè)Activity在屏幕前,取得焦點(diǎn),但原來(lái)的Activity仍然可見。暫停的Activity完全是存在的(Activity對(duì)象保留在內(nèi)存中,它維護(hù)所有狀態(tài)和成員信息,并保持窗口管理器的聯(lián)系),但在極低的內(nèi)存的情況下,可以被系統(tǒng)終止。
Stoped狀態(tài)Activity完全被另一個(gè)Activity遮住了(現(xiàn)在Activity是在后臺(tái))。此時(shí),Activity也仍然存在。然而,它已不再是對(duì)用戶可見。在極低的內(nèi)存的情況下,可以被系統(tǒng)終止。Activity顯式調(diào)用Activity隱式調(diào)用ActivityActivity的回調(diào)startActivityForResult(Intentintent,intrequestCode)onActivityResult(intrequestCode,intresultCode,Intentdata)setResult(intresultCode,Intentdata)Activity使用Intent
傳遞數(shù)據(jù)Intent提供了各種常用類型重載后的putExtra()方法,如:putExtra(Stringname,Stringvalue)、putExtra(Stringname,longvalue)。在putExtra()方法內(nèi)部會(huì)判斷當(dāng)前Intent對(duì)象內(nèi)部是否已經(jīng)存在一個(gè)Bundle對(duì)象,如果不存在就會(huì)新建Bundle對(duì)象,以后調(diào)用putExtra()方法傳入的值都會(huì)存放于該Bundle對(duì)象。Activity使用Bundle
傳遞數(shù)據(jù)Bundle類是一個(gè)封裝了Map<String,Object>的鍵值對(duì),可以從String類型的鍵中獲得任意類型的對(duì)象。使用Bundle傳遞數(shù)據(jù)一般遵循如下步驟:在傳送數(shù)據(jù)的Activity中:①新建一個(gè)Bundle類;②通過(guò)Bundle.putString(key,value)等方法將數(shù)據(jù)存入Bundle;③通過(guò)Intent.putExtras(Bundle)方法將數(shù)據(jù)附加到Intent對(duì)象上。Activity使用Bundle
傳遞數(shù)據(jù)Bundle類是一個(gè)封裝了Map<String,Object>的鍵值對(duì),可以從String類型的鍵中獲得任意類型的對(duì)象。使用Bundle傳遞數(shù)據(jù)一般遵循如下步驟:在接收數(shù)據(jù)的Activity中:①新建一個(gè)Bundle類;②通過(guò)Intent.getExtras()方法從Intent對(duì)象獲取封裝了的數(shù)據(jù)包;③通過(guò)Bundle.getString(key)等方法從鍵中獲取數(shù)據(jù)。Activity使用Application
傳遞數(shù)據(jù)使用ApplicationContext。一般步驟如下:①新建一個(gè)類,繼承自Application。②在AndroidManifest.xml的application標(biāo)簽中。③MyAppappState=((MyApp)getApplicationContext());ActivityActivity棧一個(gè)設(shè)備的主屏幕是大多數(shù)任務(wù)棧的起點(diǎn)。當(dāng)用戶觸屏圖標(biāo)(或者在屏幕上的快捷方式)時(shí),該應(yīng)用程序就會(huì)到達(dá)任務(wù)棧的最前面。如果該應(yīng)用在任務(wù)棧中不存在,就會(huì)在任務(wù)棧中創(chuàng)建一個(gè)新的任務(wù),并將該應(yīng)用作為“主”Activity放置在根任務(wù)棧中。堆棧的特性是后進(jìn)先出,兩個(gè)主要操作是壓棧和出棧。每當(dāng)用戶切換到一個(gè)新的Activity時(shí),Android會(huì)將其壓入到StackBack,使其成為棧頂,也就是用戶當(dāng)前看到的Activity;棧頂后面的Activity此時(shí)呈Stop狀態(tài),對(duì)應(yīng)著Activity生命周期方法中的onStop(),并且Android還會(huì)保留其狀態(tài)。這就是壓棧操作。當(dāng)用戶按下返回鍵,Android就會(huì)將棧頂部的Activity彈出來(lái),緊隨其后的Activity頂上去,就實(shí)現(xiàn)了回退的功能。被彈出的Activity此時(shí)呈Destroy狀態(tài),對(duì)應(yīng)著onDestroy(),新棧頂Activity呈Resume狀態(tài),對(duì)應(yīng)著onResume()。這就是出棧操作。Activity任務(wù)管理用戶為了完成某個(gè)功能而執(zhí)行的一系列操作形成了一個(gè)Activity序列,這個(gè)序列在Android中稱之為任務(wù),它是從用戶體驗(yàn)的角度出發(fā),把一組相關(guān)的Activity(這些Activity可以來(lái)自不同的應(yīng)用程序)組織在一起而抽象出來(lái)的概念。因此,任務(wù)包含一個(gè)按照用戶交互順序排序的Activity集合,任務(wù)可以把每個(gè)Activity按照用戶執(zhí)行順序放到后臺(tái)并且保持狀態(tài)而且不丟失工作。當(dāng)一個(gè)Activity啟動(dòng)時(shí),如果任務(wù)也隨之啟動(dòng)的話,那么這個(gè)Activity就是根Activity。Android系統(tǒng)內(nèi)部一旦有任務(wù),那么按返回鍵就可以回到上一個(gè)Activity。Activity??梢允嵌鄠€(gè)任務(wù)的組成部分。ActivityActivity加載模式standardsingleTopsingleTasksingleInstanceActivityActivity狀態(tài)protectedvoidonSaveInstanceState(BundleoutState)72Service處于android.app包中;Service是Android最基本的應(yīng)用程序組件;運(yùn)行在后臺(tái)、不可見但可交互的一種服務(wù)組件。概述73Service3個(gè)階段創(chuàng)建服務(wù)階段開始服務(wù)階段銷毀服務(wù)階段生命
周期74ServiceContext.startService()Service會(huì)一直運(yùn)行,直到通過(guò)Context.stopService()或者stopSelf()停止它生命周期為:onCreate-->onStart(可多次調(diào)用)-->onDestroy多次通過(guò)startService()啟動(dòng)某個(gè)服務(wù)并不會(huì)生成多個(gè)實(shí)例,但會(huì)導(dǎo)致服務(wù)的onStart()被多次調(diào)用注意,onCreate()只在Service第一次啟動(dòng)時(shí)被調(diào)用。啟動(dòng)
方式75ServiceContext.bindService()獲得一個(gè)服務(wù)的鏈接,這個(gè)鏈接一直保持到通過(guò)Context.unbindService()斷掉它生命周期為:onCreate-->onBind-->Servicerunning-->onUnbind-->onDestroy通過(guò)bindService()方法啟動(dòng)的Service會(huì)一直存在到?jīng)]有任何客戶端與它保持連接為止注意,使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒有關(guān)連,即使調(diào)用者退出了,服務(wù)仍然運(yùn)行。使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止。啟動(dòng)
方式76ServiceAIDLAndroidInterfaceDefinitionLanguageandroid接口描述語(yǔ)言是一個(gè)IDL語(yǔ)言可以使在一個(gè)android設(shè)備上運(yùn)行的兩個(gè)進(jìn)程使用內(nèi)部通信進(jìn)程進(jìn)行交互遠(yuǎn)程
調(diào)用77Service遠(yuǎn)程服務(wù)設(shè)計(jì)步驟1、創(chuàng)建AIDL文件,
在這個(gè)文件里面定義接口,
該接口定義了可供客戶端訪問(wèn)的方法和屬性;2、編譯AIDL文件,
Eclipse會(huì)根據(jù)adil文件自動(dòng)生成java文件并編譯;3、編譯器根據(jù)AIDL接口,
產(chǎn)生一個(gè)java接口,這個(gè)接口有一個(gè)名為Stub的內(nèi)部抽象類,它繼承擴(kuò)展了接口并實(shí)現(xiàn)了遠(yuǎn)程調(diào)用需要的幾個(gè)方法;4、向客戶端提供接口ITaskBinder;5、在服務(wù)器端回調(diào)客戶端的函數(shù)。遠(yuǎn)程
調(diào)用78Service實(shí)現(xiàn)接口的幾個(gè)原則拋出的異常不要返回給調(diào)用者;跨進(jìn)程拋異常處理是不可取的;IPC調(diào)用是同步的;不能在AIDL接口中聲明靜態(tài)屬性。遠(yuǎn)程
調(diào)用79ServiceIPC的調(diào)用步驟1.聲明一個(gè)接口類型的變量,該接口類型在.aidl文件中定義;2.實(shí)現(xiàn)ServiceConnection;3.調(diào)用ApplicationContext.bindService(),并在ServiceConnection實(shí)現(xiàn)中進(jìn)行傳遞;
4.在ServiceConnection.onServiceConnected()實(shí)現(xiàn)中,會(huì)接收一個(gè)IBinder實(shí)例(被調(diào)用的Service),調(diào)用YourInterfaceName.Stub.asInterface((IBinder)service)將參數(shù)轉(zhuǎn)換為YourInterface類型;5.調(diào)用接口中定義的方法??傄獧z測(cè)到DeadObjectException異常,該異常在連接斷開時(shí)被拋出。它只會(huì)被遠(yuǎn)程方法拋出;6.斷開連接,調(diào)用接口實(shí)例中的ApplicationContext.unbindService()。遠(yuǎn)程
調(diào)用80ServiceIPC的調(diào)用步驟1.聲明一個(gè)接口類型的變量,該接口類型在.aidl文件中定義;2.實(shí)現(xiàn)ServiceConnection;3.調(diào)用ApplicationContext.bindService(),并在ServiceConnection實(shí)現(xiàn)中進(jìn)行傳遞;
4.在ServiceConnection.onServiceConnected()實(shí)現(xiàn)中,會(huì)接收一個(gè)IBinder實(shí)例(被調(diào)用的Service),調(diào)用YourInterfaceName.Stub.asInterface((IBinder)service)將參數(shù)轉(zhuǎn)換為YourInterface類型;5.調(diào)用接口中定義的方法??傄獧z測(cè)到DeadObjectException異常,該異常在連接斷開時(shí)被拋出。它只會(huì)被遠(yuǎn)程方法拋出;6.斷開連接,調(diào)用接口實(shí)例中的ApplicationContext.unbindService()。遠(yuǎn)程
調(diào)用81BroadcastReceiverBroadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。BroadcastReceiver是對(duì)發(fā)送出來(lái)的Broadcast進(jìn)行過(guò)濾接收并響應(yīng)的一類組件。用于異步接收廣播Intent。概述82BroadcastReceiver靜態(tài)注冊(cè)靜態(tài)注冊(cè)一般為BroadcastReceiver單獨(dú)編寫一個(gè)繼承自BroadcastReceiver類,然后在AndroidManifest.xml中用<receiver>標(biāo)簽申明注冊(cè),并在標(biāo)簽內(nèi)用<intent-filter>標(biāo)簽設(shè)置過(guò)濾器。繼承BroadcastReceiver,并重寫onReceive()方法:
publicclassIncomingSMSReceiverextendsBroadcastReceiver{
@OverridepublicvoidonReceive(Contextcontext,Intentintent){
}
}
注冊(cè)83BroadcastReceiver動(dòng)態(tài)注冊(cè)動(dòng)態(tài)注冊(cè)一般步驟:先定義一個(gè)BroadcastReceiver實(shí)例;在代碼中先定義并設(shè)置好一個(gè)IntentFilter對(duì)象;在需要注冊(cè)的地方調(diào)用Context.registerReceiver()方法;取消時(shí)調(diào)用Context.unregisterReceiver()方法。
注意:用動(dòng)態(tài)方式注冊(cè)的BroadcastReceiver的Context對(duì)象被銷毀時(shí),BroadcastReceiver也就自動(dòng)取消注冊(cè)了。注冊(cè)84BroadcastReceiver一般過(guò)程:首先在需要發(fā)送信息的地方,把要發(fā)送的信息和用于過(guò)濾的信息(如Action、Category)裝入一個(gè)Intent對(duì)象;然后通過(guò)調(diào)用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent對(duì)象以廣播方式發(fā)送出去。當(dāng)Intent發(fā)送以后,所有已經(jīng)注冊(cè)的BroadcastReceiver會(huì)檢查注冊(cè)時(shí)的IntentFilter是否與發(fā)送的Intent相匹配,若匹配則就會(huì)調(diào)用BroadcastReceiver的onReceive()方法。發(fā)送廣播85BroadcastReceiver普通廣播是完全異步的,可以在同一時(shí)刻(邏輯上)被所有接收者接收到。優(yōu)點(diǎn):效率比較高。缺點(diǎn):接收者不能將處理結(jié)果傳遞給下一個(gè)接收者,并且無(wú)法終止廣播Intent的傳播。兩種
廣播86BroadcastReceiver有序廣播是按照接收者聲明的優(yōu)先級(jí)別,被接收者依次接收廣播。優(yōu)先級(jí)別在<intent-filter>的android:priority屬性中聲明,數(shù)值越大優(yōu)先級(jí)別越高,取值范圍:-1000到1000。也可以調(diào)用IntentFilter對(duì)象的setPriority()進(jìn)行設(shè)置。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無(wú)法接收到廣播。兩種
廣播87ContentProvider主要用于在不同應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享概述88ContentProvider定義一個(gè)CONTENT_URI常量用于標(biāo)識(shí)共享數(shù)據(jù)路徑定義一個(gè)繼承ContentProvider的類用于提供數(shù)據(jù)生成一個(gè)ContentResolver實(shí)例,實(shí)現(xiàn)query,insert,update,delete等方法在androidmanifest.xml中進(jìn)行聲明使用
方式89ContentProvider概述Uri代表了要操作的數(shù)據(jù)ContentResolver通過(guò)URI來(lái)查詢ContentProvider中提供的數(shù)據(jù)URI90ContentProvider組成A:標(biāo)準(zhǔn)前綴,說(shuō)明被ContentProvider控制數(shù)據(jù)B:URI的標(biāo)識(shí),定義了是哪個(gè)ContentProvider提供這些數(shù)據(jù)。C:路徑D:表示需要獲取的記錄的ID;如果沒有ID,就表示返回全部URI91ContentProviderUriMatcher:用于匹配Uri注冊(cè)需要匹配的Uri路徑使用uriMatcher.match(uri)方法對(duì)輸入的Uri進(jìn)行匹配ContentUris:用于獲取Uri路徑后面的ID部分URI
工具92ContentProvider概述通過(guò)ContentResolver發(fā)起數(shù)據(jù)請(qǐng)求,系統(tǒng)檢查請(qǐng)求的URI所屬的提供者,并將該請(qǐng)求轉(zhuǎn)發(fā)到注冊(cè)了此URI的ContentProvider進(jìn)行處理。對(duì)數(shù)據(jù)進(jìn)行添加、刪除、更新等操作。Content
Resolver93ContentProviderActivityApplicationActivityApplicationActivityContentProviderServiceApplicationDataSQLiteXMLRemoteStoreContentResolverContentResolverContentResolverContent
Resolver94ContentProvider主要接口返回值方法聲明finalUriinsert(Uriurl,ContentValuesvalues)finalintdelete(Uriurl,Stringwhere,String[]selectionArgs)finalCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)finalintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs)Content
Resolver95Intent是一種運(yùn)行時(shí)綁定(runtimebinding)機(jī)制,它能在程序運(yùn)行的過(guò)程中連接兩個(gè)不同的組件。概述96IntentActivityServiceBroadcastReceiverAndroidManifest.xmlIntent作用97Intent顯式Intent隱式Intent種類98Intent在初始化時(shí)已經(jīng)通過(guò)名字指定目標(biāo)組件setComponent(ComponentName)setClass(Context,Class)setClassName()一般用于啟動(dòng)其它應(yīng)用程序的組件顯式Intent99Intent常見方式if(type.equals("audio/*")||type.equals("video/*")){Intentintent=newIntent();intent.setClass(MainActivity.this,MediaPlayerActivity.class);Bundlebl=newBundle();bl.putString("mediapath",f.getAbsolutePath());bl.putString("mediatype",type);intent.putExtras(bl);startActivity(intent);return;}顯式Intent100Intent一般形式Intent<Intent_name>=newIntent(<ACTION>,<Data>);
startActivity(newIntent("com.google.app.CLEARSPLASH"));隱式Intent101Intent5種屬性:Action為請(qǐng)求的動(dòng)作命名系統(tǒng)定義的動(dòng)作ACTION_CALL
程序定義的動(dòng)作ject.SHOW_COLOR重要方法setAction()getAction()隱式Intent102Intent5種屬性:Data需要操作的數(shù)據(jù)的URI和它的MIME類型Data一般和Action有關(guān)用Uri格式表示重要方法setData()、setType()、setDataAndType()getData()、getType()隱式Intent103Intent5種屬性:Category包含了關(guān)于處理該intent的組件的種類的信息一個(gè)Intent對(duì)象可以有任意個(gè)categoryIntent類定義了許多category常數(shù)重要方法
addCategory()removeCategorygetCategories()隱式Intent104Intent5種屬性:Extras為鍵值對(duì)形式的附加信息
Intent對(duì)象通過(guò)put...()和set...()方法來(lái)設(shè)定和獲取附加信息借助Bundle對(duì)象存放數(shù)據(jù)后,使用putExtras()和getExtras()對(duì)數(shù)據(jù)進(jìn)行封裝
5種屬性:Flags指示android系統(tǒng)如何啟動(dòng)一個(gè)activity和啟動(dòng)后如何處理它的標(biāo)志。隱式Intent105Intent解析Android系統(tǒng)根據(jù)比較Intent的內(nèi)容和intentfilter來(lái)找到最合適的組件來(lái)處理它。一個(gè)intentfilter是IntentFilter類的實(shí)例,但是它一般不出現(xiàn)在代碼中,而是出現(xiàn)在androidManifest文件中,以<intent-filter>的形式設(shè)置(例外:broadcastreceiver的intentfilter是使用Context.registerReceiver()來(lái)動(dòng)態(tài)設(shè)定的,其intentfilter也是在代碼中創(chuàng)建的)隱式Intent106Intent解析——intentfilterintentfilter是組件的一個(gè)相關(guān)結(jié)構(gòu),表示其接受intent的能力如果一個(gè)組件沒有intentfilter,那么它只能接受顯式intent
當(dāng)一個(gè)intent和intentfilter比較時(shí),只考慮三個(gè)屬性:action,data,category,extra和flag在intent解析中沒有用
activity,service和broadcastreceiver可以有多個(gè)intentfilter來(lái)告知系統(tǒng)它們能接受什么樣的隱式intent隱式Intent107Intent解析——安全一個(gè)intentfilter不一定安全可靠,一個(gè)應(yīng)用程序可以讓它的某個(gè)組件去接受隱式intent,但是它沒法防止這個(gè)組件接受顯示intent,其它的程序總是可以使用自定義的數(shù)據(jù)加上顯式的程序名稱來(lái)調(diào)用該組件。
隱式Intent108Intent解析——匹配Action一個(gè)intent對(duì)象只能指定一個(gè)action,而一個(gè)intentfilter可以指定多個(gè)action;一個(gè)intent對(duì)象的action必須和intentfilter中的某一個(gè)action匹配,才能通過(guò);如果intentfilter的action列表為空,則所有的Intent將檢測(cè)不通過(guò);如果intent對(duì)象不指定action,并且intentfilter的action列表不為空,則通過(guò)所有測(cè)試。隱式Intent109Intent解析——匹配Category一個(gè)intent要通過(guò)category測(cè)試,那么該intent對(duì)象中的所有category都必須和filter中的某一個(gè)匹配;理論上來(lái)說(shuō),一個(gè)intent對(duì)象如果沒有指定category,它應(yīng)該能通過(guò)任意的category測(cè)試。(例外:android把所有的傳給startActivity()的隱式intent看做至少有一個(gè)category:“ent.category.DEFAULT”。隱式Intent110Intent解析——匹配Data一個(gè)不含uri也不含數(shù)據(jù)類型的intent對(duì)象只通過(guò)兩者都不包含的filter;一個(gè)含uri但不含數(shù)據(jù)類型的intent對(duì)象(并且不能從uri推斷數(shù)據(jù)類型的),僅當(dāng)過(guò)濾器也不指定數(shù)據(jù)類型,同時(shí)它們的uri匹配,才能通過(guò)檢測(cè)。例如,mailto:和tel:都不指定實(shí)際數(shù)據(jù)。一個(gè)只包含數(shù)據(jù)類型但不包含uri的intent,僅當(dāng)過(guò)濾也只包含數(shù)據(jù)類型且與Intent相同,才通過(guò)測(cè)試。一個(gè)既包含uri又包含數(shù)據(jù)類型的intent對(duì)象只通過(guò)這樣的filter:intent對(duì)象的數(shù)據(jù)類型和filter中的一個(gè)類型匹配,intent對(duì)象的uri要么和filter的uri匹配,要么intent對(duì)象的uri為content:或者file:,并且filter不指定uri。隱式Intent平板UI設(shè)計(jì)模式4設(shè)計(jì)模式官方文檔使用Fragment設(shè)計(jì)UI5創(chuàng)建Fragment特性Fragment是Activity的用戶界面中的一部分或一種行為??梢栽谝粋€(gè)單獨(dú)的Activity中把多個(gè)Fragment組合成為一個(gè)多區(qū)域的UI,也可以在多個(gè)Activity中復(fù)用一個(gè)Fragment??梢园袴ragment認(rèn)為是模塊化的Activity片段,它具有自己的生命周期,處理自己的輸入事件,并可以在Activity運(yùn)行時(shí)動(dòng)態(tài)添加或刪除Fragment。Fragment不能獨(dú)立存在,它必須嵌入到Activity中,而且Fragment的生命周期直接受所在的Activity的影響。創(chuàng)建Fragment創(chuàng)建創(chuàng)建Fragment和創(chuàng)建Activity類似,一般需要實(shí)現(xiàn)Fragment的布局XML文件并通過(guò)onCreateView()方法加載布局文件,最后將Fragment添加到Activity中。創(chuàng)建Fragment添加到Activity在Activity的布局文件里聲明Fragment<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal">
<fragmentandroid:android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="3"class="com.nexes.manager.tablet.DirListActivity"/>
<fragmentandroid:android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"class="com.nexes.manager.tablet.DirContentActivity"/>
</LinearLayout>創(chuàng)建Fragment添加到Activity在代碼中添加Fragment到一個(gè)ViewGroup01 FragmentManagerfragmentManager=getFragmentManager();02 FragmentTransactionfragmentTransaction=03 fragmentManager.beginTransaction();04 ExampleFragmentfragment=newExampleFragment();05 fragmentTransaction.add(R.id.fragment_container,fragment);06 fragmentTmit();管理Fragment生命周期管理FragmentFragmentManagerFragmentManager的功能包括: 使用findFragmentById()(用于在Activity布局中提供有界面的Fragment)或者findFragmentByTag()獲取Activity中存在的Fragment(用于有界面或者沒有界面的Fragment)。 使用popBackStack()(模仿用戶的返回命令)從后臺(tái)棧彈出Fragment。 使用addOnBackStackChangedListener()注冊(cè)一個(gè)監(jiān)聽后臺(tái)棧變化的監(jiān)聽器。 使用FragmentManager打開一個(gè)FragmentTransaction來(lái)執(zhí)行Fragment的事務(wù),例如添加或刪除Fragment。管理FragmentFragment之間通信在Fragment內(nèi)部定義一個(gè)回調(diào)接口,然后在宿主Activity中實(shí)現(xiàn)它。當(dāng)Activity通過(guò)接口接收到回調(diào)時(shí),可以在必要時(shí)與布局中的其它Fragment共享信息。如果Activity沒有實(shí)現(xiàn)這個(gè)接口,那么Fragment會(huì)拋出一個(gè)ClassCaseException異常。平板特色控件設(shè)計(jì)6動(dòng)作欄功能直接在動(dòng)作欄中顯示選項(xiàng)菜單中的項(xiàng)目。提供在不同F(xiàn)ragment之間的導(dǎo)航標(biāo)簽。提供導(dǎo)航用的下拉列表。提供交互式的動(dòng)作視圖以代替動(dòng)作項(xiàng)目。動(dòng)作欄創(chuàng)建01 @Override02 publicbooleanonCreateOptionsMenu(Menumenu){03 //Menuitemsdefaulttonevershowintheactionbar04 menu.add("Normalitem");05 06 MenuItemactionItem=menu.add("ActionButton");07 //Itemsthatshowasactionsshouldfavorthe"ifroom"setting08 actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);09 actionItem.setIcon(android.R.drawable.ic_menu_share);10 returntrue;11 }動(dòng)作欄創(chuàng)建01 <?xmlversion="1.0"encoding="utf-8"?>02 <menuxmlns:android="">03 <itemandroid:04 android:05 android:06 android:showAsAction="ifRoom|withText"/>07 </menu>動(dòng)作欄導(dǎo)航應(yīng)用程序圖標(biāo)導(dǎo)航@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){caseandroid.R.id.home://appiconinActionBarclicked;gohomeIntentintent=newIntent(this,HomeActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);returntrue;default:returnsuper.onOptionsItemSelected(item);}}動(dòng)作欄導(dǎo)航添加導(dǎo)航標(biāo)簽頁(yè)①創(chuàng)建一個(gè)ActionBar.TabListener的實(shí)現(xiàn)來(lái)處理動(dòng)作欄標(biāo)簽的交互事件。②對(duì)于要添加的每個(gè)標(biāo)簽頁(yè),通過(guò)調(diào)用setTabListener()來(lái)實(shí)例化ActionBar.Tab和設(shè)置ActionBar.TabListener。還可以用setText()和setIcon()設(shè)置標(biāo)簽頁(yè)的標(biāo)題和圖標(biāo)。③通過(guò)調(diào)用addTab()添加每個(gè)標(biāo)簽頁(yè)到動(dòng)作欄。動(dòng)作欄導(dǎo)航添加下拉導(dǎo)航①創(chuàng)建一個(gè)SpinnerAdapter,為下拉提供可選擇項(xiàng)目的列表,以及當(dāng)繪畫列表中每個(gè)項(xiàng)目時(shí)所使用的布局。②實(shí)現(xiàn)ActionBar.OnNavigationListener以定義用戶從列表中選中一個(gè)項(xiàng)目時(shí)所發(fā)生的行為。③使用setNavigationMode()為動(dòng)作欄開啟導(dǎo)航模式。④用setListNavigationCallbacks()設(shè)置下拉列表的回調(diào)。動(dòng)作欄ActionMode①實(shí)現(xiàn)ActionMode.Callback接口。在它的回調(diào)方法中,可以設(shè)置操作的上下文操作欄?;卣{(diào)方法包括:
onCreateActionMode(ActionModemode,Menumenu)第一次被創(chuàng)建的時(shí)候調(diào)用。
onPrepareActionMode(ActionModemode,Menumenu)刷新菜單列表的時(shí)候被調(diào)用,一般使用false即可。
onActionItemClicked(ActionModemode,MenuItemitem)菜單項(xiàng)被選中的時(shí)候被調(diào)用。
onDestroyActionMode(ActionModemode)退出或銷毀菜單的時(shí)候被調(diào)用。②在需要顯示上下文操作欄的時(shí)候,調(diào)用startActionMode(ActionMode.Callback)。搜索面板搜索語(yǔ)音搜索。根據(jù)最近的搜索結(jié)果,給出搜索建議。根據(jù)程序的實(shí)際搜索結(jié)果,給出搜索建議。搜索面板搜索ViewPager是AndroidSDK擴(kuò)展包android-support-v4.jar中的控件,使用ViewPager能夠?qū)崿F(xiàn)只顯示當(dāng)前一組界面中的其中一個(gè)界面,當(dāng)用戶通過(guò)左右滑動(dòng)界面時(shí),當(dāng)前的屏幕顯示當(dāng)前界面和下一個(gè)界面的一部分,滑動(dòng)結(jié)束后,界面自動(dòng)跳轉(zhuǎn)到當(dāng)前選擇的界面中。搜索面板組成SearchDialog或SearchWidget的配置文件SearchableActivity搜索接口,包括SearchDialog和SearchWidget搜索面板SearchDialog為了使用SearchDialog,必須設(shè)計(jì)一個(gè)接收SearchDialog搜索請(qǐng)求的SearchableActivity,以便執(zhí)行搜索,并在AndroidManifest.xml中代表該Activity的<activity>元素中加入<meta-data>。這個(gè)<meta-data>必須包含android:value屬性,該屬性指明了SearchableActivity的類名,還必須包括屬性android:name,且其值必須為"android.app.default_searchable"。<activityandroid:name=".MainActivity"...><!--enablethesearchdialogtosendsearchestoSearchableActivity--><meta-dataandroid:name="android.app.default_searchable"android:value=".SearchableActivity"/></activity><!--thisisthesearchableactivity;itperformssearches--><activityandroid:name=".SearchableActivity"><intent-filter><actionandroid:name="ent.action.SEARCH"/></intent-filter><meta-dataandroid:name="android.app.searchable"android:搜索面板SearchWidget和SearchDialog一樣,首先應(yīng)該創(chuàng)建好searchable配置和SearchableActivity,然后為每個(gè)SearchView設(shè)置好搜索助手??梢酝ㄟ^(guò)setSearchableInfo()方法來(lái)設(shè)置SearchableInfo對(duì)象,SearchableInfo代表的是searchable配置。可以同過(guò)SearchManager的getSearchableInfo()來(lái)得到一個(gè)SearchableInfo的引用。導(dǎo)航類容器ViewPagerViewPager是AndroidSDK擴(kuò)展包android-support-v4.jar中的控件,使用ViewPager能夠?qū)崿F(xiàn)只顯示當(dāng)前一組界面中的其中一個(gè)界面,當(dāng)用戶通過(guò)左右滑動(dòng)界面時(shí),當(dāng)前的屏幕顯示當(dāng)前界面和下一個(gè)界面的一部分,滑動(dòng)結(jié)束后,界面自動(dòng)跳轉(zhuǎn)到當(dāng)前選擇的界面中。導(dǎo)航類容器View
FlipperViewFlipper繼承自ViewAnimator,用于將多個(gè)視圖組織在一起,并實(shí)現(xiàn)滑屏動(dòng)畫效果。ViewFlipper一次僅能顯示一個(gè)子視圖。如果需要,可以設(shè)置ViewFlipper的間隔時(shí)間使子視圖像幻燈片一樣自動(dòng)顯示。導(dǎo)航類容器TabHostTabHost是一種選項(xiàng)卡容器,即UI界面以選項(xiàng)卡的形式將多個(gè)Activity組合在一起,通過(guò)單擊選項(xiàng)卡標(biāo)簽顯示不同的View或Activity的內(nèi)容。TabHost的三要素是TabWidget、FrameLayout和List<TabSpec>。TabHost包含了兩種子元素:一些可以自由選擇的Tab和Tab對(duì)應(yīng)的內(nèi)容TabContent,在布局的<TabHost>下它們分別對(duì)應(yīng)TabWidget和FrameLayout。TabWidget是TabHost中的標(biāo)簽頁(yè)控件;FrameLayout是每個(gè)標(biāo)簽頁(yè)內(nèi)容的布局形式;List<TabSpec>是標(biāo)簽頁(yè)集合。特定容器WebViewWebView是AndroidView類的子類,可以在Activity布局中嵌入一個(gè)WebView控件來(lái)顯示一個(gè)網(wǎng)頁(yè)。特定容器MapView通過(guò)引用Google地圖擴(kuò)展包c(diǎn)om.google.android.maps來(lái)創(chuàng)建地圖服務(wù)應(yīng)用程序。特定容器VideoViewVideoView是Android提供的一個(gè)視頻播放控件。在布局文件中使用VideoView結(jié)合MediaController來(lái)實(shí)現(xiàn)對(duì)視頻播放的控制。平板桌面開發(fā)7簡(jiǎn)單桌面組件設(shè)計(jì)AppWidgets微型桌面應(yīng)用程序(AppWidgets)是一個(gè)可以嵌入到其他應(yīng)用程序(如主屏幕),并能定期更新其視圖的桌面小部件。一個(gè)能容納其他AppWidgets的應(yīng)用程序,稱之為AppWidgetsHost。簡(jiǎn)單桌面組件設(shè)計(jì)RemoteViewsRemoteViews類在android.widget.RemoteViews包下,是一個(gè)能夠顯示在其他進(jìn)程中的遠(yuǎn)程視圖。AppWidgets中的視圖都是通過(guò)RemoteViews表現(xiàn)的。在RemoteViews的構(gòu)造方法中,通過(guò)傳入布局文件的ID來(lái)獲取布局文件對(duì)應(yīng)的RemoteViews視圖。然后,調(diào)用RemoteViews中的方法能對(duì)布局中的控件進(jìn)行設(shè)置。簡(jiǎn)單桌面組件設(shè)計(jì)AppWidget
ProviderInfoAppWidgetProviderInfo用于定義AppWidgets的基本屬性,如顯示的最小尺寸、初始布局資源、更新頻率和ConfigurationActivity等。AppWidgetProviderInfo在res/xml目錄中定義。AppWidgetProviderInfo的定義必須在一個(gè)只有單一的<appwidget-provider>元素的XML資源文件中進(jìn)行。簡(jiǎn)單桌面組件設(shè)計(jì)AppWidget
ProviderAppWidgetProvider繼承于BroadcastReceiver,它對(duì)AppWidgets的廣播進(jìn)行了簡(jiǎn)單分類,并封裝了處理的統(tǒng)一接口,通過(guò)這些方法可以很方便和AppWidgets進(jìn)行交互。AppWidgetProvider基于廣播事件。當(dāng)AppWidgets進(jìn)行更新、啟用、禁用和刪除時(shí),在AppWidgetProvider中,將收到其對(duì)應(yīng)的廣播,并調(diào)用相應(yīng)的回調(diào)方法進(jìn)行處理。簡(jiǎn)單桌面組件設(shè)計(jì)聲明AppWidget創(chuàng)建了AppWidgetProviderInfo并實(shí)現(xiàn)了AppWidgetProvider之后,還需要在AndroidManifest.xml文件中聲明該AppWidgetProvider類。在<meta-data>元素中,必須要指定AppWidgetProviderInfo資源文件,需要定義以下2個(gè)屬性:
android:name屬性
android:resource屬性配置和管理桌面組件ConfigurationActivity如果想讓用戶在添加一個(gè)新的App
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度特色銷售團(tuán)隊(duì)勞動(dòng)合同范本3篇
- 2023年K12課外輔導(dǎo)項(xiàng)目融資計(jì)劃書
- 2025版甲乙丙三方教育產(chǎn)業(yè)股權(quán)重組與教育資源整合合同3篇
- 2025版供應(yīng)鏈金融合同續(xù)借及風(fēng)險(xiǎn)控制條款3篇
- 課題申報(bào)書:城市健身新空間供需匹配測(cè)度與影響機(jī)制分析-以武漢市中心城區(qū)為例
- 2025版環(huán)保設(shè)備采購(gòu)合同條款詳解2篇
- 2025版智能制造企業(yè)數(shù)據(jù)資產(chǎn)保密與管理協(xié)議3篇
- 二零二五年國(guó)際貿(mào)易實(shí)務(wù)貨物檢驗(yàn)與檢疫合同3篇
- 支氣管哮喘的急性發(fā)作處理:如何迅速控制癥狀
- 2025版礦產(chǎn)品銷售與供應(yīng)鏈優(yōu)化協(xié)議3篇
- 灌溉用水循環(huán)利用技術(shù)
- 急停急起運(yùn)球教學(xué)設(shè)計(jì)
- 2024年江西省三校生高職英語(yǔ)高考試卷
- 中國(guó)古代文學(xué)智慧樹知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 重慶市南岸區(qū)2022-2023學(xué)年五年級(jí)上學(xué)期期末語(yǔ)文試卷
- 現(xiàn)澆鋼筋混凝土整體式肋梁樓蓋結(jié)構(gòu)-課程設(shè)計(jì)
- 掛籃施工及安全控制連續(xù)梁施工安全培訓(xùn)課件
- 學(xué)生學(xué)習(xí)概覽StudentLearningProfile
- 小班數(shù)學(xué)《認(rèn)識(shí)1到10的數(shù)字》課件
- 手工花項(xiàng)目策劃書
- 服務(wù)器維保應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論