Android應(yīng)用開發(fā)教程03_第1頁
Android應(yīng)用開發(fā)教程03_第2頁
Android應(yīng)用開發(fā)教程03_第3頁
Android應(yīng)用開發(fā)教程03_第4頁
Android應(yīng)用開發(fā)教程03_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

應(yīng)用項目的任務(wù)、進程和線程任務(wù),進程,線程應(yīng)用項目生命周期生命周期,Activity中的生命周期方法應(yīng)用項目的界面控制概述界面控件描述,控件交互控制目錄CONTENTS010203組件間的通信Intent,IntentFilter04Android應(yīng)用的控制機制第3章用戶界面狀態(tài)保存SharedPreferences,Bundle05應(yīng)用項目的界面控制概述PART.01界面控制概述在Android中,每一個Activity就是一個單獨的屏幕顯示。Activity中的內(nèi)容在屏幕上的顯示稱作用戶界面(UserInterface,UI)。

用戶界面UI用戶界面中可顯示的內(nèi)容有很多,如文本框、按鈕、列表框、圖片、進度條等,這些用戶界面元素被稱為控件。大部分控件是可見的。在Android中,所有的可視控件都繼承自View類??丶iew界面控制概述

Activity中控件的繪制,既可以使用XML文件描述,也可以通過成員方法在Java代碼中動態(tài)設(shè)置。本著MVC的設(shè)計思想,推薦使用XML文件來描述界面的布局。使用XML聲明法來描述應(yīng)用項目的可視控件及其控件屬性的信息,此文件稱為布局文件。

每一個Activity對應(yīng)一個布局文件,所有布局文件都存放在應(yīng)用項目目錄下的“res/layout”子目錄內(nèi)。

布局文件

實現(xiàn)Activity類使用Java代碼。在代碼文件中定義Activity的顯示時機,以及顯示、退出時Activity狀態(tài)信息的保存與恢復,用戶交互操作時各控件的事件響應(yīng)等控制邏輯。類實現(xiàn)代碼一個Activity可以啟動另外一個Activity,實現(xiàn)方法是把請求信息放到一個Intent對象里,并把它傳遞給startActivity()。Intent任務(wù)、進程和線程PART.02任務(wù)完成用戶的一個目的的所有Activity組成一個任務(wù),Android系統(tǒng)用一個任務(wù)棧來記錄一個任務(wù)。任務(wù)是一組以棧的模式將這些Activity組件聚集在一起的集合,這個棧稱作任務(wù)棧(TaskStack)。任務(wù)棧只有在棧頂?shù)腁ctivity,才會有機會與用戶進行交互。

新加入的Activity組件,位于棧頂。當棧頂?shù)腁ctivity完成使命時,任務(wù)將其退棧,并讓下一個Activity跑到棧頂與用戶面對面,直至棧中再無Activity,任務(wù)結(jié)束。工作原理進程進程(process)是低級核心處理過程。當某個組件第一次運行的時候,Android就啟動了一個進程。默認情況下,所有的組件和程序運行在這個進程和線程中。

組件運行的進程由Androidmanifest文件控制,組件的元素都包含一個process屬性,這個屬性就是設(shè)置組件運行的進程。進程在Android操作系統(tǒng)中,進程是應(yīng)用項目的具體實現(xiàn),它們的主要用途是:改善穩(wěn)定性、安全性,通過把未信任或者不穩(wěn)定的代碼放入獨立的進程的方法中。簡化在同一進程中多個.apk文件的運行。有助于系統(tǒng)管理資源,通過把重量級代碼放入獨立的進程,當進度被殺掉時,與程序的其他部分無關(guān)。進程作用前臺進程可見進程服務(wù)進程后臺進程擁有一個正在與用戶交互的Activity。擁有一個綁定到正在與用戶交互的Activity上的Service。擁有一個前臺運行的Service。擁有一個正執(zhí)行其生命周期回調(diào)方法的Service。擁有正在執(zhí)行其onReceive()方法的BroadcastReceiver。擁有一個不在前臺但仍可見的Activity。一個可視的Activity所綁定的Service。有一個由startService()方法啟動的Service。支持正在處理的不需要可見界面運行的Service。一個進程擁有一個當前不可見的Activity。目前沒有服務(wù)的Service??者M程不擁有任何Active組件??者M程是為了提高下一次運行它時的啟動速度。進程分類一般不會被殺死極端情況下才被殺死任意時刻可被殺死已被殺死不可被殺死線程每個進程有一到多個線程運行在其中。進程中的所有組件都在UI線程(用戶界面線程)中實例化。線程通過Java的標準對象Thread創(chuàng)建。線程不要阻塞UI線程。如果在UI線程中執(zhí)行阻塞或者耗時操作會導致UI線程無法響應(yīng)用戶請求。不能在非UI線程(也稱為工作線程)中更新UI。這是因為Android的UI控件都是線程不安全的。線程編程準則應(yīng)用項目生命周期PART.0302040103當Activity處于Paused或者Stopped狀態(tài),該Activity被系統(tǒng)將從內(nèi)存中刪除時銷毀狀態(tài)Destroyed當Activity失去焦點,但是依然可見時暫停狀態(tài)Paused在Activity啟動之后并獲得焦點,與用戶進行交互時運行狀態(tài)Running當Activity被新的Activity完全覆蓋,并不可見時停止狀態(tài)StoppedActivity生命周期狀態(tài)05當Activity被壓入棧頂,顯示在屏幕的前臺時啟動狀態(tài)StartingActivity生命周期狀態(tài)啟動狀態(tài)運行狀態(tài)

暫停狀態(tài)停止狀態(tài)銷毀狀態(tài)Activity首次被創(chuàng)建被Dialog或者透明的Activity覆蓋被另一個Activity

覆蓋,不可見被覆蓋的Activity返回被重新激活系統(tǒng)內(nèi)存不足,被回收系統(tǒng)內(nèi)存嚴重不足,被回收發(fā)生異?;蚱渌闆rActivity新實例啟動Activity生命周期回調(diào)方法方法說明下一個被調(diào)用的方法onCreate()在Activity第一次被創(chuàng)建的時候調(diào)用。在此做所有初始化設(shè)置,如創(chuàng)建視圖、綁定數(shù)據(jù)至列表等。onStart()onRestart()在Activity停止后,在再次啟動之前被調(diào)用。onStart()onStart()當Activity變?yōu)橛脩艨梢娭氨徽{(diào)用。onResume()或onStop()onResume()在Activity開始與用戶進行交互之前被調(diào)用。此時Activity位于堆棧頂部,并接受用戶輸入。onPause()onPause()當系統(tǒng)將要啟動另一個Activity時調(diào)用。此方法主要用來將未保存的變化進行持久化,停止動畫和其他耗費CPU的動作等。onResume()或onStop()onStop()當Activity不再為用戶可見時調(diào)用此方法。這可能發(fā)生在它被銷毀或者另一個Activity(可能是現(xiàn)存的或者是新的)回到運行狀態(tài)并覆蓋了它。onRestart()或onDestroy()onDestroy()在Activity銷毀前調(diào)用。這是Activity接收的最后一個調(diào)用。這可能發(fā)生在Activity結(jié)束(調(diào)用了它的finish()方法)或者因為系統(tǒng)需要空間所以臨時銷毀了此Acitivity的實例時?!猳nSaveInstanceState(Bundle),調(diào)用該方法讓Activity可以保存每個實例的狀態(tài)。接下來調(diào)用onPause()或onStop()。onRestoreInstanceState(Bundle),使用了前一方法保存狀態(tài),現(xiàn)在要重新初始化本Activity時調(diào)用該方法。接下來調(diào)用onResume()。Activity生命周期狀態(tài)與回調(diào)方法ActivitylaunchedActivityrunningActivityshutdownonCreate()AppprocesskilledonStart()onResume()

onRestart()onPause()onStop()onDestroy()用戶返回到該Activity用戶導航到該Activity用戶導航到該Activity另一個Activity被推送到前臺該Activity不再可見該Activity已完成或正在被系統(tǒng)銷毀優(yōu)先級更高的App需要內(nèi)存Activity生命周期回調(diào)方法如果有兩個Activity分別為ActivityA、ActivityB,依次進行下列操作,Android的生命周期方法調(diào)用的情況如下。多個Ativity生命周期方法的調(diào)用順序先啟動ActivityA,方法回調(diào)的次序是:onCreate(A)→onStart(A)→onResume(A)

ActivityA不關(guān)閉,跳轉(zhuǎn)第二個ActivityB,方法回調(diào)的次序是:onPause(A)→onCreate(B)→onStart(B)→onResume(B)→onStop(A)

在ActivityB上單擊返回鍵后,回到ActivityA,方法回調(diào)的次序是:

onPause(B)→onActivityforResult(A)→onRestart(A)→onStart(A)→onResume(A)→onStop(B)→onDestroy(B)在ActivityA上單擊退出鍵退出應(yīng)用時,方法回調(diào)的次序是:onPause(A)→onStop(A)→onDestroy(A)

組件間的通信PART.04Intent

Intent類都定義在android.content.Intent。一個Intent對象(IntentObjects)其實就是一堆信息的捆綁,Intent對象由組件名稱、動作、數(shù)據(jù)、類別、附加信息及標志6部分組成。組件名稱(Componentname):是指要處理該Intent的組件名字。組件名字可選,指定組件名稱為顯式意圖;不指定組件名稱為隱式意圖。動作(Action):是一個將被執(zhí)行的動作的字符串命名;或者對于廣播意圖而言,是發(fā)生并被報告的動作。數(shù)據(jù)(Data):是為動作提供要操作的信息,用指向數(shù)據(jù)的一個資源標識符(URI)來表示。類別(Category):是關(guān)于Intent中action要執(zhí)行的動作的附加描述,它是一個字符串。附加信息(Extra):是要遞交給Intent處理組件的附加信息鍵-值對。標志(Flag):是各種類型的標志。該標志用來指示Android系統(tǒng)如何去加載一個Activity和啟動后如何對待它。Intent對象IntentIntent對象的動作常量,由大寫英文單詞和下劃線組成常量目標組件含義ACTION_CALLActivity撥打電話,被呼叫的聯(lián)系人在數(shù)據(jù)中指定ACTION_EDITActivity顯示數(shù)據(jù)給用戶進行編輯ACTION_GET_CONTENTActivity讓用戶選擇數(shù)據(jù)并返回ACTION_INSERTActivity在容器中插入一個空項ACTION_MAINActivity啟動一個任務(wù)的起始Activity,沒有數(shù)據(jù)輸入和數(shù)據(jù)返回ACTION_PICKActivity從數(shù)據(jù)中選擇一個子項目,并返回所選中的項目ACTION_BATTERY_LOWBroadcastReceiver提示電池電量低ACTION_SCREEN_ONBroadcastReceiver屏幕已開啟ACTION_HEADSET_PLUGBroadcastReceiver耳機插拔ACTION_TIMEZONE_CHANGEDBroadcastReceiver時區(qū)變化Intent數(shù)據(jù)的一個資源標識符(URI)來表示。URI的格式為“scheme://host:port/path”。不同的動作伴隨著不同種類的數(shù)據(jù)規(guī)格,這個數(shù)據(jù)類型可以從URI里推斷出來。Intent數(shù)據(jù)與動作相關(guān)如果動作是ACTION_EDIT,數(shù)據(jù)字段會包含可編輯文檔的URI。如果動作是ACTION_CALL,數(shù)據(jù)字段會是一個含呼叫電話號碼的URI。獲取一個URI的語句格式為:Uriuri=Uri.parse(<字符串>);例如,在Java代碼中,獲取指向1號聯(lián)系人的URI,語句為:

Uriuri1=Uri.parse("content://contacts/1");IntentIntent對象的類別定義了若干類別常量常量含義CATEGORY_ALTERNATIVE在某種數(shù)據(jù)類型的項目上可以替代默認執(zhí)行的動作。例如,一個聯(lián)系人的默認動作是瀏覽它,替代的可能是去編輯或刪除它CATEGORY_BROWSABLE目標Activity可以被瀏覽器安全地喚起來顯示被一個鏈接所引用的數(shù)據(jù)。例如,一張圖片或一條E-mail消息CATEGORY_DEFAULT設(shè)置這個類別來讓組件成為Intent過濾器中定義的data的默認動作。這對使用顯式Intent啟動的Activity來說也是必要的CATEGORY_HOME這個Activity將顯示桌面,也就是用戶開機后看到的第一個屏幕或者按HOME鍵時看到的屏幕CATEGORY_LAUNCHER這個Activity可以是一個任務(wù)的初始Activity,并被列在應(yīng)用項目啟動器的頂層CATEGORY_PREFERENCE目標Activity是一個選擇面板Intent創(chuàng)建一個Intent對象的語句格式為:Intentintent=newIntent(<動作>,<內(nèi)容>);Intent對象創(chuàng)建方法設(shè)置Intent對象的動作:通過setAction()方法。指定Intent對象的數(shù)據(jù):通過setData()方法指定一個URI數(shù)據(jù);通過setType()方法指定MIME;通過setDataAndType()方法可同時指定URI和MIME數(shù)據(jù)。添加Intent對象的類別:通過addCategory()方法。添加Intent對象的附加數(shù)據(jù):通過putExtras()和getExtras()方法來插入和讀取附加數(shù)據(jù)。IntentFilter過濾器描述組件的一個能力,它通知系統(tǒng)哪些組件可以處理哪些Intent。一系列組件想要接收的Intent,實際上按照一個期望的類型來進行Intent濾入,同時濾出不想要的Intent。注意:IntentFilter只針對隱式意圖起作用。IntentFilter在Android系統(tǒng)中,可以用Java代碼來設(shè)置IntentFilter類的一個實例,但是在更多情況下,是在AndroidManifest.xml清單文件中設(shè)置<intent-filter>元素。IntentFilter創(chuàng)建方法Intent解析一個組件沒有任何的意圖過濾器,那它只能接收顯式意圖。一個帶過濾器的組件可以同時接收顯式和隱式意圖。當一個Intent對象被一個意圖過濾器測試時,一般是通過對動作、數(shù)據(jù)(URI和MIME)和類別三個方面進行監(jiān)測的。通過比較Intent對象的內(nèi)容和意圖過濾器,找到相匹配的目標組件。組件與IntentFilterIntent解析一個Intent只能設(shè)置一種Action;一個IntentFilter卻可以設(shè)置多個Action過濾。當IntentFilter設(shè)置了多個Action過濾時,只需一個滿足即可完成Action驗證。檢查Action包括:對數(shù)據(jù)的URI進行監(jiān)測;對數(shù)據(jù)的類型進行監(jiān)測。只有這些信息完全匹配時,Data的驗證才會成功。檢查Data在IntentFilter中同樣可以設(shè)置多個Category。當Intent中的Category與IntentFilter中的一個Category完全匹配時,此Category驗證通過。檢查Category一個隱式意圖為了遞交到擁有這個過濾器的組件,它必須全部通過以下三項測試。如果即使只有一個不通過,Android系統(tǒng)都不會把它遞交給這個組件。Intent應(yīng)用案例在兩個Activity組件中都使用按鈕控件,在布局文件中,需要聲明按鈕控件。如果僅從ActivityA跳轉(zhuǎn)到ActivityB,使用startActivity()方法;如果ActivityA跳轉(zhuǎn)到ActivityB,然后從ActivityB返回到ActivityA,且需要傳遞數(shù)據(jù)時,則使用startActivityForResult()方法。兩個Activity相互調(diào)用,在創(chuàng)建Intent對象時最好用顯式的。在ActivityA中,使用startActivityForResult()方法發(fā)送Intent給ActivityB,重寫onActivityResult()方法用于處理返回的數(shù)據(jù);在ActivityB中,使用setResut()方法準備好回傳數(shù)據(jù),使用finish()的方法來將打包好的數(shù)據(jù)回傳給ActivityA;返回到ActivityA后系統(tǒng)會自動執(zhí)行A中的onActivityResult()方法。設(shè)計思路【案例3.1】設(shè)計兩個Activity:MainActivity和SubActivity。MainActivity為首次進行的Activity,其中有個按鈕,單擊該按鈕可跳轉(zhuǎn)到SubActivity上,并且在標題欄顯示跳轉(zhuǎn)信息;SubActivity上也有一個按鈕,單擊該按鈕可以返回到MainActivity上,且在標題欄顯示跳轉(zhuǎn)返回信息。如此循環(huán)往復。Intent應(yīng)用案例運行結(jié)果在AndroidStudio的模擬器上運行。首次運行項目,標題欄會顯示“首次進入主頁面!”的內(nèi)容,如圖(a)所示。在主Activity中,單擊“跳轉(zhuǎn)到下一頁”,進入子Activity,如圖(b)所示。在子Activity中單擊“返回到首頁”,返回主Activity,注意此時的標題欄內(nèi)容攜帶了子Activity的信息,如圖(c)所示。(a)首次進入主Activity界面(b)單擊按鈕后進入子Activity(c)單擊按鈕后返回主Activity用戶界面狀態(tài)保存PART.05SharedPreferencesSharedPreferences是Android平臺上一個輕量級的存儲類。以一個鍵-值對的二元組的形式存儲。通常用來存儲簡單的配置信息,支持String、Long、Float、Integer、Boolean等數(shù)據(jù)類型。SharedPreferences對象的訪問權(quán)限是私有的。保存在一個內(nèi)部的XML文件中。是一種簡單、持久化的存儲設(shè)置。BundleBundle類用作攜帶數(shù)據(jù),它類似于Map,用于存放鍵-值對形式的值??蓚鬟f基本數(shù)據(jù)類型,比如int、float、string等。利用Bundle綁定數(shù)據(jù)的封裝能力,將要數(shù)據(jù)或參數(shù)通過Intent對象來傳遞到不同的Activity。Bundle對象中的數(shù)據(jù)是保存在應(yīng)用項目的上下文中,會隨著相應(yīng)的上下文銷毀而消失。用戶界面狀態(tài)保存

Android使用SharedPreferences對象或Bundle對象來保存Activity實例的狀態(tài)信息。BundleBundle對象常用的方法方法返回值說明clear()—清除所有保存的數(shù)據(jù)clone()Bundle對象克隆當前Bundle對象get(Stri

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論