Android培訓(xùn)資料_第1頁
Android培訓(xùn)資料_第2頁
Android培訓(xùn)資料_第3頁
Android培訓(xùn)資料_第4頁
Android培訓(xùn)資料_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 技術(shù)的學(xué)習(xí),是一種恒定的積累.好奇心?好奇心? + 引導(dǎo)引導(dǎo) = 入門!入門!一.Android開發(fā)了解Android是什么Android是一個(gè)針對(duì)移動(dòng)設(shè)備的開源軟件平臺(tái),該平臺(tái)包括操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件。Android歷史Android一詞的本義指“機(jī)器人”,同時(shí)也是Google于2007年11月5日宣布的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)的名稱。Google還聯(lián)合手機(jī)制造商、手機(jī)芯片廠商、移動(dòng)運(yùn)營(yíng)商,共同于2007年11月組建一個(gè)全球性的聯(lián)盟組織,稱作開放手機(jī)聯(lián)盟(Open HandsetAlliance),共同來開發(fā)Android。Android SDK(Softwar

2、e Development Kit, 即軟件開發(fā)工具包)Android SDK提供了在Android平臺(tái)上使用Java語言進(jìn)行Android應(yīng)用開發(fā)必須的工具和API接口。Android能干什么下面羅列了一些Android的特性,包含但不限于:1:應(yīng)用程序框架,支持組件的重用與替換2:Dalvik虛擬機(jī) 專門為移動(dòng)設(shè)備做了優(yōu)化3:內(nèi)部集成瀏覽器,該瀏覽器基于開源的WebKit引擎4:優(yōu)化的圖形庫:包括2D和3D圖形庫,3D圖形庫基于OpenGL ES(硬件加速可選)5:SQLite用作結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)6:多媒體支持 包括常見的音頻、視頻和圖片文件格式 (如 MPEG4, H.264, MP3,

3、 AAC, AMR, JPG, PNG, GIF)7:GSM電話 (依賴于硬件)8:藍(lán)牙Bluetooth, EDGE, 3G, and WiFi (依賴于硬件)9:照相機(jī),GPS,指南針,和加速度計(jì) (依賴于硬件)10:豐富的開發(fā)環(huán)境 包括設(shè)備模擬器,調(diào)試工具,內(nèi)存及性能分析圖表,和Eclipse集成開發(fā)環(huán)境插件Android有什么Android官方系統(tǒng)架構(gòu)圖:應(yīng)用程序?qū)討?yīng)用程序?qū)?Applications)應(yīng)用程序框架層應(yīng)用程序框架層(Application Framework)系統(tǒng)運(yùn)行庫層系統(tǒng)運(yùn)行庫層(Libraries+Android RunTime)Linux內(nèi)核層內(nèi)核層(Linux

4、 Kernel)應(yīng)用程序?qū)討?yīng)用程序?qū)?Applications)Android平臺(tái)的電子設(shè)備,包括Android手機(jī)、Android平板、Android MP4、Android GPS等一系列電子產(chǎn)品的火熱,很大程度上歸功于大量豐富方便的Android軟件。這其中包括email客戶端、短信、日歷、地圖、瀏覽器、聯(lián)系人管理程序等等。應(yīng)用程序框架層應(yīng)用程序框架層(Application Framework)簡(jiǎn)潔清晰的Android應(yīng)用框架為快速敏捷開發(fā)Android軟件提供了可能,這也是近兩年來Android為什么這么火熱的原因之一。Activity Manager(活動(dòng)管理器)管理各個(gè)應(yīng)用程序生

5、命周期以及通常的導(dǎo)航回退功能Window Manager(窗口管理器)管理所有的窗口程序Content Provider(內(nèi)容提供器)使得不同應(yīng)用程序之間存取或者分享數(shù)據(jù)View System(視圖系統(tǒng))構(gòu)建應(yīng)用程序的基本組件Notification Manager(通告管理器)使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息Package Manager(包管理器)Android系統(tǒng)內(nèi)的程序管理Telephony Manager(電話管理器)管理所有的移動(dòng)設(shè)備功能Resource Manager(資源管理器)提供應(yīng)用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等Locat

6、ion Manager(位置管理器)提供位置服務(wù)XMPP Service(XMPP服務(wù))提供Gtalk服務(wù)(手機(jī)24小時(shí)開機(jī),Gtalk 24小時(shí)在線!)系統(tǒng)運(yùn)行庫層系統(tǒng)運(yùn)行庫層(Libraries+Android RunTime)系統(tǒng)庫系統(tǒng)庫是應(yīng)用程序框架的支撐,是連接應(yīng)用程序框架層與Linux內(nèi)核層的重要紐帶。其主要分為如下幾個(gè)部分:Surface Manager 執(zhí)行多個(gè)應(yīng)用程序時(shí),負(fù)責(zé)管理顯示與存取操作間的互動(dòng),另外也負(fù)責(zé)2D繪圖與3D繪圖進(jìn)行顯示合成。Media Framework 多媒體庫,基于PacketVideo OpenCore,支持多種常用的音頻、視頻格式錄制和回放,編碼格

7、式包括MPEG4、MP3、H.264、AAC、ARM。SQLite 小型的關(guān)系型數(shù)據(jù)庫引擎OpenGL|ES 根據(jù)OpenGL ES 1.0API標(biāo)準(zhǔn)實(shí)現(xiàn)的3D繪圖函數(shù)庫FreeType 提供點(diǎn)陣字與向量字的描繪與顯示W(wǎng)ebKit 一套網(wǎng)頁瀏覽器的軟件引擎SGL 底層的2D圖形渲染引擎SSL 在Andorid上通信過程中實(shí)現(xiàn)握手Libc 從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫,專門為基于embedded linux的設(shè)備定制Android 運(yùn)行時(shí)Android應(yīng)用程序是采用Java語言編寫,程序在Android RunTime中執(zhí)行,其運(yùn)行時(shí)分為核心庫和Dalvik虛擬機(jī)兩部分。核心庫核心庫提供了J

8、ava語言API中的大多數(shù)功能,同時(shí)也包含了Android的一些核心API,如android.os、android.media等等。Dalvik虛擬機(jī)每個(gè)Android應(yīng)用程序都有一個(gè)專有的進(jìn)程,并且不是多個(gè)程序運(yùn)行在一個(gè)虛擬機(jī)中,而是每個(gè)Android程序都有一個(gè)Dalivik虛擬機(jī)的實(shí)例,并在該實(shí)例中執(zhí)行。Linux內(nèi)核層內(nèi)核層(Linux Kernel)Android的核心系統(tǒng)服務(wù)依賴于Linux內(nèi)核,如內(nèi)存管理、進(jìn)程管理、電源管理以及安全性、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型等。二.Android開發(fā)準(zhǔn)備構(gòu)建開發(fā)環(huán)境1:安裝JDK6以上選擇A:2:到http:/,下載Android的SDK Mana

9、ger,通過這個(gè)軟件來進(jìn)行初次的Android的SDK下載和管理。安裝完SDK后,要把sdktools設(shè)置到path里面去。3:安裝Eclipse,最好安裝最新版4:安裝ADT插件,在插件安裝后,要設(shè)置SDK的位置,在windowpreferenceandroid選項(xiàng)里面,右邊有一個(gè)SDK Location的配置。5:創(chuàng)建Android虛擬設(shè)備,也就是AVD,在windowAndroid SDK and AVD Manager里面創(chuàng)建一個(gè)新的AVD。選擇B:到http:/,可以直接下載一個(gè)google幫你集成好的Eclipse,進(jìn)行快速開發(fā)。分享:http:/ 提取碼: Uv5fCQaYAnd

10、roid模擬器Android模擬器Android SDK自帶一個(gè)移動(dòng)模擬器。它是一個(gè)可以運(yùn)行在你電腦上的虛擬設(shè)備運(yùn)行在你電腦上的虛擬設(shè)備。 Android模擬器可以讓你不需使用物理設(shè)備即可預(yù)覽、開發(fā)和測(cè)試Android應(yīng)用程序。Android模擬器新建:( *百度:eclipse android模擬器創(chuàng)建)常見的api包說明1:android.app :提供高層的程序模型、提供基本的運(yùn)行環(huán)境2:android.content :包含各種的對(duì)設(shè)備上的數(shù)據(jù)進(jìn)行訪問和發(fā)布的類3:android.database :通過內(nèi)容提供者瀏覽和操作數(shù)據(jù)庫4:android.graphics :底層的圖形庫,包

11、含畫布,顏色過濾,點(diǎn),矩形,可以將他們直接繪制到屏幕上.5:android.location :定位和相關(guān)服務(wù)的類6:android.media :提供一些類管理多種音頻、視頻的媒體接口7: :提供幫助網(wǎng)絡(luò)訪問的類,超過通常的.* 接口8:android.os :提供了系統(tǒng)服務(wù)、消息傳輸、IPC 機(jī)制9:android.opengl :提供OpenGL 的工具10:vider :提供類訪問Android 的內(nèi)容提供者11:android.telephony :提供與撥打電話相關(guān)的API 交互12:android.view :提供基礎(chǔ)的用戶界面接口框架13:android.

12、util :涉及工具性的方法,例如時(shí)間日期的操作14:android.webkit :默認(rèn)瀏覽器操作接口15:android.widget :包含各種UI 元素(大部分是可見的)在應(yīng)用程序的屏幕中使用Android工程項(xiàng)目的目錄結(jié)構(gòu)1:assets :存放原生文件,這個(gè)目錄保存的文件可以打包在程序里。和res的不同點(diǎn)是,android不為assets下的文件生成ID,如果使用assets下的文件,需要指定文件的路徑和文件名。2:bin : Java編譯輸出的路徑3:gen :存放android編譯資源文件自動(dòng)生成的R文件。4:res :存放程序所需要的資源文件,也就是非Java的文件。常見的目

13、錄有:(1)res/animator/ :XML文件,定義動(dòng)畫屬性(2)res/anim/ :XML文件,它們被編譯進(jìn)逐幀動(dòng)畫(frame by frameanimation)或補(bǔ)間動(dòng)畫 (tweened animation)對(duì)象(3)res/color/:XML文件,定義顏色狀態(tài)的列表(4)res/layout/:存放被編譯為屏幕布局:存放被編譯為屏幕布局(或屏幕的一部分或屏幕的一部分)的的XML文件文件(5)res/menu/:XML文件,用來定義應(yīng)用的菜單(6)res/drawable/:存放圖片文件,如.png, .9.png, .jpg, .gif等。放在這里的圖像資源可能會(huì)被aap

14、t(android assert packaging tool,android資源 工具)自動(dòng)地進(jìn)行無損壓縮優(yōu)化。如果你不想圖片被壓縮改變,請(qǐng)把圖像文件放在 res/raw/目錄下,這樣可以避免被自動(dòng)優(yōu)化。(7)res/raw/:直接復(fù)制到設(shè)備中的任意文件,它們無需編譯(8)res/values/:存放可以被編譯成很多種類型的資源文件, XML 格式的。常見的文件有: array.xml :定義數(shù)組 colors.xml :定義color drawable和顏色的字符串值。 dimens.xml 定義尺寸值(dimension value)。 strings.xml 定義字符串(string)

15、值。 styles.xml定義樣式(style)對(duì)象。(9)res/xml/:任意的XML文件,在運(yùn)行時(shí)可通過調(diào)用Resources.getXML()讀取。5:src : 存放Java源代碼三.Android入門基礎(chǔ)常用Widgets 常用的WidgetsTextView、(文本框)Button、 (按鈕)EditText、(編輯文本框)CheckBox、(多選框)RadioGroup、(單選組)RadioButton、(單選按鈕框)Spinner、(下拉框)ProgressBar、(進(jìn)度條框)ImageView、(圖片)Date Picker、(日期選擇)Time Picker、(時(shí)間選擇)

16、Rating Bar、(等級(jí))ListView、(列表)Action Bar、(頂部)Dialogs、(彈出層)Notifications、(通知欄)Android開發(fā)之五大布局 Xml是Android主流的靈活布局規(guī)范: 為了適應(yīng)各式各樣的界面風(fēng)格,Android系統(tǒng)提供了5種布局,這5種布局分別是: LinearLayout(線性布局):在一個(gè)方向上(垂直或水平)對(duì)齊所有子元素,一個(gè)垂直列表每行將只有一個(gè)子元素(無論它們有多寬)一個(gè)水平列表只是一列的高度(最高子元素的高度來填充).RelativeLayout(相對(duì)布局):相對(duì)布局的子控件會(huì)根據(jù)它們所設(shè)置的參照控件和參數(shù)進(jìn)行相對(duì)布局。參照控

17、件可以是父控件,也可以是其它子控件,但是被參照的控件必須要在參照它的控件之前定義. TableLayout(表格布局):把子元素放入到行與列中,不顯示行、列或是單元格邊界線單元格不能橫跨行,如HTML中一樣. AbsoluteLayout(絕對(duì)布局):絕對(duì)布局的子控件需要指定相對(duì)于此坐標(biāo)布局的橫縱坐標(biāo)值,否則將會(huì)像框架布局那樣被排在左上角(不能適應(yīng)不同的屏幕大?。?FrameLayout(框架布局):框架布局是最簡(jiǎn)單的布局形式。所有添加到這個(gè)布局中的視圖都以層疊的方式顯示。第一個(gè)添加的控件被放在最底層,最后一個(gè)添加到框架布局中的視圖顯示在最頂層,上一層的控件會(huì)覆蓋下一層的控件。利用這五種布局,

18、可以在屏幕上將控件隨心所欲的擺放,而且控件的大小和位置會(huì)隨著屏幕大小的變化作出相應(yīng)的調(diào)整。下面是這五個(gè)布局在View的繼承體系中的關(guān)系:重點(diǎn)之:線性布局效果圖:XML屬性:android:baselineAligned:是否允許用戶調(diào)整它內(nèi)容的基線。android:baselineAlignedChildIndex:當(dāng)一個(gè)線性布局與另一個(gè)布局是按基線對(duì)齊的一部分,它可以指定其內(nèi)容的基線對(duì)齊方式。android:gravity:指定如何在該對(duì)象中放置此對(duì)象的內(nèi)容。 eg:android:gravity=“center”,來讓EditText中的文字在EditText組件中居中顯示。 androi

19、d:layout_gravity=“right”,來讓EditText組件在LinearLayout中居右顯示。android:orientation:設(shè)置它內(nèi)容的對(duì)其方向(橫向/豎向)。 eg:android:orientation=“vertical”,垂直布局顯示。 android:orientation=“horizontal”,水平布局顯示。效果圖:重點(diǎn)之:相對(duì)布局下面介紹一下RelativeLayout用到的一些重要的屬性:第一類:屬性值為true或falseandroid:layout_centerHrizontal 水平居中android:layout_centerVertic

20、al 垂直居中android:layout_centerInparent 相對(duì)于父元素完全居中android:layout_alignParentBottom 貼緊父元素的下邊緣android:layout_alignParentLeft 貼緊父元素的左邊緣android:layout_alignParentRight 貼緊父元素的右邊緣android:layout_alignParentTop 貼緊父元素的上邊緣android:layout_alignWithParentIfMissing 如果對(duì)應(yīng)的兄弟元素找不到的話就以父元素做參照物第二類:屬性值必須為id的引用名“id/id-name”

21、android:layout_below 在某元素的下方android:layout_above 在某元素的的上方android:layout_toLeftOf 在某元素的左邊android:layout_toRightOf 在某元素的右邊android:layout_alignTop 本元素的上邊緣和某元素的的上邊緣對(duì)齊android:layout_alignLeft 本元素的左邊緣和某元素的的左邊緣對(duì)齊android:layout_alignBottom 本元素的下邊緣和某元素的的下邊緣對(duì)齊android:layout_alignRight 本元素的右邊緣和某元素的的右邊緣對(duì)齊第三類:屬性

22、值為具體的像素值,如30dip,40pxandroid:layout_marginBottom 離某元素底邊緣的距離android:layout_marginLeft 離某元素左邊緣的距離android:layout_marginRight 離某元素右邊緣的距離android:layout_marginTop 離某元素上邊緣的距離四.Android之HelloWorld功能需求:在在Android平臺(tái)點(diǎn)擊一個(gè)按鈕,切換下一個(gè)畫面平臺(tái)點(diǎn)擊一個(gè)按鈕,切換下一個(gè)畫面.實(shí)現(xiàn)效果圖: A圖布局(activity_main.xml和MainActivity.java )B圖布局(activity_test

23、.xml和TestActivity.java )清單AndroidManifest.xml資源strings.xml將Android開發(fā)項(xiàng)目打包成APK,即可.至此,一個(gè)神秘的Android應(yīng)用就開發(fā)完成了。五.Android之重點(diǎn)基礎(chǔ)項(xiàng)目的清單文件AndroidManifest.xml這個(gè)清單給這個(gè)清單給Android系統(tǒng)提供了關(guān)于這個(gè)系統(tǒng)提供了關(guān)于這個(gè)應(yīng)用程序的基本信息應(yīng)用程序的基本信息,系統(tǒng)在能運(yùn)行任何程,系統(tǒng)在能運(yùn)行任何程序代碼之前必須知些信息。序代碼之前必須知些信息。 AndroidManifest.xml主要包含以下功能:(1)命名應(yīng)用程序的 Java 包,這個(gè)包名用來唯一標(biāo)識(shí)應(yīng)用

24、程序(2)描述應(yīng)用程序的組件:活動(dòng),服務(wù),廣播接收者,以及組成應(yīng)用程序的內(nèi)容提 供器;對(duì)實(shí)現(xiàn)每個(gè)組件和公布其能力(比如,能處理哪些意圖消息)的類進(jìn)行命 名。這些聲明使得 Android系統(tǒng)了解這些組件以及在什么條件下可以被啟動(dòng);(3)決定應(yīng)用程序組件運(yùn)行在哪個(gè)進(jìn)程里面(4)聲明應(yīng)用程序所必須具備的權(quán)限,用以訪問受保護(hù)的部分 API,以及和其它應(yīng) 用程序交互;(5)聲明應(yīng)用程序其他的必備權(quán)限,用以組件之間的交互;(6)列舉測(cè)試設(shè)備Instrumentation類,用來提供應(yīng)用程序運(yùn)行時(shí)所需的環(huán)境配置 和其他信息,這些聲明只是在開發(fā)和測(cè)試階段存在,發(fā)布前將被刪除(7) 聲明應(yīng)用程序所要求的Andr

25、oid API的最低版本級(jí)別;(8)列舉application所需要鏈接的庫應(yīng)用、任務(wù)、進(jìn)程和線程應(yīng)用: 一個(gè)Android 包 (簡(jiǎn)稱 .apk ) ,里面包含應(yīng)用程序的代碼以及資源。這是一個(gè)應(yīng)用發(fā)布,用戶能下載并安裝到他們?cè)O(shè)備上的文件。任務(wù): 其實(shí)就是一次運(yùn)行起來的一個(gè)活動(dòng)棧,通常用戶能當(dāng)它為一個(gè)“應(yīng)用程序”來啟動(dòng)和操作。進(jìn)程: 一個(gè)應(yīng)用通常會(huì)對(duì)應(yīng)到一個(gè)進(jìn)程,注意,不是一次運(yùn)行一個(gè)進(jìn)程,跟windows不一樣,只要進(jìn)程沒有銷毀,那么無論你啟動(dòng)幾回這個(gè)任務(wù),都可能是在一個(gè)進(jìn)程里。線程: 任務(wù)、活動(dòng)等的實(shí)際運(yùn)行環(huán)境,每個(gè)進(jìn)程包含一個(gè)或多個(gè)線程。多數(shù)情況下,Android 避免在進(jìn)程里創(chuàng)建多余的

26、線程,除非它創(chuàng)建它自己的線程,我們應(yīng)保持應(yīng)用程序的單線程性,也就是運(yùn)行在主線程里面。進(jìn)程的生命周期在大多數(shù)情況下,每個(gè)Android應(yīng)用程序都運(yùn)行在自己的Linux進(jìn)程中,當(dāng)應(yīng)用程序的某些代碼需要運(yùn)行時(shí),這個(gè)進(jìn)程就被創(chuàng)建并一直運(yùn)行下去,直到系統(tǒng)認(rèn)為該進(jìn)程不再有用為止,然后系統(tǒng)將回收進(jìn)程占用的內(nèi)存以便分配給其它的應(yīng)用程序。 Android會(huì)盡可能長(zhǎng)時(shí)間的為應(yīng)用程序維持進(jìn)程。1:前臺(tái)(Foreground)進(jìn)程,與用戶當(dāng)前正在做的事情密切相關(guān)。不同的應(yīng)用程序 組件能夠通過不同的方法使它的宿主進(jìn)程移到前臺(tái)。當(dāng)下面任何一個(gè)條件滿足 時(shí),可以考慮將進(jìn)程移到前臺(tái):(1)進(jìn)程正在運(yùn)行一個(gè)與用戶交互的Acti

27、vity ,它的onResume()方法被調(diào)用(2)進(jìn)程有一個(gè)Service,該Service對(duì)應(yīng)的Activity正在與用戶交互(3)進(jìn)程有一個(gè)Service被調(diào)用startForeground()方法,要求到前臺(tái)來執(zhí)行(4)進(jìn)程有一個(gè)Service,并且在Service的某個(gè)回調(diào)函數(shù)(onCreate()、 onStart()、 或 onDestroy())內(nèi)有正在執(zhí)行的代碼。(5)進(jìn)程有一正在運(yùn)行的BroadcastReceiver,它的onReceive()方法正在執(zhí)行2:可見(visible)進(jìn)程,它有一個(gè)可以被用戶從屏幕上看到的Activity,但不在前 臺(tái),它的onPause()

28、方法被調(diào)用。這樣的進(jìn)程一般不允許被殺死,除非為了保證 前臺(tái)進(jìn)程的運(yùn)行不得不這樣做。3:服務(wù)(service)進(jìn)程,有一個(gè)已經(jīng)用startService() 方法啟動(dòng)的Service。雖然這 些進(jìn)程用戶無法直接看到,但它們做的事情卻是用戶所關(guān)心的(例如后臺(tái)MP3播 放、后臺(tái)數(shù)據(jù)上傳下載等)。因此,系統(tǒng)將一直運(yùn)行這些進(jìn)程除非內(nèi)存不足以維 持所有的前臺(tái)進(jìn)程和可見進(jìn)程。4:后臺(tái)(background)進(jìn)程, 擁有一個(gè)當(dāng)前用戶看不到的Activity(它的onStop()方法被調(diào)用)。這些進(jìn)程對(duì)用戶體驗(yàn)沒有直接的影響。如果它們正確執(zhí)行了Activity生命期,系統(tǒng)可以在任意時(shí)刻殺死進(jìn)程來回收內(nèi)存,并提供

29、給前面三種類 型的進(jìn)程使用。5:空(empty)進(jìn)程,不包含任何處于活動(dòng)狀態(tài)的應(yīng)用程序組件。保留這種進(jìn)程的唯一原因是,當(dāng)下次應(yīng)用程序的某個(gè)組件需要運(yùn)行時(shí),不需要重新創(chuàng)建進(jìn)程,這樣可以提高啟動(dòng)速度。Android中的線程概述1:當(dāng)一個(gè)Android應(yīng)用被裝載執(zhí)行的時(shí)候,系統(tǒng)會(huì)創(chuàng)建一個(gè)線程來運(yùn)行這個(gè)應(yīng)用, 通常稱之為主線程“main thread”,也被稱為UI Thread。2:系統(tǒng)不會(huì)為每個(gè)組件單獨(dú)創(chuàng)建線程,在同一個(gè)進(jìn)程里的UI組件都會(huì)在UI線程里實(shí)例化,系統(tǒng)對(duì)每一個(gè)組件的調(diào)用都從UI線程分發(fā)出去。結(jié)果就是,響應(yīng)系統(tǒng)回調(diào)的方法(比如響應(yīng)用戶動(dòng)作的onKeyDown()和各種生命周期回調(diào))永遠(yuǎn)都

30、是在UI線程里運(yùn)行。3:Andoid UI toolkit并不是線程安全的,所以你不能從非UI線程來操縱UI組件。你必須把所有的UI操作放在UI線程里。4:如果所有的工作都在UI線程,做一些比較耗時(shí)的工作比如訪問網(wǎng)絡(luò)或者數(shù)據(jù)庫查詢,都會(huì)阻塞UI線程,導(dǎo)致事件停止分發(fā)(包括繪制事件)5:因此建議,Android的單線程模型單線程模型有兩條原則:(1)不要阻塞UI Thread(2)不要在UI Thread之外訪問Android 的UI toolkit (主要是android.widget and android.view) 子線程不能操作UI對(duì)象。6:如果有長(zhǎng)時(shí)間的處理,比如要裝載一個(gè)大的圖片,

31、就需要開啟一個(gè)單獨(dú)的線程來裝載,通常稱之為Worker Thread。UI線程和非UI線程 通信處理非UI線程和UI線程之間通信實(shí)現(xiàn)?Android的線程使用來更新UI:Thread、Handler、Looper、TimerTask等教程:http:/ Handler允許你發(fā)送消息到一個(gè)線程的消息隊(duì)列,并處理消息。 Handler和啟動(dòng)它的主線程是運(yùn)行在同一個(gè)線程中的。主線程通過Handler來調(diào)度處理消息,相實(shí)現(xiàn)了異步處理。Handler應(yīng)用的地方:1:安排消息或Runnable 在某個(gè)主線程中某個(gè)地方執(zhí)行2:安排一個(gè)動(dòng)作在不同的線程中執(zhí)行,這個(gè)要使用HandlerThreadHandler

32、使用:1:創(chuàng)建Handler對(duì)象,實(shí)現(xiàn)handleMessage方法2:創(chuàng)建Runnable對(duì)象,在run方法里面進(jìn)行消息的發(fā)送3:在主線程中啟動(dòng)Handler,使用post方法或其它類似方法4:在主線程中取消Handler,使用removeCallbacks方法或其它類似方法子線程:子線程和UI線程:1.handler可以在任意線程發(fā)送消息任意線程發(fā)送消息,這些消息會(huì)被添加到關(guān)聯(lián)的MQ上。2.handler是在它關(guān)聯(lián)的關(guān)聯(lián)的looper線程中處理消息線程中處理消息的。3.解決了android最經(jīng)典的不能在其他非主線程中更新UI的問題Handler h = new Handler() publ

33、ic void handleMessage(Message msg) super.handleMessage(msg); /使用what來區(qū)分是什么樣的消息 switch (msg.what) case 1 : /這里進(jìn)行消息的處理 break; default : /這里進(jìn)行消息的處理 ;int what = 0;Runnable r = new Runnable() public void run() Message msg = h.obtainMessage(); msg.obj = 1234567;/傳遞的參數(shù) msg.what = what; what+; h.sendMessage

34、(msg); h.postDelayed(r, 1000L); ;Intent基本概念I(lǐng)ntent是什么 是一個(gè)簡(jiǎn)單的消息對(duì)象(消息傳遞工具類),它表示程序想做某事的“意圖”,可以用來”激活”Activity、Service或BroadCast Receiver。比如想要從一個(gè)Activity啟動(dòng)另外一個(gè)Activity,就可以這么寫:Button btnToT2 = (Button)this.findViewById(R.id.btn_toT2);btnToT2.setOnClickListener(new OnClickListener() public void onClick(View

35、 v) Intent in = new Intent(); in.setClass(HelloWorldActivity.this, T2.class); HelloWorldActivity.this.startActivity(in); );Intent對(duì)象能包含下面六種數(shù)據(jù):1:Component name,組件名稱:來處理Intent的組件類的全路徑名稱。可以通過setComponent()、setClass()、setClassName()方法來進(jìn)行設(shè)置,通過getComponent()方法進(jìn)行讀取。2:Action,動(dòng)作:一個(gè)描述要做什么事情的字符串。在Intent類里面預(yù)定義了。

36、3:Data,數(shù)據(jù):用來描述Action對(duì)應(yīng)的具體的數(shù)據(jù)和數(shù)據(jù)的MIME Type,比如要打電話,那是電話數(shù)據(jù)的uri,通常是“tel:/”后面加上號(hào)碼。如果是其他的數(shù)據(jù),通常是“content:/”類型的uri。相應(yīng)的setData()方法僅僅用來設(shè)置URI,而setType()方法僅僅設(shè)置MIMEType,setDataAndType()可以同時(shí)設(shè)置,另外可以通過相應(yīng)的get方法獲取值。4:Category,類別:用來描述組件應(yīng)該如何處理Intent的附加信息。在Intent類中有Category具體的預(yù)定義。可以通過addCategory()、removeCategory()和getCa

37、tegories()來操作Category。5:Extras,額外數(shù)據(jù):傳遞給組件的附加數(shù)據(jù),通常是key-value對(duì)??梢酝ㄟ^putExtras()和getExtras()方法來操作數(shù)據(jù)。6:Flags,標(biāo)記:各種各樣的類別標(biāo)記,用來描述如何裝載Activity,以及裝載后如何處理這些Activity。Intent基本示例:發(fā)短信的示例:Uri uri = Uri.parse(“smsto:發(fā)送的號(hào)碼);Intent in = new Intent(Intent.ACTION_SENDTO,uri);in.putExtra(sms_body, 發(fā)個(gè)短信玩);Hello.this.start

38、Activity(in);打電話的示例:Uri uri = Uri.parse(“tel:發(fā)送的號(hào)碼);Intent in = new Intent(Intent.ACTION_CALL,uri);Hello.this.startActivity(in);記得在AndroidManifest.xml文件中進(jìn)行授權(quán),這些權(quán)限可以在Manifest.permission里面查到。一些常用的Intent: (Intent大全: http:/ Intent.ACTION_VIEW打開地圖應(yīng)用程序并顯示指定的經(jīng)緯度geo:0,0?q=street+address Intent.ACTION_VIEW打開

39、地圖應(yīng)用程序并顯示指定的地址http:/web_address Intent.ACTION_VIEW打開瀏覽器程序并顯示指定的URLhttps:/web_address Intent.ACTION_VIEW打開瀏覽器程序并顯示指定的URLtel:phone_numberIn tent.ACTION_CALL打開電話應(yīng)用程序并撥打指定的電話號(hào)碼tel:phone_number Intent.ACTION_DIAL打開電話應(yīng)用程序并撥下指定的電話號(hào)碼voicemail: Intent.ACTION_DIAL打開電話應(yīng)用程序并撥下指定語音郵箱的電話號(hào)碼plain_text Intent.ACTION

40、_WEB_SEARCH打開瀏覽器程序并使用Google搜索引擎搜索六.Android之核心基礎(chǔ)Android應(yīng)用之四大組件Android應(yīng)用中最主要的組件是:1:Activity:活動(dòng),活動(dòng)是最基本的Andorid應(yīng)用程序組件,應(yīng)用程序中,一個(gè)活動(dòng)通常就是一個(gè)單獨(dú)的屏幕。2:Service:服務(wù),服務(wù)是運(yùn)行在后臺(tái)的,通常是具有一段較長(zhǎng)生命周期且沒有用戶界面的程序。比較好的一個(gè)例子就是播放歌曲的媒體播放器,就算你導(dǎo)航到其它屏幕時(shí)音樂也還是在播放。3:Content provider:內(nèi)容提供者,內(nèi)容提供者實(shí)現(xiàn)了一組標(biāo)準(zhǔn)的方法,從而能夠讓不同的應(yīng)用之間可以相互保存或讀取彼此的內(nèi)容,當(dāng)然都需要實(shí)現(xiàn)自

41、己的內(nèi)容提供器。4:Broadcast receiver:廣播接收者,你可以使用BroadcastReceiver來讓你的應(yīng)用對(duì)一個(gè)外部的事件做出響應(yīng)。比如:當(dāng)電話呼入時(shí),數(shù)據(jù)網(wǎng)絡(luò)可用時(shí)。1.組件Activity篇Activity基本概念A(yù)ctivity是什么? Activity是Android的一種應(yīng)用組件,用來提供與用戶交互的屏幕Activity提供一個(gè)Window來繪制用戶界面,通常一個(gè)Activity就是我們見到的一個(gè)應(yīng)用程序的界面。Activity能干什么? 要注意一點(diǎn),Activity只是提供View組件繪制的環(huán)境,它本身并不會(huì)繪制界面,因此,Activity主要用來:1:提供Vi

42、ew組件的環(huán)境,由多個(gè)View組和構(gòu)成一個(gè)應(yīng)用程序的界面。2:用來處理View組件的事件響應(yīng),可以在里面寫界面的邏輯處理代碼。3 : 注注:作為資源的一部分,通過LayoutInflater這個(gè)類將xml布局文件加載并顯示成對(duì)應(yīng)視圖。解析xml文件需要用到的方法有LayoutInflater的靜態(tài)方法from來獲取一LayoutInflater實(shí)例inflater,再通過inflater的inflate方法返回一個(gè)視圖實(shí)例,最后通過setContentView的方法把這個(gè)視圖實(shí)例加載出來。 Activity創(chuàng)建、啟動(dòng)、使用和銷毀?Android界面繪制過程看不懂,感覺很復(fù)雜!亮點(diǎn)亮點(diǎn)從上圖,我

43、們可以理出大致的顯示過程如下:【1】ActivityManagerService創(chuàng)建Activity線程,激活一個(gè)activity?!?】系統(tǒng)調(diào)用Instrumentation.newActivity創(chuàng)建一個(gè)activity?!?】Activity創(chuàng)建后,attach到一個(gè)新創(chuàng)建的phonewindow中。這樣Activity獲取一個(gè)唯一的WindowManager服務(wù)的實(shí)例?!?】Activity創(chuàng)建過程中使用setcontentView設(shè)置用用戶UI,這些VIEW被加入到PhoneWindow的ContentParent中?!?】Activity線程繼續(xù)執(zhí)行,當(dāng)執(zhí)行到Activity.ma

44、keVisible是將根view DecoView加入到WindowManger中,WindowManger實(shí)全會(huì)為每個(gè)DecoView創(chuàng)建對(duì)應(yīng)的ViewRoot。【6】每個(gè)ViewRoot擁有一個(gè)Surface,每個(gè)Surface將會(huì)調(diào)用底層庫創(chuàng)建圖形繪制的內(nèi)存空間。這個(gè)底層庫就是SurfaceFlinger。SurfaceFlinger同時(shí)也負(fù)責(zé)將個(gè)同時(shí)也負(fù)責(zé)將個(gè)View繪制的圖形合到一塊繪制的圖形合到一塊(按照Z軸)顯示到用戶屏幕?!?】如果用戶直接在Canvas上繪制,實(shí)際上它直接操作Surface。但對(duì)每個(gè)View的變更,它是要通知到ViewRoot,然后ViewRoot獲取Canv

45、as。如果繪制完成,surfaceFlinger得到通知,合并Surface成一個(gè)Surface到設(shè)備屏幕。Activity視圖View視圖View 視圖(Views)是可以將其自身繪制到屏幕上的對(duì)象。Android的用戶界面是由一系列的視圖樹構(gòu)成,接口都是由一組以樹的形式出現(xiàn)的視圖組成的。開發(fā)者可以通過創(chuàng)建一個(gè)新的視圖的方法來使用自定義的圖形處理技術(shù),比如開發(fā)游戲,或者是使用 用戶圖形窗口界面widget。視圖組Viewsgroups 視圖組是一種特殊類型的視圖對(duì)象,它的功能是包含和管理下級(jí)試圖和其它視圖組的集合。視圖組讓你可以為你的用戶界面添加結(jié)構(gòu),從而建立復(fù)雜并可以作為單獨(dú)實(shí)體進(jìn)行訪問的

46、屏幕元素。Activity和View Android應(yīng)用程序最基本的功能單位是Activity,主要用來實(shí)現(xiàn)界面的功能處理,但是它本身并不能使自己顯示在屏幕上。你可以使用視圖views和視圖組viewgroups,它們是Android平臺(tái)上的最基本的用戶界面元素。Activity的生命周期圖Activity的回調(diào)方法 onCreate() :在Activity第一次被創(chuàng)建的時(shí)候調(diào)用,通常在這里做一些靜態(tài)初始化的工 作,比如:創(chuàng)建views、綁定數(shù)據(jù)到列表等。這個(gè)方法會(huì)把這個(gè)Activity上一次運(yùn)行所保存的狀態(tài)傳遞進(jìn)來。onStart() : 在Activity變得可以被用戶看見之前調(diào)用。on

47、Restart() :在Activity被stop后,重新變得可見的時(shí)候調(diào)用。onResume(): 在Activity可見,能跟用戶進(jìn)行交互的時(shí)候調(diào)用。這時(shí)候,當(dāng)前Activity來到Activity棧的頂端,用戶就可以操作這個(gè)Activity了。onPause():在系統(tǒng)準(zhǔn)備resume其他的Activity的時(shí)候調(diào)用。這個(gè)方法里面通??梢詫?shí)現(xiàn):提交未保存的數(shù)據(jù),終止動(dòng)畫等。onStop():當(dāng)Activity不可見的時(shí)候調(diào)用這個(gè)方法。onDestroy():調(diào)用finish方法,或是系統(tǒng)判斷,需要銷毀這個(gè)Activity的時(shí)候調(diào)用。 思考? 如何創(chuàng)建應(yīng)用界面?2.組件Service篇Se

48、rvice基本概念Service是什么?是一種能在后臺(tái)運(yùn)行,不需要用戶界面,用來執(zhí)行需要長(zhǎng)時(shí)間處理的組件。Service的說明?1:它通常由其他組件啟動(dòng),并在后臺(tái)持久的運(yùn)行,即使用戶已經(jīng)切換到其他的應(yīng)用,它仍然可以繼續(xù)在后臺(tái)運(yùn)行。2:其他組件能夠跟service綁定,甚至能進(jìn)行跨進(jìn)程的通訊(IPC:interprocess communication)3:一個(gè)service通常用來執(zhí)行:網(wǎng)絡(luò)傳輸、音樂播放、文件I/O、或者是與content provider進(jìn)行交互等等。當(dāng)然所有的操作過程都在background。Service和進(jìn)程、線程Service和進(jìn)程、線程? 要注意一點(diǎn):一個(gè)Serv

49、ice是運(yùn)行在主線程和它的宿主進(jìn)程中的,Service不會(huì)創(chuàng)建它自己的線程,也不會(huì)運(yùn)行在單獨(dú)的進(jìn)程中。 因此,如果Service要執(zhí)行特別耗費(fèi)CPU的工作,或者是其他導(dǎo)致阻工作,最好在Service里面創(chuàng)建新的線程來執(zhí)行這些工作,這樣能避免典型的ANR(Application Not Response)錯(cuò)誤。Service和線程的使用建議?1:Service適用于在后臺(tái)運(yùn)行,不需要用戶在界面上操作的功能。2:Thread適用于你希望在應(yīng)用之外執(zhí)行一些功能,而且用戶還需要操作界面,那么建議使用Thread;3:還有一種情況就是Service里面執(zhí)行的工作特別耗費(fèi)資源,容易引起主線程的阻塞,那么也

50、建議使用線程。Service的兩種形式1:Started 如果是其他應(yīng)用組件通過調(diào)用startService()方法啟動(dòng)的service,就被稱“Started” Service。 一旦啟動(dòng)了Service,它就會(huì)在后臺(tái)運(yùn)行,即使啟動(dòng)它的組件已經(jīng)被銷毀,Service仍然會(huì)繼續(xù)運(yùn)行。一般這種啟動(dòng)Service的操作是不需要返回值的,當(dāng)Service完成工作后,它自己會(huì)停止運(yùn)行。2:Bound 如果是其他應(yīng)用組件通過調(diào)用bindService()方法綁定的service,就被稱為“bound” Service。 綁定Service提供了Client和Server之間的交互,也就是允許組件和Ser

51、vice進(jìn)行交互,發(fā)送請(qǐng)求,獲得返回值等。甚至能夠?qū)崿F(xiàn)跨進(jìn)程的通訊(IPC)。 綁定Service和綁定它的組件的運(yùn)行周期是一樣的,多個(gè)組件可以綁定到同一個(gè)Service,當(dāng)所有綁定它的組件都銷毀了的時(shí)候,Service也就銷毀了,調(diào)用者退出了,就銷毀了。1. 生命周期:生命周期:startService()方式啟動(dòng),Service是通過接受Intent并且會(huì)經(jīng)歷onCreate()和onStart()。當(dāng)用戶在發(fā)出意圖使之銷毀時(shí)會(huì)經(jīng)歷onDestroy(),而bindService()方式啟動(dòng),與Activity綁定的時(shí)候,會(huì)經(jīng)歷onCreate()和onBind(),而當(dāng)Activity被

52、銷毀的時(shí)候,Service會(huì)先調(diào)用onUnbind()然后是onDestroy()。2. 控制方式:控制方式:前者的控制方式需要使用固定的方法,對(duì)Service進(jìn)行單一的操作。而后者由于與Activity綁定,不用考慮其生命周期問題,并且從發(fā)送Intent的被動(dòng)操作,變?yōu)榭梢灾鲃?dòng)對(duì)Service對(duì)象進(jìn)行操作,我們甚至可以建立一個(gè)Handler類,對(duì)Service進(jìn)行相關(guān)的操作。大大加強(qiáng)了Service的靈活性、可操作性。Service的生命周期Service基本的APIA:創(chuàng)建創(chuàng)建Service非常簡(jiǎn)單,繼承Service,然后覆蓋實(shí)現(xiàn)相應(yīng)的回調(diào)方法即可,一些重要的回調(diào)方法如下:1:onSta

53、rtCommand():當(dāng)其他組件啟動(dòng)Service的時(shí)候調(diào)用。當(dāng)這個(gè)方法執(zhí)行后,Service就啟動(dòng)起來在后臺(tái)運(yùn)行了。你可以調(diào)用stopSelf()或stopService()來停止Service。如果只是綁定服務(wù),沒有必要實(shí)現(xiàn)這個(gè)方法。2:onBind():當(dāng)其他組件綁定Service的時(shí)候調(diào)用。你必須提供一個(gè)接口給客戶端,讓它通過這個(gè)接口來和服務(wù)端通訊,通常會(huì)返回一個(gè)IBinder,你應(yīng)該始終實(shí)現(xiàn)該方法,如果不用綁定的話,返回null。3:onCreate():當(dāng)Service第一次創(chuàng)建的時(shí)候由系統(tǒng)調(diào)用該方法。如果服務(wù)已經(jīng)啟動(dòng)運(yùn)行,將不會(huì)調(diào)用該方法。4:onDestroy():當(dāng)Serv

54、ice將要被銷毀的時(shí)候調(diào)用該方法。你應(yīng)該實(shí)現(xiàn)該方法來釋放Service所使用的資源,比如:線程、注冊(cè)的監(jiān)聽器、廣播消息接受者等。B:銷毀銷毀Service1:如果是通過其他組件調(diào)用startService()來創(chuàng)建的Service,需要調(diào)用stopSelf()或stopService()來停止Service2:如果是綁定的Service,它會(huì)一直運(yùn)行到所有綁定它的組件銷毀后,由系統(tǒng)來銷毀Service。3:如果系統(tǒng)急需要資源,它會(huì)強(qiáng)行停止一些長(zhǎng)時(shí)間運(yùn)行,且運(yùn)行級(jí)別較低的service,比如沒有界面,在后臺(tái)運(yùn)行的某些service。 思考? 如何后臺(tái)下載圖片?3.組件Broadcast篇Broa

55、dcast基本概念Broadcast是什么? 是一種能在各個(gè)應(yīng)用程序之間傳遞數(shù)據(jù)的機(jī)制。類似于現(xiàn)實(shí)中的廣播體系,有廣播方和接收方,雙方的關(guān)系是多對(duì)多的,之間傳遞的就是Intent對(duì)象。Broadcast能做什么?1:實(shí)現(xiàn)了不同的程序之間的數(shù)據(jù)傳輸與共享,比如我們的應(yīng)用想要攔截到短信或電話,就可以接收相應(yīng)的廣播,然后進(jìn)行處理。2:起到了一個(gè)通知的作用,比如在service中要通知主程序,更新主程序的UI等。Broadcast有什么?1:廣播方,就是發(fā)出廣播的應(yīng)用2:接收方,就是接收相應(yīng)的廣播信息并處理的應(yīng)用3:Intent對(duì)象,廣播方和接收方傳遞數(shù)據(jù)的對(duì)象。Broadcast Receiver示

56、例在廣播方需要做兩件事情:一是組織并封裝Intent對(duì)象;二是發(fā)送廣播。如下:Intent in = new Intent();in.setAction(Intent.ACTION_EDIT);in.putExtra(broadcast, test);HelloWorldActivity.this.sendBroadcast(in);在接收方需要繼承BroadcastReceiver并做廣播的相應(yīng)處理public class MyReceiver extends BroadcastReceiver public void onReceive(Context context, Intent intent) if(intent.getAction().equals(Intent.ACTION_EDIT) Toast.makeText(context, receiver-+intent.getExtras().getString(broadcast), Toast.LENGTH_SHORT).show(); else Toast.makeText(context, receiver-but not edit,Toast.LENGTH_SHORT).show(); A:需要在配置文件AndroidMani

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論