版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Android移動應(yīng)用開發(fā)基礎(chǔ)教程講授:XXXXX第1章Android開發(fā)起步本章主要內(nèi)容:Android簡介搭建Android開發(fā)環(huán)境創(chuàng)建Android項目Android編程的日志工具1.1 Android簡介本節(jié)主要內(nèi)容:Android平臺特點Android體系架構(gòu)Android版本1.1 Android簡介Android本義為“機器人”Android是基于Linux內(nèi)核、應(yīng)用Java開發(fā)的輕量級的移動操作系統(tǒng)。Google為Android內(nèi)置了諸多常用應(yīng)用:電話、短信、個人管理、多媒體播放、網(wǎng)頁瀏覽等等2003年10月,AndyRubin等人創(chuàng)建了Android公司,組建了Android開發(fā)團隊。2005年8月,Google收購了Android公司及其開發(fā)團隊,并有AndyRubin繼續(xù)負責(zé)Android項目。2007年11月,Google正式發(fā)布Android平臺,Android平臺也不在局限于手機,還逐漸擴展到平板電腦和及其智能設(shè)備領(lǐng)域。2011年一舉超過稱霸移動領(lǐng)域多年的諾基亞Symbian系統(tǒng),成為全球市場份額占有率第一的智能設(shè)備平臺。1.1.1 Android平臺特點1、開放性Android平臺的源代碼開放。開發(fā)人員可任意訪問其核心代碼,設(shè)計出豐富多彩的應(yīng)用。Android的開放性也使更多的智能設(shè)備廠商加入到Android聯(lián)盟中來。2、不再受營運商限制
早期的手機,其上的應(yīng)用、網(wǎng)絡(luò)接入方式等等,全部由營運商說了算。Android打破了這種束縛,用戶可以根據(jù)自己的喜好來定制手機應(yīng)用。3、豐富的硬件選擇Android的開發(fā)性,也使硬件生產(chǎn)商可以設(shè)計出功能各異的多種產(chǎn)品,例如Android手機、平板、眼鏡、電視、車載設(shè)備以及穿戴設(shè)備等,為用戶提供更多的選擇。4、開發(fā)不受限制Android平臺為開發(fā)人員提供了更加寬泛、自由的開發(fā)環(huán)境,使得各種優(yōu)秀的應(yīng)用不斷出現(xiàn)。同時,這也使一些不健康、惡意的應(yīng)用出現(xiàn),如何遏制不良應(yīng)用也成為Android的一個難題。5、與Google應(yīng)用無縫結(jié)合Android平臺可與Google的地圖、郵件、搜索等優(yōu)秀服務(wù)無縫結(jié)合,在手機、平板電腦以及其他智能設(shè)備上可以輕松使用這些服務(wù)。1.1.2 Android體系架構(gòu)1.Linux內(nèi)核層Android系統(tǒng)運行于Linux內(nèi)核之上,主要包括電源管理和各種啟動模塊,如顯示驅(qū)動、鍵盤驅(qū)動、攝像頭驅(qū)動、WiFi驅(qū)動、USB驅(qū)動等。2.硬件抽象層HAL硬件抽象層包含多個庫模塊,為上層的JavaAPI提供標(biāo)準(zhǔn)的設(shè)備硬件功能支持。開發(fā)人員通過框架API訪問設(shè)備硬件時,Android系統(tǒng)為硬件加載相應(yīng)的庫模塊。3.系統(tǒng)運行庫層系統(tǒng)運行庫層包含了一系列原生C/C++庫,它們通過Android應(yīng)用框架API為開發(fā)者提供各種服務(wù)。例如,Webkit庫提供瀏覽器支持、OpenGLES庫提供2D/3D繪畫支持等。4.JavaAPI框架層JavaAPI框架層通過API提供Android系統(tǒng)的全部功能5.系統(tǒng)應(yīng)用層
系統(tǒng)應(yīng)用層包含了Android系統(tǒng)自帶的一套核心應(yīng)用,包括電子郵件、短信、日歷、聯(lián)系人等。1.1.3Android版本版本號系統(tǒng)代號API級別市場占有率2.2Froyo 8 0.1%2.3.3-2.3.7Gingerbread 10 1.7%4.0.3-4.0.4IceCreamSandwich15 1.6%4.1.xJellyBean 16 6.0%4.2.xJellyBean 17 8.3%4.3JellyBean 18 2.4%4.4KitKat 19 29.2%5.0Lollipop 21 14.1%5.1Lollipop 22 21.4%6.0Marshmallow 23 15.2%7.0 Nougat 24 <0.1%Android7.0新增的主要功能和特性1、多窗口支持多窗口支持使用戶可在運行Android7.0系統(tǒng)的設(shè)備(手機、平板或TV)上一次打開兩個應(yīng)用。在Android7.0手機和平板中,用戶可以并排運行兩個應(yīng)用,或者在分屏模式下一個應(yīng)用在另一個之上。用戶可拖動兩個應(yīng)用之間的分隔線調(diào)整應(yīng)用。在Android7.0TV中,同時運行的兩個應(yīng)用實現(xiàn)畫中畫模式,從而在看電視的同時允許用戶瀏覽或使用其他應(yīng)用。多窗口支持也允許在兩個應(yīng)用之間執(zhí)行拖放操作,進一步增強用戶體驗。Android7.0新增的主要功能和特性2、通知功能增強Android7.0重新設(shè)計了通知,使其速度更快,也更易于使用。主要改變包括:模板進行了更新:通知模板更新,使開發(fā)人員只需修改少量代碼即可實現(xiàn)通知。允許更多的自定義消息傳遞樣式:使用MessagingStyle類的通知時,可自定義更多的與通知有關(guān)的用戶界面標(biāo)簽,可配置消息、會話標(biāo)題和內(nèi)容視圖等內(nèi)容。捆綁通知:系統(tǒng)可將消息組合成組顯示,用戶可適當(dāng)?shù)剡M行拒絕或歸檔操作。直接回復(fù):在實時通信應(yīng)用中支持內(nèi)聯(lián)回復(fù),方便用戶在通知界面中快速回復(fù)短信。自定義視圖:新的API允許在通知中使用自定義視圖時充分利用系統(tǒng)裝飾元素。Android7.0新增的主要功能和特性3.及時編譯(JIT)和預(yù)編譯(AOT)Android7.0添加了JIT編譯器,對ART進行代碼分析,提升應(yīng)用性能。JIT編譯器對AOT(AheadofTime)編譯器進行了補充,有助于提高運行性能,節(jié)約存儲空間,加快應(yīng)用和系統(tǒng)的更新速度。通過配置文件,可讓Android運行組件根據(jù)應(yīng)用運行的實際情況管理每個應(yīng)用的AOT/JIT編譯。配置文件還可進一步指導(dǎo)便宜減少內(nèi)存占用,這對低內(nèi)存設(shè)備尤其重要。通過配置文件的知道,還可在設(shè)備處于空閑或充電狀態(tài)時才進行編譯,從而節(jié)約時間和省電。Android7.0新增的主要功能和特性4.隨時隨地的低耗電模式Android6.0推出了低耗電模式,當(dāng)設(shè)備未連接電源、處于靜止?fàn)顟B(tài)且屏幕關(guān)閉時,設(shè)備進入低耗電模式,系統(tǒng)通過推遲應(yīng)用的CPU和網(wǎng)絡(luò)活動來實現(xiàn)省電目的。Android7.0進一步完善了低耗電模式。只要屏幕關(guān)閉且未連接電源,但不一定要處于靜止?fàn)顟B(tài)(例如用戶將手機放于口袋中)時低耗電模式就會啟動,限制CPU和網(wǎng)絡(luò)活動。Android7.0新增的主要功能和特性5.流量節(jié)省程序相信讀者都為不得不使用移動流量帶來的昂貴資費煩惱過。Android7.0推出了流量節(jié)省模式,允許用戶在設(shè)置中啟用流量節(jié)省程序,當(dāng)設(shè)備使用按流量計費的網(wǎng)絡(luò)時,系統(tǒng)可屏蔽后臺流量,同時指示前臺應(yīng)用盡可能少用流量。例如,限制流媒體服務(wù)的比特率、降低圖像質(zhì)量、延遲最佳的預(yù)緩沖等。用戶還可將應(yīng)用加入白名單,從而允許其在啟用了流量節(jié)省程序后再后臺的流量消耗。Android7.0新增的主要功能和特性6.號碼屏蔽Android7.0增加了號碼屏蔽功能,允許默認短信應(yīng)用、默認手機應(yīng)用和營運商應(yīng)用通過框架API訪問屏蔽的號碼列表,其他應(yīng)用無法訪問此列表。利用平臺標(biāo)準(zhǔn)的號碼屏蔽功能,還可以屏蔽已屏蔽號碼發(fā)出的短信,可通過備份/還原在重置或跨設(shè)備保留屏蔽的號碼,可在多個應(yīng)用中使用相同的屏蔽號碼列表。Android設(shè)備的運營商可通過讀取用戶設(shè)備中的屏蔽號碼列表,執(zhí)行服務(wù)器端的屏蔽,阻止已屏蔽號碼的來電和短信到達用戶。1.2 搭建Android開發(fā)環(huán)境本節(jié)主要內(nèi)容:需要哪些工具JDK下載安裝 AndroidStudio簡介AndroidStudio的下載安裝1.2.1需要哪些工具Android開發(fā)需要的工具如下。JDK:Android程序都使用Java語言進行編寫,JDK是Java語言開發(fā)工具包,它包含了Java運行環(huán)境、工具、基礎(chǔ)類庫等。目前,Android支持Java7全部功能和Java8的部分功能。AndroidSDK:這是Google提供的Android開發(fā)工具包,開發(fā)Android應(yīng)用時,需要在IDE中引入該包。AndroidStudio:這是Google推出的Android開發(fā)IDE。早期的Android開發(fā)大多使用Eclipse,在其中安裝Google提供的Android開發(fā)插件ADT,來進行Android開發(fā)。隨著AndroidStudio的不斷完善和功能增強,以成為Android開發(fā)的理想選擇。Google也不再維護和更新ADT插件。1.2.2JDK下載安裝1.2.3AndroidStudio簡介AndroidStudio主要的特點如下。InstantRun智能代碼編輯器快速、功能豐富的模擬器強大靈活的構(gòu)建系統(tǒng)專門為Android設(shè)備開發(fā)代碼模板和GitHub集成1.2.4AndroidStudio的下載安裝1.3 創(chuàng)建第一個Android項目本節(jié)主要內(nèi)容:創(chuàng)建HelloWorld項目 創(chuàng)建模擬器 運行項目 了解Android項目組成1.3.1創(chuàng)建HelloWorld項目HelloWorld項目在屏幕上顯示“HelloWorld”字符串,通過創(chuàng)建該項目了解AndroidStudio如何創(chuàng)建一個新的項目。
在AndroidStudio中演示1.3.2創(chuàng)建模擬器
在創(chuàng)建項目時,AndroidStudio自動創(chuàng)建很多東西,現(xiàn)在不需要修改任何代碼即可運行前面創(chuàng)建的HelloWorld項目。不過在運行之前,需要創(chuàng)建一個模擬器作為項目運行設(shè)備。當(dāng)然,也可連接一個物理設(shè)備(例如一臺Android手機)來測試運行項目。1.3.3運行項目在AndroidStudio中演示1.3.4了解Android項目組成1.4 Android編程小工具:日志本節(jié)主要內(nèi)容:使用日志API輸出調(diào)試信息日志分類與日志過濾器1.4.1使用日志API輸出調(diào)試信息可使用下面的多種方法在程序中輸出調(diào)試信息,這些信息統(tǒng)稱為日志,具有不同的級別。System.out.println():輸出的日志級別為Info,即普通信息。System.err.println():輸出的日志級別為Warn,即警告信息。Log.v():輸出的日志級別為Verbose,即冗余信息。Log.d():輸出的日志級別為Debug,即調(diào)試信息。Log.i():輸出的日志級別為info,即普通信息。Log.w():輸出的日志級別為Warn,即警告信息。Log.e():輸出的日志級別為Erro,即錯誤信息。1.4.2日志分類與日志過濾器Android應(yīng)用程序日志可分為Verbose、Debug、Info、Warn和Erro等5個級別,依次從低到高。Android移動應(yīng)用開發(fā)基礎(chǔ)教程講授:XXXXX第2章Android核心組件——活動本章主要內(nèi)容:活動是什么活動的基本操作在活動中使用Intent在活動之間傳遞數(shù)據(jù)活動的生命周期活動的啟動模式2.1 活動是什么活動是Android的一個核心應(yīng)用組件,它主要用于實現(xiàn)應(yīng)用功能邏輯,并通過界面顯示數(shù)據(jù)或接收用戶輸入。一個應(yīng)用程序可以包含零個或多個活動。沒有活動的應(yīng)用程序,用戶將無法看到程序界面,這種應(yīng)用程序通常在后臺運行,不涉及用戶交互。從用戶的角度看,活動具有如下特點。可通過返回鍵退出活動??赏ㄟ^Home鍵返回桌面??稍诨顒又袉恿韨€一個界面,此時按返回鍵返回前一個活動。2.2 活動的基本操作本節(jié)主要內(nèi)容:為活動綁定自定義視圖啟動另一個活動結(jié)束活動2.2.1為活動綁定自定義視圖在AndroidStudio中演示2.2.1為活動綁定自定義視圖在AndroidStudio中演示2.2.3結(jié)束活動在AndroidStudio中演示2.3 在活動中使用IntentIntent是Android應(yīng)用中的一種消息傳遞機制,通過Intent對象實現(xiàn)其他應(yīng)用組件之間的通信。通常,Intent用于啟動活動、啟動服務(wù)以及發(fā)送廣播。Intent可分為兩種:顯式Intent和隱式Intent本節(jié)主要內(nèi)容:顯式Intent隱式IntentIntent過濾器從網(wǎng)頁中啟動活動2.3.1顯式Intent顯式Intent指在創(chuàng)建Intent對象時,指定了要啟動的特定組件。實例演示2.3.2隱式Intent顯式Intent指明了要啟動的組件,隱式Intent則相反,它不指明要啟動的組件,而是指明要執(zhí)行的操作,讓系統(tǒng)去選擇可完成該操作的組件。啟動同一個應(yīng)用中的活動實例演示啟動另一個應(yīng)用中的活動實例演示2.3.3Intent過濾器Intent過濾器主要用于聲明應(yīng)用組件可接收的Intent操作、數(shù)據(jù)和其他設(shè)置。<activityandroid:name=".MainActivity"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name=
"ent.category.LAUNCHER"/></intent-filter></activity>在清單文件AndroidManifest.xml聲明Intent過濾器時,可使用下面的3個元素:<action>元素:在其name屬性中聲明組件可接受的Intent操作,操作名稱可以是自定義的文本字符串或者ent.action類的常量。<category>元素:在其name屬性中聲明組件可接受的Intent類別,類別名稱通常為ent.category類中的常量。如果要讓活動響應(yīng)隱式Intent,則必須將過濾器的類別設(shè)置為ent.category.DEFAULT。如果沒有在Intent過濾器中聲明DEFAULT類別,則隱式Intent不會解析該組件。<data>元素:聲明數(shù)據(jù)URI的scheme、host、port、path等,或者是數(shù)據(jù)的MIME類型在代碼中創(chuàng)建Intent對象時,可調(diào)用下列方法為Intent對象添加操作、類別、數(shù)據(jù)或其他屬性:setAction():設(shè)置Intent對象操作。也可在Intent對象構(gòu)造函數(shù)中指定操作。addCategory():為Intent對象添加類別。setData():設(shè)置數(shù)據(jù)URI。setType():設(shè)置MIME類型。setDataAndType():setData()和setType()會相互抵消彼此的設(shè)置,要同時設(shè)置URI和MIME類型,則需調(diào)用setDataAndType()。2.3.4從網(wǎng)頁中啟動活動Android允許在瀏覽器中啟動活動。在Intent過濾器中包含BROWSABLE類別,即表示當(dāng)前活動可從瀏覽器啟動。2.4 在活動之間傳遞數(shù)據(jù)本節(jié)主要內(nèi)容:傳遞簡單數(shù)據(jù)傳遞Bundle對象傳遞對象獲取活動返回的數(shù)據(jù)2.4.1傳遞簡單數(shù)據(jù)簡單數(shù)據(jù)指字符串、整數(shù)、浮點數(shù)等各種簡單數(shù)據(jù)類型的數(shù)據(jù),或者是這些簡單數(shù)據(jù)類型的數(shù)據(jù)。putExtra(name,value)方法可將指定的數(shù)據(jù)封裝到Intent對象中。其中,name為表示數(shù)據(jù)名稱的字符串,value為要傳遞的各種簡單數(shù)據(jù)類型的值。要獲取Intent對象中封裝的簡單數(shù)據(jù),可調(diào)用各種getXXXExtra()方法。getCharExtra(Stringname,chardefaultValue):從Intent對象中獲取指定name的char類型數(shù)據(jù)。getFloatExtra(Stringname,floatdefaultValue):從Intent對象中獲取指定name的float類型數(shù)據(jù)。getFloatArrayExtra(Stringname):從Intent對象中獲取指定name的float類型數(shù)組。getIntArrayExtra(Stringname):從Intent對象中獲取指定name的int類型數(shù)組。getIntExtra(Stringname,intdefaultValue):從Intent對象中獲取指定name的int類型數(shù)據(jù)。getStringArrayExtra(Stringname):從Intent對象中獲取指定name的String類型數(shù)組。getStringExtra(Stringname):從Intent對象中獲取指定name的String類型數(shù)據(jù)。2.4.2傳遞Bundle對象將各種簡單數(shù)據(jù)封裝到一個Bundle對象中,再將Bundle對象封裝到Intent對象中傳遞給啟動的活動。Bundle對象的各種putXXX(Stringkey,XXXvalue)方法,可將XXX類型的數(shù)據(jù)封裝到其中,對應(yīng)的用getXXX(Stringkey)方法從其中獲取數(shù)據(jù)。Bundle對象準(zhǔn)備好之后,調(diào)用putExtras(bundle)或putExtra(name,bundle)方法將其封裝到Intent對象中。要從Intent對象中獲取Bundle對象時,調(diào)用對應(yīng)的getExtras()或getBundleExtra()方法即可。2.4.3傳遞對象自定義的類對象,不能像簡單數(shù)據(jù)一樣直接封裝到Intent對象中。Android系統(tǒng)要求封裝到Intent對象中支持序列化。讓類實現(xiàn)Java內(nèi)置的Serializable接口,或者實現(xiàn)Android提供的Parcelable接口,即可使類對象支持序列化。使用實現(xiàn)Serializable接口的類對象實例演示使用實現(xiàn)Parcelable接口的類對象實例演示2.4.4獲取活動返回的數(shù)據(jù)要獲得活動中返回的數(shù)據(jù),則需要使用startActivityForResult(intent,requestCode)方法來啟動活動。其中,參數(shù)intent是一個Intent對象,用于封裝需要傳遞給活動的數(shù)據(jù)。參數(shù)requestCode為請求碼,是一個整數(shù),用來標(biāo)識當(dāng)前請求。一個活動可能會接收到其他不同活動的請求,從活動返回時,它會原樣返回接收到的請求碼。在處理返回結(jié)果時,可通過請求碼判斷是不是從所請求的活動返回。在當(dāng)前活動中需重載onActivityResult()方法來處理返回結(jié)果,其代碼基本結(jié)構(gòu)如下:protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);……}參數(shù)requestCode為從所請求的活動返回的它所接收到的請求碼。resultCode為結(jié)果代碼,常量RESULT_CANCELED表示用戶取消了操作,RESULT_OK表示用戶正確完成了操作。data為請求活動返回的Intent對象,從中可獲取返回的數(shù)據(jù)。在請求的活動中,用setResult(resultCode,intent)方法設(shè)置返回結(jié)果,resultCode為結(jié)果代碼,intent為封裝了返回數(shù)據(jù)的Intent對象。2.5 活動的生命周期
活動的生命周期指活動從第一次創(chuàng)建到被銷毀的整個時間。在一個生命周期內(nèi),活動可能存在多種狀態(tài)。深入了解活動的生命周期,有助于更合理管理應(yīng)用程序資源,設(shè)計出效率更高的應(yīng)用。本節(jié)主要內(nèi)容:返回棧、活動狀態(tài)及生命周期回調(diào)檢驗活動的生命周期2.5.1返回棧、活動狀態(tài)及生命周期回調(diào)1、返回棧一個應(yīng)用可能包含多個活動。Android系統(tǒng)使用堆棧(也稱返回棧)來管理活動。返回棧遵循“先進后出”原則。2.5.2檢驗活動的生命周期實例演示2.6 活動的啟動模式
活動總是擁有特定的啟動模式,啟動模式?jīng)Q定了Android系統(tǒng)如何在任務(wù)的返回棧中管理活動的實例。活動的啟動模式有4種:standard、singleTop、singleTask和singleInstance??稍谇鍐挝募褂?lt;activity>元素的launchMode屬性來指定活動的啟動模式。本節(jié)主要內(nèi)容:standard模式singleTop模式singleTask和singleInstance模式2.6.1standard模式standard是活動的默認啟動模式。在前面的所有內(nèi)容中用到的活動,其啟動模式都是standard。系統(tǒng)在啟動standard模式的活動時,不會檢查任務(wù)返回棧頂部中是否已經(jīng)有該活動,總是創(chuàng)建一個新的活動實例,將其放到返回棧頂部。2.6.2singleTop模式如果活動是singleTop模式,在啟動活動時,系統(tǒng)首先檢查任務(wù)返回棧,若棧頂活動是相同活動的實例,則直接使用該活動,不會再創(chuàng)建新的實例。2.6.3singleTask和singleInstance模式singleTask啟動模式表示一個任務(wù)中只能存在活動的一個實例。在啟動singleTask模式的活動時,系統(tǒng)如果發(fā)現(xiàn)任務(wù)返回棧中有該活動實例,則將該實例之上的所有活動出棧,使該實例成為棧頂活動。如果入伍返回棧中沒有活動實例,則創(chuàng)建一個新的活動實例,將其放到棧頂。與singleTop模式有點類似,但singleInstance啟動模式表示活動只允許“設(shè)備”中存在活動的一個實例,在啟動singleInstance模式的活動時,系統(tǒng)會為活動實例創(chuàng)建一個新的任務(wù)返回棧。設(shè)備中的所有應(yīng)用可共享該活動實例。Android移動應(yīng)用開發(fā)基礎(chǔ)教程講授:XXXXX第3章UI設(shè)計本章主要內(nèi)容:布局通用UI組件消息通知對話框菜單ListViewRecyclerView3.1 布局
布局是Android應(yīng)用程序的界面定義。布局中的所有界面元素,都是視圖(View)或視圖組(ViewGroup)對象。一個布局首先是一個視圖組對象,然后在視圖組對象中添加子視圖組對象或者視圖對象。本節(jié)主要內(nèi)容:視圖和視圖組布局的定義方法線性布局LinerLayout相對布局RelativeLayout幀布局FrameLayout3.1.1視圖和視圖組視圖對象用于在屏幕上繪制可與用戶交互的界面元素。一個視圖占據(jù)一塊矩形屏幕區(qū)域,并通過屬性設(shè)置來渲染此區(qū)域。視圖區(qū)域也可設(shè)置是否可見、是否可獲得焦點,也可處理區(qū)域中發(fā)生的事件(用戶觸摸、拖動等等)。在Android中,View類是所有用于設(shè)計界面組成元素的基類,Button、CheckBox、ExitView、ImageView、ProgressBar、TextView以及其他的UI組件,都是View類的子類或子類的派生類。視圖組是一種特殊的視圖,它不具有可見性,而是一種容器。在視圖組中可包含視圖組和視圖。ViewGroup類是View類的一個子類,它又是各種布局類的基類。常用的布局類有LinearLayout(線性布局)、RelativeLayout(相對布局)和FrameLayout(幀布局)類等。3.1.2布局的定義方法可通過兩種方法來定義布局:XML定義和代碼定義布局的XML定義是使用Android的XML詞匯,以文本的方式在快速設(shè)計UI布局及其包含的界面元素。3.1.3線性布局LinerLayoutLinerLayout是一個視圖組,它按照垂直或水平方式按順序排列內(nèi)部的視圖或視圖組對象。線性布局中,每行或每列中只允許有一個子視圖。android:gravity:設(shè)置內(nèi)部組件的顯示位置。android:orientation:設(shè)置內(nèi)部組件的排列方向,常量horizontal表示水平排列,vertical(默認值)表示垂直排列。android:background:設(shè)置一個drawable資源作為背景。android:id:設(shè)置布局ID.android:padding:設(shè)置所有邊距的統(tǒng)一值android:paddingBottom:設(shè)置底部邊距android:paddingLeft:設(shè)置左邊距android:paddingRight:設(shè)置右邊距android:paddingTop:設(shè)置頂部邊距3.1.4相對布局RelativeLayoutRelativeLayout是一個視圖組,它按照相對位置來排列各個子視圖。在使用相對布局時,子視圖默認位于左上角,可使用下列屬性來控制子視圖的位置:android:layout_alignParentTop:設(shè)置為true時,子視圖的上邊框與父視圖的上邊框?qū)R。android:layout_centerVertical:設(shè)置為true時,子視圖在垂直方向上的位于父視圖中間位置。android:layout_centerHorizontal:設(shè)置為true時,子視圖在水平方向上的位于父視圖中間位置。android:layout_below:設(shè)置一個控件ID,子視圖位于該控件下方。android:layout_toRightOf:設(shè)置一個控件ID,子視圖位于該控件右側(cè)。android:layout_toLeftOf:設(shè)置一個控件ID,子視圖位于該控件左側(cè)。3.1.5幀布局FrameLayout幀布局是一種特殊的布局,它以層疊的方式顯示布局中的多個控件,最后添加的控件位于最前面。默認情況下,控件位于幀布局的左上角??赏ㄟ^控件的android:layout_gravity屬性控制其位置。android:layout_gravity屬性可設(shè)置為下列值:top:控件位于布局頂部。bottom:控件位于布局底部。單獨使用時等價于“l(fā)eft|bottom”。left:控件位于布局左側(cè)。right:控件位于布局右側(cè)。單獨使用時等價于“top|right”。center:控件位于布局中心。center_vertical:控件位于垂直方向上的中間位置。單獨使用時等價于“l(fā)eft|center_vertical”。center_horizontal:控件位于水平方向上的中間位置。單獨使用時等價于“top|center_horizontal”。3.2 通用UI組件本節(jié)主要內(nèi)容:文本視圖(TextView)按鈕(Button)文本字段(EditText、AutoCompleteTextView)復(fù)選框(CheckBox)單選按鈕(RadioButton)切換按鈕(ToggleButton)下拉列表(Spinner)日期選取器(DatePicker)時間選取器(TimePicker)拖動條(SeekBar)3.2.1文本視圖(TextView)<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="hello,極客學(xué)院"/>可使用下列屬性設(shè)置文本顯示效果:android:typeface:設(shè)置字體。Android默認支持4中內(nèi)置字體:normal、sans、serif和monospace。android:textSize:設(shè)置字號。android:textColor:設(shè)置顏色。android:textStyle:設(shè)置文本樣式,可設(shè)置為bold、italic或bolditalic。3.2.2按鈕(Button、ImageButton)<Buttonandroid:text="Button1"
android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/button1"/><Buttonandroid:text="Button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:drawableLeft="@mipmap/ic_launcher"android:id="@+id/button2"/><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/ic_launcher"android:id="@+id/imageButton1"/>通常,需要為按鈕添加Click事件監(jiān)聽器。一種方法是在android:onClick屬性中設(shè)置Click事件監(jiān)聽器。例如:<Button
……android:id="@+id/button1"android:onClick="ClickButton1"/>其中的ClickButton1是在代碼中定義的一個方法,且方法必須是public和void類型。例如:publicvoidClickButton1(Viewview){TextViewtv1=(TextView)findViewById(R.id.textView);tv1.setText("單擊按鈕Button1");}另一種為按鈕添加Click事件監(jiān)聽器的方法是在代碼執(zhí)行setOnClickListener()方法。例如:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbt2=(Button)findViewById(R.id.button2);bt2.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){TextViewtv1=(TextView)findViewById(R.id.textView);tv1.setText("單擊按鈕Button2");}});}3.2.3文本字段
(EditText、AutoCompleteTextView)文本字段控件用于接收用戶輸入,可使用android:inputType屬性定義各種輸入行為準(zhǔn)則。常用android:inputType屬性值如下:text:允許輸入各種文本。textMultiLine:允許輸入多行文本。textEmailAddress:只允許輸入Email地址。textPassword:用于輸入密碼。number:只允許輸入數(shù)字。phone:用于輸入電話號碼。datetime:用于輸入日期時間。EditText<EditTextandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="textPassword"android:id="@+id/editText"/>AutoCompleteTextView第1步:在布局文件中添加AutoCompleteTextView控件。例如:<AutoCompleteTextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:completionThreshold="1"android:id="@+id/autoCompleteTextView"/>第2步:在資源文件res/values/strings.xml中定義提供自動完成提示的字符串?dāng)?shù)組資源。例如:<resources>……<string-arrayname="select_array"><item>cable</item><item>china</item><item>Chinese</item><item>Check</item></string-array></resources>第3步:為AutoCompleteTextView綁定提供自動完成提示的適配器。例如:AutoCompleteTextViewact=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);String[]selects=getResources().getStringArray(R.array.select_array);ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,selects);act.setAdapter(adapter);3.2.4復(fù)選框(CheckBox<CheckBoxandroid:text="加粗"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/checkBox1"android:onClick="ClickCheckBox1"/><CheckBoxandroid:text="傾斜"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/checkBox2"android:onClick="ClickCheckBox2"/>android:onClick屬性為復(fù)選框綁定了Click事件監(jiān)聽器,處理復(fù)選框Click事件。例如,下面的代碼實現(xiàn)在單擊復(fù)選框時,改變文本視圖的樣式:privatebooleanchecked1;publicvoidClickCheckBox1(Viewview){checked1=((CheckBox)view).isChecked();ChangeTextViewStyle();}privatebooleanchecked2;publicvoidClickCheckBox2(Viewview){checked2=((CheckBox)view).isChecked();ChangeTextViewStyle();
}ChangeTextViewStyle(){TextViewtv1=(TextView)findViewById(R.id.textView);Typefacetf=tv1.getTypeface();intstyle=0;if(checked1){style=1;if(checked2){style=3;}}elseif(checked2){style=2;}tv1.setTypeface(tf,style);}3.2.5單選按鈕(RadioButton)<RadioGroupandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:checkedButton="@+id/radioButton1"><RadioButtonandroid:text="藍色"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/radioButton1"android:layout_weight="1"android:onClick="ClickRadio"/><RadioButtonandroid:text="紅色"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/radioButton2"android:layout_weight="1"android:onClick="ClickRadio"/><RadioButtonandroid:text="綠色"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/radioButton3"android:layout_weight="1"android:onClick="ClickRadio"/></RadioGroup>android:onClick屬性為單選按鈕綁定Click事件監(jiān)聽器。例如在顏色顏色時更改TextView控件顏色:publicvoidClickRadio(Viewview){TextViewtv1=(TextView)findViewById(R.id.textView);switch(view.getId()){caseR.id.radioButton1:tv1.setTextColor(Color.rgb(0,0,255));break;caseR.id.radioButton2:tv1.setTextColor(Color.rgb(255,0,0));break;caseR.id.radioButton3:tv1.setTextColor(Color.rgb(0,255,0));}}3.2.6切換按鈕(ToggleButton)<ToggleButtonandroid:textOff="顯示背景圖片"android:textOn="隱藏背景圖片"android:layout_width="wrap_content"
android:layout_height="wrap_content"android:id="@+id/toggleButton"/>在代碼中可調(diào)用setOnCheckedChangeListener()方法為切換按鈕綁定事件監(jiān)聽器,處理其狀態(tài)變化。例如,下面的代碼利用切換按鈕設(shè)置或清除布局背景:ToggleButtontoggle=(ToggleButton)findViewById(R.id.toggleButton);toggle.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){LinearLayoutlayout=(LinearLayout)findViewById(R.id.activity_main);if(isChecked){layout.setBackgroundResource(R.drawable.back);//為布局設(shè)置背景圖片}else{layout.setBackgroundResource(0);//清除布局背景}}});3.2.7微調(diào)框(Spinner)微調(diào)框也可稱為下拉列表,它提供一組預(yù)定選項供用戶選擇。默認情況下,微調(diào)框只顯示當(dāng)前選中項。微調(diào)框與AutoCompleteTextView類似,但微調(diào)框不提供輸入功能,只在被觸摸時展開下拉列表。下面的代碼為布局添加一個微調(diào)框:(本節(jié)實例項目:源代碼\03\LearnUIComponent2)<Spinnerandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/spinner"/>3.2.8圖片視圖(ImageView)圖片視圖控件用于在界面中顯示圖片。使用圖片視圖控件時,需提供準(zhǔn)備圖片,并將圖片放在資源文件夾drawable中。例如,下面的代碼為布局添加一個圖片視圖控件:(本節(jié)實例項目:源代碼\03\LearnUIComponent2)<ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@drawable/run"android:id="@+id/imageView"/>3.2.9進度條(ProgressBar)進度條控件通常用于表示程序正在后臺處理數(shù)據(jù),避免用戶枯燥的等待。例如,下面的代碼為布局添加一個進度條:(本節(jié)實例項目:源代碼\03\LearnUIComponent2)<ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/progressBar"/>進度條有四種樣式:大圖標(biāo)(progressBarStyleLarge)中等圖標(biāo)(默認樣式,progressBarStyle)小圖標(biāo)(progressBarStyleSmall)水平條(progressBarStyleHorizontal)3.2.10拖動條(SeekBar拖動條可拖動滑塊的位置來獲得標(biāo)識的數(shù)值。例如,下面的代碼為布局添加一個拖動條,并將拖動條最大值設(shè)置為100:(本節(jié)實例項目:源代碼\03\LearnUIComponent2)<SeekBarandroid:layout_width="match_parent"android:layout_height="wrap_content"android:max="100"android:id="@+id/seekBar"/>3.3 消息通知在Android應(yīng)用中,可采用Toast或Notification兩種方式向用戶提供消息通知。本節(jié)主要內(nèi)容:使用Toast 使用Notification3.3.1使用ToastToast是在應(yīng)用運行期間,通過類似于對話框的方式向用戶顯示消息提示。Toast只占用很少的屏幕,并會在一段時間后自動消失。例如,下面的代碼來創(chuàng)建并顯示Toast通知:Contextcontext=getApplicationContext(); //獲得應(yīng)用上下文Stringtext="這是一個較長時間的Toast"; //準(zhǔn)備Taost中顯示的文本intduration=Toast.LENGTH_LONG; //用于設(shè)置Toast顯示時間Toasttoast=Toast.makeText(context,text,duration); //生成Toast對象toast.show(); //顯示Toast通知3.3.2使用NotificationNotification通知首先在通知區(qū)域(也稱狀態(tài)欄。)中顯示通知圖標(biāo),用戶展開抽屜式通知欄時,查看通知的詳細信息。圖3-19顯示了一個通知區(qū)域圖3-20顯示了抽屜式通知欄。一個通知通常由圖標(biāo)、標(biāo)題和內(nèi)容等組成。創(chuàng)建一個簡單的通知通常包含下列步驟。第一步:創(chuàng)建NotificationCompat.Builder對象。例如:(本節(jié)實例項目:源代碼\03\LearnNotification)NotificationCompat.Builderbuilder=
newNotificationCompat.Builder(MainActivity.this);第二步:調(diào)用NotificationCompat.Builder對象方法設(shè)置通知相關(guān)內(nèi)容。例如:builder.setSmallIcon(R.drawable.smallico); //設(shè)置通知小圖標(biāo)builder.setContentTitle("嗨,你有一個新消息!"); //設(shè)置通知標(biāo)題builder.setContentText("你已經(jīng)學(xué)會了創(chuàng)建Notification了。");//設(shè)置通知內(nèi)容builder.setAutoCancel(true); //設(shè)置自動刪除通知第三步:創(chuàng)建在抽屜式通知欄中單擊通知時啟動活動的Intent(如果僅僅需要顯示通知內(nèi)容,不提供通知單擊響應(yīng),則該步驟可以省略。)。例如:IntentresultIntent=
newIntent(MainActivity.this,NotificationActivity.class);TaskStackBuilderstackBuilder=TaskStackBuilder.create(MainActivity.this);stackBuilder.addParentStack(NotificationActivity.class);stackBuilder.addNextIntent(resultIntent);PendingIntentresultPendingIntent=stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(resultPendingIntent);第四步:創(chuàng)建Notification對象。例如:Notificationnotification=builder.build();第五步:創(chuàng)建NotificationManager對象顯示通知。例如:NotificationManagermanager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);manager.notify(NOTIFICATION_ID,notification);3.4 對話框
對話框用于在程序運行期間顯示一些重要信息,或者用對話框與用戶交互。對話框置頂于界面最前面,屏蔽其他所有控件的交互能力。本節(jié)主要內(nèi)容:AlertDialogProgressDialogDatePickerDialogTimePickerDialog3.4.1AlertDialogAlertDialog在對話框中顯示警告提示信息,用戶可在對話框中選擇取消或確認操作。例如,下面的代碼用于顯示AlertDialog:(本節(jié)實例項目:源代碼\03\LearnDialog)3.4.2ProgressDialogProgressDialog與AlertDialog類似,都可彈出一個對話框,并置頂屏蔽其他控件的交互能力。ProgressDialog可在對話框中顯示一個進度條。例如,下面的代碼用于顯示ProgressDialog。(本節(jié)實例項目:源代碼\03\LearnDialog)publicvoidshowProgressDialog(Viewview){ProgressDialogprogressDialog=newProgressDialog(MainActivity.this);//創(chuàng)建對話框progressDialog.setTitle("這是一個進度條對話框");//設(shè)置標(biāo)題progressDialog.setMessage("請耐心等待,正在處理數(shù)據(jù)……");//設(shè)置消息progressDialog.setCancelable(true);//設(shè)置可取消progressDialog.show();//顯示對話框}3.4.3DatePickerDialogDatePickerDialog用于顯示日期選取對話框,定義OnDateSetListener監(jiān)聽器,實現(xiàn)onDateSet()方法可獲得在對話框中選取的日期。例如,下面的代碼使用DatePickerDialog顯示日期選取對話框,并將選取的日期顯示在TextView中。(本節(jié)實例項目:源代碼\03\LearnDialog)3.4.4TimePickerDialogTimePickerDialog用于顯示時間選取對話框,定義OnTimeSetListener監(jiān)聽器,實現(xiàn)onTimeSet()方法可獲得在對話框中選取的時間。例如,下面的代碼使用TimePickerDialog顯示時間選取對話框,并將選取的時間顯示在TextView中。(本節(jié)實例項目:源代碼\03\LearnDialog)3.5 菜單在手機和平板等設(shè)備中,因為空間有限,不再像PC一樣為應(yīng)用程序配置菜單欄。Android提供了一種隱藏的菜單,只在需要的時候展示出來。在圖3-25所示的活動標(biāo)題欄右側(cè),顯示了一個三點符號,這就是菜單按鈕。點擊菜單按鈕可展開活動的菜單。菜單按鈕3.6 ListViewListView控件用于創(chuàng)建列表,比如聯(lián)系人、QQ聊天記錄等都可用列表來實現(xiàn)。ListView允許用戶通過上下滑動的方式將屏幕之外的內(nèi)容滾動到屏幕內(nèi)。本節(jié)主要內(nèi)容:
ListView簡單用法自定義ListView列表項布局處理ListView單擊事件3.6.1ListView簡單用法為布局添加ListView控件非常簡單。例如:(本節(jié)實例項目:源代碼\03\LearnListView)<ListViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/listView"/>首先在字符串資源文件string.xml中定義字符串?dāng)?shù)組。例如:<resources>
……<string-arrayname="LearnListViewData"><item>使用AndroidStudio環(huán)境</item><item>AndroidStudio實戰(zhàn)</item><item>Android編程權(quán)威指南</item></string-array></resources>然后在代碼中用該數(shù)組創(chuàng)建ArrayAdapter,并綁定到ListView。例如:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String[]data=getResources().getStringArray(R.array.LearnListViewData);ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);ListViewlistView=(ListView)findViewById(R.id.listView);listView.setAdapter(adapter);}3.6.2自定義ListView列表項布局普通ListView每個列表項只顯示一段文本,通過自定義,可以讓列表項顯示更豐富的內(nèi)容。下面的實例通過自定義,在列表項中顯示圖書封面圖片和書名。具體操作步驟如下:(本節(jié)實例項目:源代碼\03\LearnListView2)3.6.3處理ListView單擊事件要使ListView相應(yīng)用戶單擊事件,需要調(diào)用setOnItemClickListener()方法綁定OnItemClickListener監(jiān)聽器。例如,修改上節(jié)實例中的MainActivity.java,為ListView綁定監(jiān)聽器。代碼如下:protectedvoidonCreate(BundlesavedInstanceState){……ListViewlistView=(ListView)findViewById(R.id.listView);listView.setAdapter(adapter);listView.setOnItemClickListener(newAdapterView.OnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){Bookbook=bookList.get(position);Toast.makeText(MainActivity.this,book.getName(),Toast.LENGTH_LONG).show();}});}3.7 RecyclerViewListView在過去的Android應(yīng)用中發(fā)揮了巨大的作用,其功能強大,但缺點明顯。ListView只能實現(xiàn)數(shù)據(jù)垂直滾動,而且在不采取措施優(yōu)化時性能極差。Android提供了另一個功能更強、效率更高的滾動控件——RecyclerView。RecyclerView可看作是升級版的ListView,Android官方推薦使用RecyclerView來實現(xiàn)滾動列表。本節(jié)主要內(nèi)容:
RecyclerView基本用法自定義RecyclerView列表項布局RecyclerView布局處理RecyclerView單擊事件3.7.1RecyclerView基本用法要使用RecyclerView控件,首先需要在app\buil.gradle文件的dependencies閉包中添加支持庫。例如:dependencies{……compile'com.android.support:recyclerview-v7:25.3.1'}在布局文件中,可用代碼的代碼添加RecyclerView控件:<android.support.v7.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/recyclerView"/>下面的實例說明如何使用RecyclerView控件,具體操作步驟如下:(本節(jié)實例項目:源代碼\03\LearnRecyclerView)3.7.2自定義RecyclerView列表項布局與ListView類似,可以使用自定義RecyclerView的列表項布局。下面的實例通過自定義,在RecyclerView列表項中顯示圖書封面圖片和書名。具體操作步驟如下:(本節(jié)實例項目:源代碼\03\LearnRecyclerView2)3.7.3RecyclerView布局RecyclerView可以通過setLayoutManager()方法設(shè)置布局類型。RecyclerView支持LinearLayoutManager(線性布局)、StaggeredGridLayoutManager(瀑布流布局)和GridLayoutManager(網(wǎng)格布局)等布局。3.7.4處理RecyclerView單擊事件與ListView不同,RecyclerView沒有提供類似的setOnItemClickListener()方法來設(shè)置列表項監(jiān)聽器。但可通過RecyclerView列表項中的各個控件來設(shè)置監(jiān)聽器。修改3.7.2的LearnRecyclerView2實例中的BookAdapter.java,為列表項控件設(shè)置監(jiān)聽器,如下所示:Android移動應(yīng)用開發(fā)基礎(chǔ)教程講授:XXXXX第4章廣播機制本章主要內(nèi)容:廣播機制簡介使用廣播接收器廣播接收器優(yōu)先級與有序廣播4.1 廣播機制簡介Android的廣播機制非常靈活。廣播可來自于系統(tǒng),也來自其他應(yīng)用,甚至于應(yīng)用內(nèi)部的其他模塊。應(yīng)用程序可以只對感興趣的廣播進行注冊,也只有注冊了的廣播才可能接收到。Android中的廣播可分為兩種類型:標(biāo)準(zhǔn)廣播和有序廣播。標(biāo)準(zhǔn)廣播:標(biāo)準(zhǔn)廣播在發(fā)出后,所有接收器均可接收到
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026福建漳州開發(fā)區(qū)育才實驗小學(xué)招聘4人備考題庫及答案詳解參考
- 2025-2030亞洲農(nóng)產(chǎn)品出口行業(yè)市場供需結(jié)構(gòu)分析及產(chǎn)業(yè)投資方向評估規(guī)劃報告
- 2025-2030丹麥醫(yī)藥行業(yè)市場現(xiàn)狀及投資前景規(guī)劃分析研究報告
- 2025-2030東帝汶農(nóng)業(yè)科技轉(zhuǎn)化市場分析外資投資發(fā)展風(fēng)險評估
- 2025-2030東南沿??缇畴娚涛锪鱾}儲中心競爭格局與功能創(chuàng)新
- 2026年全省國家憲法考試題庫附答案
- 2025-2030東京珠寶首飾行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030業(yè)務(wù)外包行業(yè)市場需求分析與發(fā)展方向的及盈利前景的預(yù)測報告
- 2026年叉車安全法考試題庫帶答案
- 2025-2030一帶一路倡議貫徹中澳大利亞礦業(yè)行業(yè)市場定性分析及產(chǎn)業(yè)鏈重構(gòu)與可持續(xù)發(fā)展規(guī)劃
- 公司出口事務(wù)管理制度
- 保安證考試題庫及答案2025年
- 2025跨境電商購銷合同范本(中英文對照)
- 兒童出入境委托書
- 土建施工規(guī)范培訓(xùn)
- 汽車銷售月度工作總結(jié)與計劃
- 2025年人教版九年級物理知識點全面梳理與總結(jié)
- DB33T 2256-2020 大棚草莓生產(chǎn)技術(shù)規(guī)程
- 《建設(shè)工程造價咨詢服務(wù)工時標(biāo)準(zhǔn)(房屋建筑工程)》
- 10s管理成果匯報
- 半導(dǎo)體技術(shù)合作開發(fā)合同樣式
評論
0/150
提交評論