版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)Android開發(fā)環(huán)境搭建一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)任務(wù)1將在Windows操作系統(tǒng)計(jì)算機(jī)中搭建Android開發(fā)環(huán)境,主要包括AndroidStudio和AndroidSDK。我們將編寫運(yùn)行第一個(gè)APP,并介紹運(yùn)行時(shí)的相關(guān)配置。任務(wù)引入經(jīng)過(guò)項(xiàng)目1的學(xué)習(xí),我們可以使用ESP32網(wǎng)關(guān)、較少的外部設(shè)備和Arduino開發(fā)環(huán)境創(chuàng)建一個(gè)于本地工作的硬件系統(tǒng)。但如果要構(gòu)建一個(gè)方便實(shí)用的物聯(lián)網(wǎng)系統(tǒng),我們還需要進(jìn)行移動(dòng)應(yīng)用的開發(fā),即APP的設(shè)計(jì)。二、相關(guān)知識(shí)AndroidStudio有許多可用的AndroidIDE可以用于Android應(yīng)用的開發(fā)。IDE是集成開發(fā)環(huán)境(IntegratedDevelopmentEnvironment)的英文縮寫,也被稱為代碼編輯器。AndroidStudio是最受歡迎的AndroidIDE之一。在2013年5月16日的GoogleI/O大會(huì)上宣布后,AndroidStudio開始流行。開發(fā)者可以在編寫程序的同時(shí),看到應(yīng)用在不同尺寸屏幕中的樣子,使用方便。Arduino程序結(jié)構(gòu)SDK全稱SoftwareDevelopmentKit,即軟件開發(fā)工具包。AndroidSDK是用于為特定的軟件包、軟件框架、硬件平臺(tái)、操作系統(tǒng)等建立應(yīng)用軟件的開發(fā)工具的集合。AndroidSDK可以手動(dòng)下載,但更經(jīng)常是通過(guò)AndroidStudio下載,還可以下載安裝一些SDK工具,如手機(jī)模擬器、USB驅(qū)動(dòng)等。二、相關(guān)知識(shí)你還知道有哪些AndroidIDE?課堂討論相關(guān)鏈接AndroidStudio官網(wǎng):/studio/。三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了Windows操作系統(tǒng)的計(jì)算機(jī)(最好是云服務(wù)器)。實(shí)施過(guò)程軟件安裝(1)下載AndroidStudioAndroidStudio安裝包下載路徑:/studio,如圖2-1所示。圖2-1
AndroidStudio下載路徑三、任務(wù)實(shí)施(2)安裝AndroidStudio下載完成后,雙擊安裝包,選擇合適的安裝路徑,如圖2-2所示。其他步驟按照默認(rèn)選項(xiàng)即可安裝。圖2-2AndroidStudio安裝路徑(3)AndroidSDK安裝在圖2-3所示界面,詢問(wèn)是否導(dǎo)入設(shè)置,選擇不導(dǎo)入。圖2-3詢問(wèn)是否導(dǎo)入設(shè)置三、任務(wù)實(shí)施圖2-4提示找不到AndroidSDK在圖2-4所示界面,系統(tǒng)會(huì)提示找不到AndroidSDK,選擇“Cancel”。圖2-5選擇標(biāo)準(zhǔn)安裝選擇標(biāo)準(zhǔn)安裝,如圖2-5所示。三、任務(wù)實(shí)施根據(jù)喜好選擇UI主題,暗黑或者明亮模式均可,如圖2-6所示。圖2-6UI主題詢問(wèn)軟件許可證,選擇接受,如圖2-7所示。其他步驟按照默認(rèn)即可,然后等待安裝完成。圖2-7軟件許可證三、任務(wù)實(shí)施2.第一個(gè)APP(1)新建AndroidStudio工程。進(jìn)入歡迎頁(yè)面后,可以點(diǎn)擊“NewProject”新建一個(gè)工程,,也可以打開已有的工程?,F(xiàn)在新建一個(gè)工程。選擇“EmptyActivity”界面模板,如圖2-8所示。圖2-8選擇“EmptyActivity”界面模板三、任務(wù)實(shí)施命名工程,選擇語(yǔ)言,設(shè)置支持的最低安卓版本,如圖2-9所示。圖2-9新建工程的選項(xiàng)三、任務(wù)實(shí)施(2)運(yùn)行APP。進(jìn)入工程,如圖2-10所示,可將版本介紹關(guān)閉。圖2-10關(guān)閉版本介紹點(diǎn)擊圖2-10中的運(yùn)行按鈕,即可在虛擬機(jī)上運(yùn)行APP,如圖2-11所示。圖2-11在虛擬機(jī)上運(yùn)行APP三、任務(wù)實(shí)施3.AndroidStudio進(jìn)階(1)下載不同平臺(tái)版本的SDK。從File→Settings可以打開界面。勾選當(dāng)前AndroidStudio可以支持調(diào)試的Android平臺(tái)版本SDK,點(diǎn)擊Apply進(jìn)行下載,如圖2-12所示。圖2-12下載SDK三、任務(wù)實(shí)施(2)下載SDK工具。安裝GoogleUSBDriver,如圖2-13所示。用USB線將計(jì)算機(jī)和安卓手機(jī)連接,可在真機(jī)調(diào)試APP,或?qū)PP下載到手機(jī)運(yùn)行。圖2-13下載SDK工具(3)手機(jī)真機(jī)設(shè)置。在手機(jī)設(shè)置中找到手機(jī)的版本號(hào),然后快速點(diǎn)擊幾次版本號(hào),就可以進(jìn)入開發(fā)者模式。找到開發(fā)者選項(xiàng),根據(jù)需要勾選“USB調(diào)試(連接USB后啟用調(diào)試模式)”“USB安裝(允許通過(guò)USB安裝應(yīng)用)”。通過(guò)USB線連接計(jì)算機(jī)和安卓手機(jī),即可在AndroidStudio里看到真機(jī)。點(diǎn)擊Run即在真機(jī)下載運(yùn)行。在電腦的設(shè)備管理器———通用串行總線設(shè)備處也可以看到真機(jī)的型號(hào)。如果詢問(wèn)是否允許USB調(diào)試,則選擇同意。三、任務(wù)實(shí)施(4)AndroidStudio初始界面。如果不想啟動(dòng)AndroidStudio后打開上一個(gè)工程,可以不勾選“Reopenprojectsonstartup”,如圖2-14所示。這樣每次打開AndroidStudio,都會(huì)進(jìn)入新的開始界面。圖2-14設(shè)置AndroidStudio開始界面四、任務(wù)小結(jié)與練習(xí)任務(wù)小結(jié)任務(wù)1在計(jì)算機(jī)中搭建Android開發(fā)環(huán)境,并進(jìn)行了相關(guān)配置。編寫一個(gè)APP,分別在虛擬機(jī)和真機(jī)上運(yùn)行,將運(yùn)行照片上傳到課程學(xué)習(xí)平臺(tái)。實(shí)踐練習(xí)謝謝聆聽2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)自定義對(duì)話框的設(shè)計(jì)一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)在任務(wù)2中,將新建一個(gè)AndroidStudio工程,添加一個(gè)按鈕控件,當(dāng)點(diǎn)擊按鈕時(shí),彈出自定義對(duì)話框。重點(diǎn)內(nèi)容是自定義對(duì)話框的創(chuàng)建過(guò)程。任務(wù)引入在使用物聯(lián)網(wǎng)APP的過(guò)程中,往往會(huì)遇到一些場(chǎng)合,需要提醒用戶或引導(dǎo)用戶如何進(jìn)行下一步操作,用戶確認(rèn)后再進(jìn)入后續(xù)流程,以避免一些不可逆的風(fēng)險(xiǎn)。實(shí)現(xiàn)這樣的功能,我們就需要學(xué)習(xí)對(duì)話框控件。二、相關(guān)知識(shí)AlertDialog介紹AlertDialog在界面上彈出一個(gè)對(duì)話框,這個(gè)對(duì)話框是置頂于其他所有界面元素之上的,因此能夠屏蔽掉其他控件的交互能力。考慮AlertDialog的使用場(chǎng)景,它是在滿足某個(gè)時(shí)機(jī)才會(huì)被觸發(fā),比如用戶點(diǎn)擊了某個(gè)按鈕,或者出現(xiàn)異常狀況。而TextView、ImageView、Button等控件,一般都是固定在界面上來(lái)使用的。AlertDialog一般由圖標(biāo)、標(biāo)題、內(nèi)容、按鈕等元素組成,如圖2-15所示。用戶可以根據(jù)需求,設(shè)計(jì)AlertDialog彈出不同的內(nèi)容。例如,提示對(duì)話框的內(nèi)容是文本框,顯示提示內(nèi)容;單選對(duì)話框的內(nèi)容是一個(gè)單項(xiàng)選擇列表;而自定義對(duì)話框可以自行設(shè)計(jì)內(nèi)容,如登錄注冊(cè)時(shí)的一個(gè)或若干個(gè)輸入框。圖2-15AlertDialog結(jié)構(gòu)二、相關(guān)知識(shí)自定義對(duì)話框的創(chuàng)建過(guò)程AlertDialog并不是在布局文件中創(chuàng)建的,而是在活動(dòng)文件中通過(guò)構(gòu)造器(AlertDialog.Builder)來(lái)構(gòu)造圖標(biāo)、標(biāo)題、內(nèi)容和按鈕等元素的。自定義對(duì)話框的創(chuàng)建過(guò)程如下:(1)創(chuàng)建構(gòu)造器AlertDialog.Builder的對(duì)象;(2)AlertDialog.Builder調(diào)用setIcon、setTitle、setView方法,構(gòu)造對(duì)話框的圖標(biāo)、標(biāo)題、內(nèi)容等元素,其中圖標(biāo)和標(biāo)題可以不存在;(3)AlertDialog.Builder調(diào)用setPositiveButton、setNeutralButton、setNegative-Button方法,設(shè)置正面按鈕、中立按鈕和負(fù)面按鈕,其中正面按鈕和負(fù)面按鈕比較常用;(4)AlertDialog.Builder調(diào)用show方法,讓對(duì)話框在界面上顯示。在本任務(wù)中,自定義對(duì)話框的內(nèi)容區(qū)是一個(gè)輸入框EditView。創(chuàng)建EditView對(duì)象后,通過(guò)AlertDialog.Builder的setView方法,將EditView對(duì)象構(gòu)造為對(duì)話框的內(nèi)容。二、相關(guān)知識(shí)你還知道哪些類型的對(duì)話框?它們分別用于什么場(chǎng)合?課堂討論viewBinding框架視圖訪問(wèn)有findViewById、ButterKnife等多種方式,而通過(guò)viewBinding框架可以更輕松地編寫與視圖交互的代碼。viewBinding的意思就是將view與代碼綁定在一起,可以優(yōu)雅地在活動(dòng)文件代碼中引用layout文件中的view控件。啟用視圖綁定功能后,系統(tǒng)會(huì)為每一個(gè)xml布局文件各生成一個(gè)綁定類。每一個(gè)綁定類均包含對(duì)根視圖以及具備id的全部視圖的引用。系統(tǒng)會(huì)經(jīng)過(guò)如下方式生成綁定類的名稱:將xml布局文件的名稱轉(zhuǎn)換為駝峰式大小寫,并在末尾添加“Binding”一詞。三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī)。實(shí)施過(guò)程1.創(chuàng)建工程及配置如圖2-16所示,新建Android工程“AlertDialog”,在app→build.gradle中添加viewBinding框架:圖2-16添加viewBinding框架android.buildFeatures.viewBinding=true點(diǎn)擊同步。因?yàn)樘砑恿藇iewBinding框架,所以會(huì)為每一個(gè)布局文件自動(dòng)生成綁定類,比如會(huì)為activity_main.xml生成ActivityMainBinding類。三、任務(wù)實(shí)施在MainActivity.java文件中,創(chuàng)建了ActivityMainBinding類對(duì)象binding,在on-Create方法中實(shí)例化binding,并通過(guò)binding對(duì)象的getRoot方法得到activity_main.xml布局文件中的view,如圖2-17所示。圖2-17實(shí)例化binding類三、任務(wù)實(shí)施2.第一個(gè)布局準(zhǔn)備一個(gè)png文件,文件名要求小寫,添加到src→main→res→drawable目錄中,將作為自定義對(duì)話框的圖標(biāo),如圖2-18所示。圖2-18準(zhǔn)備一個(gè)圖標(biāo)三、任務(wù)實(shí)施在布局文件activity_main.xml中添加一個(gè)按鈕控件,id為btn1,文本內(nèi)容為“對(duì)話框”。布局文件activity_main.xml代碼如下:。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools=/toolsandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="HelloWorld!"/><Buttonandroid:id="@+id/btn1"android:text="對(duì)話框"android:layout_width="match_parent"android:layout_height="wrap_content"></Button></LinearLayout>三、任務(wù)實(shí)施3.為按鈕添加事件監(jiān)聽在MainActivity活動(dòng)文件中,獲取布局文件中添加的按鈕,并且為這個(gè)按鈕添加單擊事件監(jiān)聽器,如圖2-19所示。圖2-19為按鈕添加事件監(jiān)聽三、任務(wù)實(shí)施4.實(shí)現(xiàn)對(duì)話框功能MainActivity.java活動(dòng)文件中MainActivity類定義代碼如下:publicclassMainActivityextendsAppCompatActivity{ActivityMainBindingbinding;//創(chuàng)建activity_main布局類的對(duì)象@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);binding=ActivityMainBinding.inflate(getLayoutInflater());//獲取bindingsetContentView(binding.getRoot());//通過(guò)getRoot拿到view/*************顯示對(duì)話框按鈕******************/binding.btn1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){finalEditTextet=newEditText(MainActivity.this);et.setText("很好");//創(chuàng)建AlertDialog對(duì)象:用Builder構(gòu)造方法對(duì)其實(shí)例化,需傳入上下文對(duì)象三、任務(wù)實(shí)施//創(chuàng)建AlertDialog對(duì)象:用Builder構(gòu)造方法對(duì)其實(shí)例化,需傳入上下文對(duì)象AlertDialogalertDialog=newAlertDialog.Builder(MainActivity.this).setIcon(R.drawable.open)//設(shè)置圖標(biāo).setTitle("請(qǐng)?zhí)峤唤ㄗh")//設(shè)置標(biāo)題.setView(et)//設(shè)置輸入框.setPositiveButton("確定",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialogInterface,inti){StringeditText=et.getText().toString();//獲取輸入內(nèi)容Toast.makeText(MainActivity.this,"editText:"+editText,Toast.LENGTH_SHORT).show();}}).setNegativeButton("取消",null).show();}});}}三、任務(wù)實(shí)施在程序中:(1)binding對(duì)象通過(guò)id獲取到btn1按鈕后,設(shè)置btn1的單擊事件監(jiān)聽。(2)在重寫btn1的onClick方法中,創(chuàng)建了輸入框et,并創(chuàng)建了構(gòu)造器對(duì)象Alert-Dialog.Builder。(3)AlertDialog.Builder調(diào)用setIcon、setTitle、setView方法,構(gòu)造對(duì)話框的圖標(biāo)、標(biāo)題、內(nèi)容等元素,其中內(nèi)容為輸入框et。(4)AlertDialog.Builder調(diào)用setPositiveButton、setNegativeButton方法,設(shè)置確定按鈕和取消按鈕。其中,確定按鈕重寫了onClick方法,功能是獲取輸入框et的內(nèi)容,然后在界面Toast出來(lái);取消按鈕未做進(jìn)一步處理。(5)AlertDialog.Builder調(diào)用show方法,讓對(duì)話框在界面上顯示。三、任務(wù)實(shí)施4.效果展示效果如圖2-20所示,點(diǎn)擊btn1按鈕后,彈出自定義對(duì)話框;在自定義對(duì)話框的輸入框中輸入內(nèi)容后,會(huì)在界面Toast輸入內(nèi)容。后續(xù)在輸入框里輸入的內(nèi)容會(huì)通過(guò)網(wǎng)絡(luò)發(fā)送到Web服務(wù)器處理。圖2-20自定義對(duì)話框工作效果四、任務(wù)小結(jié)與練習(xí)任務(wù)小結(jié)任務(wù)2設(shè)計(jì)了自定義對(duì)話框,后續(xù)可以根據(jù)需要設(shè)計(jì)更復(fù)雜的自定義對(duì)話框,用于用戶的注冊(cè)、登錄等功能。修改自定義對(duì)話框的圖標(biāo)、標(biāo)題、內(nèi)容區(qū)的輸入框名稱等;修改正面按鈕的名稱為“提交”,運(yùn)行成功后,上傳結(jié)果到課程學(xué)習(xí)平臺(tái)。實(shí)踐練習(xí)謝謝聆聽2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)頁(yè)面跳轉(zhuǎn)一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)在任務(wù)3中,我們將新建一個(gè)AndroidStudio工程,創(chuàng)建2個(gè)頁(yè)面。使用Intent類,實(shí)現(xiàn)兩個(gè)活動(dòng)之間的跳轉(zhuǎn)。任務(wù)引入一般來(lái)說(shuō),一個(gè)物聯(lián)網(wǎng)APP有若干個(gè)頁(yè)面,用戶使用時(shí)需要在頁(yè)面之間實(shí)現(xiàn)跳轉(zhuǎn)。所謂頁(yè)面跳轉(zhuǎn),實(shí)際上就是一個(gè)活動(dòng)跳轉(zhuǎn)到另一個(gè)活動(dòng)。二、相關(guān)知識(shí)Intent類Android的Intent,即意圖,是一個(gè)要執(zhí)行的操作的抽象描述,解決Android應(yīng)用的各項(xiàng)組件之間的通信。一個(gè)Intent對(duì)象是一個(gè)被動(dòng)的數(shù)據(jù)結(jié)構(gòu),保存著要執(zhí)行的操作。Intent包括顯式和隱式兩類。顯式Intent直接用組件的名稱定義目標(biāo)組件,直接實(shí)現(xiàn)明確Activity類名的啟動(dòng),更多地用于應(yīng)用程序內(nèi)部的傳遞消息;隱式Intent通過(guò)設(shè)置Action、Data、Category,篩選出合適的Activity啟動(dòng)。顯式Intent類的常用方法(1)newIntent():用于創(chuàng)建一個(gè)意圖。(2)Intent對(duì)象.setClass(Content對(duì)象,Activity對(duì)象.class):setClass方法的第一個(gè)參數(shù)是Context(上下文)對(duì)象,setClass函數(shù)的第二個(gè)參數(shù)是一個(gè)Class對(duì)象。(3)startActivity(Intent對(duì)象):啟動(dòng)意圖。二、相關(guān)知識(shí)Intent除了實(shí)現(xiàn)活動(dòng)之間的跳轉(zhuǎn),還可以實(shí)現(xiàn)什么功能?課堂討論三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī)。實(shí)施過(guò)程1.創(chuàng)建工程及配置如圖2-21所示,新建Android工程“AlertDialog”,在app→build.gradle中添加viewBinding框架:圖2-21添加viewBinding框架android.buildFeatures.viewBinding=true點(diǎn)擊同步。因?yàn)樘砑恿藇iewBinding框架,所以會(huì)為每一個(gè)布局文件自動(dòng)生成綁定類,比如會(huì)為activity_main.xml生成ActivityMainBinding類。三、任務(wù)實(shí)施如圖2-22所示,在MainActivity.java文件中,創(chuàng)建了ActivityMainBinding類對(duì)象binding1,在onCreate方法中實(shí)例化binding1,并通過(guò)binding1對(duì)象的getRoot方法得到activity_main.xml布局文件中的view。圖2-22實(shí)例化binding類三、任務(wù)實(shí)施2.第一個(gè)頁(yè)面設(shè)計(jì)(1)activity_main.xml布局文件。代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextView android:layout_width="wrap_content" android:layout_height="60dp" android:text="FirstActivity!"/><Button android:id="@+id/btn1" android:text="clickme,willjumptopage2" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="60dp"></Button></LinearLayout>在activity_main.xml布局文件中,添加了1個(gè)按鈕控件,id為btn1,文本內(nèi)容為“clickme,willjumptopage2”。三、任務(wù)實(shí)施(2)MainActivity.java活動(dòng)文件。MainActivity.java活動(dòng)文件中MainActivity類定義代碼如下:publicclassMainActivityextendsAppCompatActivity{ActivityMainBindingbinding1;//activity_main布局類對(duì)象-聲明@OverrideprotectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); binding1=ActivityMainBinding.inflate(getLayoutInflater());//獲取binding setContentView(binding1.getRoot());//通過(guò)getRoot拿到view binding1.btn1.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ Intentintent1=newIntent(); //由MainActivity轉(zhuǎn)向SecondActivity intent1.setClass(MainActivity.this,SecondActivity.class); startActivity(intent1);//按照意圖1,啟動(dòng)Activity } });}}三、任務(wù)實(shí)施在程序中:①binding1對(duì)象通過(guò)id獲取到btn1按鈕后,設(shè)置btn1的單擊事件監(jiān)聽。②在重寫btn1的onClick方法中,創(chuàng)建意圖intent。③setClass方法的第一個(gè)參數(shù)是Context(上下文)對(duì)象,Context是一個(gè)類,Activity是Context類的子類,也就是說(shuō),所有的Activity對(duì)象,都可以向上轉(zhuǎn)型為Context對(duì)象;setClass方法的第二個(gè)參數(shù)是Class對(duì)象,在當(dāng)前場(chǎng)景下,傳入了需要被啟動(dòng)的Activity類的class對(duì)象SecondActivity.class。④通過(guò)startActivity方法啟動(dòng)意圖,實(shí)現(xiàn)跳轉(zhuǎn)。簡(jiǎn)而言之,btn1實(shí)現(xiàn)由MainActivity轉(zhuǎn)向SecondActivity。需要注意的是,此時(shí)的SecondActivity活動(dòng)還沒(méi)有,程序會(huì)報(bào)錯(cuò)。接下來(lái)設(shè)計(jì)第二個(gè)頁(yè)面。三、任務(wù)實(shí)施3.第二個(gè)頁(yè)面設(shè)計(jì)(1)復(fù)制新的布局和活動(dòng)文件。復(fù)制新的布局和活動(dòng)文件,文件位置和第一個(gè)頁(yè)面是一樣的:在src→main→res→layout目錄中增加activity_second.xml文件,在src→main→java→entactivity中增加SecondActivity.java文件。(2)activity_second.xml布局文件。代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".SecondActivity"><TextView android:layout_width="wrap_content" android:layout_height="60dp" android:text=“SecondActivity!"/><Button android:id="@+id/btn2" android:text="clickme,willjumptopage1" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="60dp"></Button></LinearLayout>在activity_second.xml布局文件中,添加了1個(gè)按鈕控件,id為btn2,文本內(nèi)容為“clickme,willjumptopage1”。三、任務(wù)實(shí)施(3)SecondActivity.java活動(dòng)文件。SecondActivity.java活動(dòng)文件中SecondActivity類定義代碼如下:publicclassMainActivityextendsAppCompatActivity{ActivityMainBindingbinding2;//activity_main布局類對(duì)象-聲明@OverrideprotectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); binding2=ActivityMainBinding.inflate(getLayoutInflater());//獲取binding setContentView(binding2.getRoot());//通過(guò)getRoot拿到view binding2.btn2.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ Intentintent2=newIntent(); //由MainActivity轉(zhuǎn)向SecondActivity intent2.setClass(MainActivity.this,SecondActivity.class); startActivity(intent2);//按照意圖2,啟動(dòng)Activity } });}}在btn2按鈕的單擊事件監(jiān)聽器中,設(shè)置意圖:由SecondActivity轉(zhuǎn)向MainActivity。三、任務(wù)實(shí)施4.運(yùn)行測(cè)試(1)活動(dòng)注冊(cè)。測(cè)試前,注意需要將第二個(gè)Activity即SecondActivity在AndroidManifest.xml中注冊(cè),如圖2-23所示。MainActivity默認(rèn)是注冊(cè)好的。(2)結(jié)果展示。連接手機(jī),運(yùn)行效果如圖2-24所示:點(diǎn)擊btn1和btn2按鈕,可以實(shí)現(xiàn)2個(gè)頁(yè)面之間的跳轉(zhuǎn)。真機(jī)和虛擬機(jī)運(yùn)行的效果是一樣的。圖2-23注冊(cè)SecondActivity圖2-24頁(yè)面跳轉(zhuǎn)效果(a)點(diǎn)擊btn1按鈕后(b)點(diǎn)擊btn2按鈕后四、任務(wù)小結(jié)與練習(xí)任務(wù)小結(jié)任務(wù)3使用Intent類,實(shí)現(xiàn)了2個(gè)頁(yè)面之間的跳轉(zhuǎn),即兩個(gè)活動(dòng)之間的跳轉(zhuǎn)。使用同樣的方法,我們也可以實(shí)現(xiàn)更多頁(yè)面之間的跳轉(zhuǎn)。再新建一個(gè)頁(yè)面,即APP有三個(gè)頁(yè)面,實(shí)現(xiàn)頁(yè)面之間的跳轉(zhuǎn)。實(shí)踐練習(xí)謝謝聆聽2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)HTTP請(qǐng)求與響應(yīng)一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)在任務(wù)4中,我們將學(xué)習(xí)OkHttp框架,在APP中創(chuàng)建HTTP客戶端,通過(guò)GET、POST以及同步、異步方式向服務(wù)器發(fā)送HTTP請(qǐng)求,接收到HTTP響應(yīng)后將相應(yīng)的數(shù)據(jù)部分取出處理。有些Web服務(wù)器提供了API接口,HTTP客戶端只要按照約定向Web服務(wù)器發(fā)送HTTP請(qǐng)求,就會(huì)獲取期望的返回?cái)?shù)據(jù)。任務(wù)引入HTTP全稱為HyperTextTransferProtocol,即超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應(yīng)用最廣泛的一種網(wǎng)絡(luò)協(xié)議。與瀏覽器Web應(yīng)用一樣,開發(fā)物聯(lián)網(wǎng)APP時(shí),一部分?jǐn)?shù)據(jù)也需要通過(guò)HTTP請(qǐng)求向服務(wù)器獲取。那么在AndroidStudio中有沒(méi)有簡(jiǎn)便的方法進(jìn)行HTTP的請(qǐng)求與響應(yīng)呢?二、相關(guān)知識(shí)HTTP協(xié)議HTTP是一種可擴(kuò)展的協(xié)議,是一種應(yīng)用層協(xié)議,是運(yùn)行在TCP之上的。因?yàn)榫哂辛己玫臄U(kuò)展性,所以HTTP協(xié)議不僅被用來(lái)傳輸超文本文檔,還被用來(lái)傳輸圖片或視頻以及提交HTML表單等信息。用戶通過(guò)瀏覽器輸入url提交請(qǐng)求,就是使用的HTTP協(xié)議。HTTP的使用比較簡(jiǎn)單,HTTP報(bào)文允許簡(jiǎn)單測(cè)試,容易讀懂,開發(fā)門檻較低。OkHttp框架OkHttp是Android開發(fā)的最常用的網(wǎng)絡(luò)請(qǐng)求框架,由Square公司開源。OkHttp可以理解為是一個(gè)HTTP層面的框架,它的工作原理簡(jiǎn)單來(lái)說(shuō)就是:(1)首先利用socket建立與服務(wù)器的TCP連接;(2)然后將符合HTTP協(xié)議的請(qǐng)求報(bào)文拼接好并傳遞到服務(wù)器;(3)最后讀取服務(wù)器的響應(yīng)。除了基本的HTTP使用,OkHttp還提供了線程池,以此來(lái)執(zhí)行異步請(qǐng)求。二、相關(guān)知識(shí)相關(guān)鏈接OkHttp框架使用流程如圖2-25所示:(1)通過(guò)newOkHttpClient()創(chuàng)建HTTP客戶端對(duì)象;(2)通過(guò)Request.Builder創(chuàng)建Request請(qǐng)求對(duì)象(用于請(qǐng)求包);(3)通過(guò)調(diào)用HTTP客戶端對(duì)象的newCall方法,傳入Request對(duì)象,生成Call對(duì)象(用于發(fā)送請(qǐng)求);(4)由Call對(duì)象調(diào)用execute或enqueue方法提交請(qǐng)求,得到響應(yīng)Response。注意,如圖2-25所示,同步請(qǐng)求和異步請(qǐng)求的前三步一樣,包括創(chuàng)建HTTP客戶端對(duì)象、創(chuàng)建Request請(qǐng)求包、創(chuàng)建發(fā)送請(qǐng)求Call對(duì)象。但第四步不同:如果同步請(qǐng)求Call對(duì)象調(diào)用execute()方法,則直接請(qǐng)求;如果異步請(qǐng)求Call對(duì)象調(diào)用enqueue()方法,則將請(qǐng)求加入隊(duì)列中。圖2-25OkHttp框架使用流程OkHttp使用流程OKHttp官網(wǎng):https://square.github.io/okhttp/。二、相關(guān)知識(shí)GET請(qǐng)求方法OkHttp官網(wǎng)提供了GET請(qǐng)求方法的示例,代碼如下:OkHttpClientclient=newOkHttpClient();Stringrun(Stringurl)throwsIOException{Requestrequest=newRequest.Builder().url(url).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}}在示例的GET方法中:(1)通過(guò)newOkHttpClient()創(chuàng)建了HTTP客戶端對(duì)象client;(2)創(chuàng)建了請(qǐng)求包對(duì)象request,調(diào)用url()方法設(shè)置要直接訪問(wèn)的url(參數(shù)包含在url中,即GET方法);(3)調(diào)用newCall()方法生成call對(duì)象,調(diào)用execute()方法(即同步請(qǐng)求)得到響應(yīng)response,并通過(guò)body()方法獲取響應(yīng)的數(shù)據(jù)部分。二、相關(guān)知識(shí)POST請(qǐng)求方法OkHttp官網(wǎng)提供了POST請(qǐng)求方法的示例,代碼如下:publicstaticfinalMediaTypeJSON=MediaType.get("application/json;charset=utf-8");OkHttpClientclient=newOkHttpClient();Stringrun(Stringurl,Stringjson)throwsIOException{Requestrequest=newRequest.Builder().url(url).post(body).build();try(Responseresponse=client.newCall(request).execute()){returnresponse.body().string();}}在示例的POST方法中:(1)通過(guò)newOkHttpClient()創(chuàng)建了HTTP客戶端對(duì)象client;(2)將參數(shù)放在RequestBody類對(duì)象中,后面通過(guò)POST方法提交;(3)創(chuàng)建了請(qǐng)求包對(duì)象request,調(diào)用url()方法設(shè)置url,并調(diào)用POST方法設(shè)置要提交的一些參數(shù)(即POST方法);(4)調(diào)用newCall()方法生成call對(duì)象,調(diào)用execute()方法(即同步請(qǐng)求)得到響應(yīng)response,并通過(guò)body()方法獲取響應(yīng)的數(shù)據(jù)部分。二、相關(guān)知識(shí)在HTTP請(qǐng)求方法中,有哪些組合形式?課堂討論三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī)。實(shí)施過(guò)程1.創(chuàng)建工程及配置(1)添加框架。如圖2-26所示,新建Android工程“OKHttpClient”,在app→build.gradle中添加viewBinding框架:圖2-26添加viewBinding和OkHttp框架android.buildFeatures.viewBinding=true添加OkHttp框架:mplementationc'om.squareup.okhttp3:okhttp:5.0.0-alpha.10'點(diǎn)擊同步。三、任務(wù)實(shí)施(2)編寫HTTP請(qǐng)求的配置文件。如圖2-27所示,在res的xml文件夾,新建network_security_config.xml文件,代碼如下:<?xmlversion="1.0"encoding="utf-8"?><network-security-config><base-configcleartextTrafficPermitted="true"/></network-security-config>圖2-27編寫HTTP請(qǐng)求的配置文件Android系統(tǒng)限制了HTTP協(xié)議明文流量的網(wǎng)絡(luò)請(qǐng)求,對(duì)HTTPS是沒(méi)有影響的。本任務(wù)中會(huì)使用到HTTP,所以需要編寫網(wǎng)絡(luò)安全配置文件,將cleartextTrafficPermitted設(shè)置為“true”。三、任務(wù)實(shí)施(3)添加網(wǎng)絡(luò)權(quán)限。如圖2-28所示,允許程序打開網(wǎng)絡(luò)套接字:<uses-permissionandroid:name="android.permission.INTERNET"/>圖2-28添加網(wǎng)絡(luò)權(quán)限然后通過(guò)networkSecurityConfig配置,開啟非加密的HTTP網(wǎng)絡(luò)請(qǐng)求(也可以不要):android:networkSecurityConfig="@xml/文件名"三、任務(wù)實(shí)施2.頁(yè)面布局設(shè)計(jì)activity_main.xml布局文件的代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="warp_content" android:text=“測(cè)試同步請(qǐng)求“/><TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content"/>三、任務(wù)實(shí)施在布局文件中,設(shè)計(jì)了2個(gè)按鈕(用于測(cè)試同步和異步請(qǐng)求)和2個(gè)文本框(用于顯示響應(yīng)值)。兩個(gè)按鈕控件的id分別是btn1和btn2,兩個(gè)文本框控件的id分別textView1和textView2。<Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="warp_content" android:text=“測(cè)試異步請(qǐng)求“/><TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>三、任務(wù)實(shí)施3.活動(dòng)文件設(shè)計(jì)(1)創(chuàng)建對(duì)象。如圖2-29所示,在MainActivity.java活動(dòng)文件中,創(chuàng)建了一個(gè)ActivityMain-Binding對(duì)象binding和一個(gè)HTTP客戶端對(duì)象okHttpClient。okHttpClient對(duì)象通過(guò)OkHttpClient.Builder()構(gòu)造,并調(diào)用build方法實(shí)例化。圖2-29MainActivity活動(dòng)中創(chuàng)建對(duì)象三、任務(wù)實(shí)施(2)兩個(gè)按鈕的單擊事件監(jiān)聽。代碼如下:binding.btn1.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ testGet_s(); }});binding.btn2.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ testPost_as(); }});在btn1的單擊事件監(jiān)聽里面,調(diào)用了同步請(qǐng)求函數(shù)testGet_s。在btn2的單擊事件監(jiān)聽里面,調(diào)用了異步請(qǐng)求函數(shù)testPost_as。所謂同步請(qǐng)求,就是直接請(qǐng)求;所謂異步請(qǐng)求,就是把請(qǐng)求加入enqueue(隊(duì)列)中,等待執(zhí)行。下面分別編寫這兩個(gè)同步請(qǐng)求函數(shù)和異步請(qǐng)求函數(shù):在同步請(qǐng)求函數(shù)中用GET方法,在異步請(qǐng)求函數(shù)中用POST方法。當(dāng)然這個(gè)也根據(jù)自己的需要選擇。三、任務(wù)實(shí)施(3)btn1的同步請(qǐng)求函數(shù)testGet_s。代碼如下://同步請(qǐng)求函數(shù)
privatevoidtestGet_s(){
//創(chuàng)建請(qǐng)求對(duì)象
Requestrequest=newRequest.Builder()
.url("/v7/weather/now?location=101010100&key=d7ac748d2e2447cdb8d42e13451a646d")
.build();
//開啟子線程,因操作耗時(shí)不能在主線程中執(zhí)行
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//創(chuàng)建響應(yīng)對(duì)象,客戶端的newCall就是發(fā)起請(qǐng)求的方法,execute是直接執(zhí)行即同步請(qǐng)求,返回即是響應(yīng)
Responseresponse=okHttpClient.newCall(request).execute();
//獲取響應(yīng)的數(shù)據(jù)部分
Stringresult=response.body().string();
//在主線程更新UI,即在textView1文本框中顯示三、任務(wù)實(shí)施
//在主線程更新UI,即在textView1文本框中顯示
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
binding.textView1.setText(result);
}
});
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
}在testGet_s函數(shù)中:①創(chuàng)建了請(qǐng)求包對(duì)象request,調(diào)用url()方法設(shè)置要直接訪問(wèn)的url(參數(shù)包含在url中,即GET方法);②HTTP客戶端調(diào)用newCall()方法生成call對(duì)象,調(diào)用execute()方法(即同步請(qǐng)求)得到響應(yīng)response,并通過(guò)body()方法獲取響應(yīng)的數(shù)據(jù)部分。三、任務(wù)實(shí)施注意:因?yàn)镠TTP網(wǎng)絡(luò)請(qǐng)求耗時(shí),所以需要開啟子線程,在子線程中發(fā)起請(qǐng)求;當(dāng)獲取到響應(yīng)的數(shù)據(jù)部分后,需要開啟UI線程,在UI線程中更新UI;因?yàn)榭赡艹霈F(xiàn)的異常情況,程序中進(jìn)行了異常的捕獲和處理。還要注意在btn1的單擊事件監(jiān)聽中,需要調(diào)用testGet_s同步請(qǐng)求函數(shù)。單擊測(cè)試同步請(qǐng)求按鈕,在APP中測(cè)試,可以成功獲取到返回的天氣情況,并展示出來(lái),如圖2-30所示,圖中還展示了通過(guò)瀏覽器查詢的結(jié)果。圖2-30在APP中測(cè)試同步請(qǐng)求三、任務(wù)實(shí)施登錄/,使用和風(fēng)天氣API,注冊(cè)后可獲得自己的key,然后給出要查詢城市的Location_ID即可如:/v7/weather/now?location=101010100&key=d7ac748d2e2447cdb8d42e13451a646d其中的101010100是北京的Location_ID。相關(guān)鏈接Devapi參考文檔:/docs/api/weather/weather-now/。三、任務(wù)實(shí)施(4)btn2的異步請(qǐng)求函數(shù)testPost_as。//異步請(qǐng)求函數(shù),/get.php,apipost工具
privatevoidtestPost_as(){
//創(chuàng)建表單
FormBodyformBody=newFormBody.Builder()
.add("username","1")
.build();
//將表單數(shù)據(jù)放入request中,通過(guò)post方法提交
Requestrequest=newRequest.Builder()
.url("/get.php")
.post(formBody)
.build();
//將客戶端請(qǐng)求加入到隊(duì)列中,會(huì)自動(dòng)在子線程中運(yùn)行。返回有2種情況,失敗或者有響應(yīng)
okHttpClient.newCall(request).enqueue(newCallback(){
@Override
publicvoidonFailure(@NonNullCallcall,@NonNullIOExceptione){
e.printStackTrace();
}
@Override在異步方式下,不再需要主動(dòng)創(chuàng)建子線程,只需要把創(chuàng)建的請(qǐng)求加入隊(duì)列中即可。testPost_as函數(shù)代碼如下:三、任務(wù)實(shí)施@Override
publicvoidonResponse(@NonNullCallcall,@NonNullResponseresponse)throwsIOException{
//獲取響應(yīng)的數(shù)據(jù)部分
Stringresult=response.body().string();
//在主線程更新UI,即在textView2文本框中顯示
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
binding.textView2.setText(result);
}
});
}
});
}函數(shù)中創(chuàng)建了一個(gè)表單,將表單數(shù)據(jù)放入request中,通過(guò)POST方法提交。將客戶端請(qǐng)求加入隊(duì)列中,會(huì)自動(dòng)在子線程中運(yùn)行。返回有2種情況:失敗或者有響應(yīng)。如果有響應(yīng),則獲取響應(yīng)的數(shù)據(jù)部分,在主線程更新UI,即在textView2文本框中顯示。三、任務(wù)實(shí)施注意在btn2的單擊事件監(jiān)聽中,調(diào)用testPost_as異步請(qǐng)求函數(shù)。單擊測(cè)試btn2異步請(qǐng)求按鈕,在APP中測(cè)試異步請(qǐng)求,如圖2-31所示。圖2-31在APP中測(cè)試異步請(qǐng)求測(cè)試發(fā)現(xiàn),可以成功返回?cái)?shù)據(jù)并展示出來(lái)。相關(guān)鏈接pipost工具:/get.php。三、任務(wù)實(shí)施(5)解決瀏覽器亂碼問(wèn)題。有的瀏覽器(HTTP客戶端)在HTTP請(qǐng)求返回的消息中出現(xiàn)亂碼,是字符編碼的問(wèn)題,可以按以下步驟處理。以Google瀏覽器為例,首先解壓瀏覽器擴(kuò)展程序,如圖2-32所示。圖2-32解壓瀏覽器擴(kuò)展程序圖2-33加載已解壓的擴(kuò)展程序然后加載已解壓的擴(kuò)展程序,如圖2-33所示。點(diǎn)擊Chrome瀏覽器地址欄右側(cè)的擴(kuò)展程序圖標(biāo),選擇Charset右側(cè)的圖釘,可以將其固定在地址欄右側(cè),以方便后續(xù)使用。三、任務(wù)實(shí)施最后,當(dāng)請(qǐng)求返回?cái)?shù)據(jù)亂碼時(shí),點(diǎn)擊Charset圖標(biāo),選擇UTF-8,即可重新發(fā)送請(qǐng)求加載頁(yè)面,請(qǐng)求回來(lái)的數(shù)據(jù)中文不再顯示成亂碼,如圖2-34所示。圖2-34正確的數(shù)據(jù)顯示三、任務(wù)實(shí)施中國(guó)作為一個(gè)擁有龐大的互聯(lián)網(wǎng)用戶群體和技術(shù)創(chuàng)新能力的國(guó)家,在互聯(lián)網(wǎng)領(lǐng)域涌現(xiàn)出很多優(yōu)秀的API,包括移動(dòng)支付API(如支付寶、微信支付等)、地圖API(如百度地圖、高德地圖等)、社交媒體API(如微博、微信開放平臺(tái)等)、短信服務(wù)API等。這些API不僅為互聯(lián)網(wǎng)企業(yè)和開發(fā)者提供了便捷的技術(shù)支持,也為用戶帶來(lái)了更加智能化、便利化的服務(wù)體驗(yàn)。除了互聯(lián)網(wǎng)領(lǐng)域,中國(guó)在人工智能、物聯(lián)網(wǎng)、大數(shù)據(jù)等領(lǐng)域也涌現(xiàn)出一批優(yōu)秀的API。例如,在人工智能領(lǐng)域,騰訊AI開放平臺(tái)、百度AI開放平臺(tái)等都提供了豐富的API,包括語(yǔ)音識(shí)別、圖像識(shí)別、自然語(yǔ)言處理等方面的功能。在物聯(lián)網(wǎng)領(lǐng)域,阿里云物聯(lián)網(wǎng)平臺(tái)、華為物聯(lián)網(wǎng)平臺(tái)等也提供了豐富的API,包括設(shè)備接入、數(shù)據(jù)處理、規(guī)則引擎等方面的功能。中國(guó)的API不僅為國(guó)內(nèi)企業(yè)和開發(fā)者提供了豐富的技術(shù)支持,也在全球范圍內(nèi)受到越來(lái)越多的關(guān)注和應(yīng)用。我們?cè)趯W(xué)習(xí)物聯(lián)網(wǎng)系統(tǒng)設(shè)計(jì)的過(guò)程中,也可以在尊重知識(shí)產(chǎn)權(quán)、保護(hù)用戶隱私、確保安全性等方面的原則下,開發(fā)自己的API,提供給用戶使用,共同推動(dòng)API技術(shù)的健康發(fā)展,按照黨的二十大報(bào)告提出的“建設(shè)現(xiàn)代化產(chǎn)業(yè)體系”目標(biāo),促進(jìn)數(shù)字經(jīng)濟(jì)和實(shí)體經(jīng)濟(jì)深度融合。eoapi參考文檔:/docs/api/geoapi/city-lookup/相關(guān)鏈接學(xué)思之窗四、任務(wù)小結(jié)與練習(xí)任務(wù)小結(jié)任務(wù)4利用OkHttp框架,在APP中創(chuàng)建HTTP客戶端,分別通過(guò)GET、POST、同步、異步方式向服務(wù)器發(fā)送HTTP請(qǐng)求,接收到HTTP響應(yīng)后將相應(yīng)的數(shù)據(jù)部分取出展示。在后續(xù)任務(wù)中,我們會(huì)使用OkHttp框架實(shí)現(xiàn)天氣預(yù)報(bào)功能。任務(wù)4通過(guò)城市ID查詢了天氣情況。如果要查詢城市的Location_ID,可使用以下API:/v2/city/lookup?location=%E5%8C%97%E4%BA%AC&key=d7ac748d2e2447cdb8d42e13451a646d通過(guò)城市名稱在瀏覽器查詢你家鄉(xiāng)的城市ID,然后修改APP中同步請(qǐng)求函數(shù)中的url,獲取展示你家鄉(xiāng)的天氣情況。實(shí)踐練習(xí)謝謝聆聽2相關(guān)知識(shí)34任務(wù)小結(jié)與練習(xí)1任務(wù)實(shí)施任務(wù)引入與目標(biāo)物聯(lián)網(wǎng)APP的布局設(shè)計(jì)一、任務(wù)引入與目標(biāo)任務(wù)目標(biāo)在任務(wù)5中,我們將新建一個(gè)Android工程,開始物聯(lián)網(wǎng)APP的設(shè)計(jì)。設(shè)計(jì)的物聯(lián)網(wǎng)APP共有三個(gè)頁(yè)面:頁(yè)面1用于用戶登錄和注冊(cè),頁(yè)面2用于MQTT通信功能,頁(yè)面3實(shí)現(xiàn)HTTP通信功能。當(dāng)然本任務(wù)只進(jìn)行頁(yè)面的布局設(shè)計(jì),具體功能在接下來(lái)的項(xiàng)目和任務(wù)中逐步完成。任務(wù)引入有了自定義對(duì)話框、意圖和HTTP相關(guān)的基礎(chǔ),下面就可以正式開始物聯(lián)網(wǎng)APP的設(shè)計(jì)了。APP設(shè)計(jì)的首要問(wèn)題是布局,一個(gè)合理的、功能完善的APP應(yīng)該是什么樣子的?布局又需要我們掌握哪些知識(shí)呢?二、相關(guān)知識(shí)Android的View類View類是所有可視化控件的基類,主要提供控件繪制和事件處理的方法。TextView、EditText、Button均繼承自View類。View及其子類的相關(guān)屬性可以在布局XML文件中使用“Android:名稱空間”來(lái)設(shè)置,也可以通過(guò)成員方法在代碼中進(jìn)行設(shè)置。Android的布局在Android中,View有六大布局,分別是:LinearLayout(線性布局)、Relative-Layout(相對(duì)布局)、TableLayout(表格布局)、FrameLayout(幀布局)、Absolute-Layout(絕對(duì)布局)、GridLayout(網(wǎng)格布局)。布局方式使用XML語(yǔ)言進(jìn)行描述。二、相關(guān)知識(shí)你見過(guò)或者使用過(guò)哪些和物聯(lián)網(wǎng)相關(guān)的APP?這些APP都有什么功能?課堂討論三、任務(wù)實(shí)施實(shí)施設(shè)備安裝了AndroidStudio開發(fā)環(huán)境的計(jì)算機(jī)。實(shí)施過(guò)程1.新建工程在AndroidStudio新建工程“IOTSystem”,默認(rèn)頁(yè)面的布局文件和活動(dòng)文件分別是activity_main.xml和MainActivity。如圖2-35所示,可以通過(guò)復(fù)制的方法再增加2個(gè)頁(yè)面,默認(rèn)的頁(yè)面是第1個(gè)頁(yè)面。增加的第2個(gè)頁(yè)面的布局文件和活動(dòng)文件分別是activity_second.xml和SecondActivity,增加的第3個(gè)頁(yè)面的布局文件和活動(dòng)文件分別是activity_third.xml和ThirdActivity。圖2-35增加2個(gè)頁(yè)面三、任務(wù)實(shí)施2.頁(yè)面1的布局在頁(yè)面1的activity_main.xml文件中,放置兩個(gè)按鈕,表示注冊(cè)和登錄,如圖2-36所示。圖2-36頁(yè)面1布局預(yù)覽三、任務(wù)實(shí)施兩個(gè)按鈕控件的id分別為btn11、btn12。代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayout android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent"> <Button style="?android:attr/buttonBarButtonStyle" android:id="@+id/btn11" android:text="登錄" android:textSize="20sp“ android:layout_marginEnd="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button>三、任務(wù)實(shí)施 <Button android:id="@+id/btn12" android:text="注冊(cè)" android:textSize="20sp" android:layout_marginStart="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/buttonBarButtonStyle"> </Button></LinearLayout></LinearLayout>在程序中,android:gravity="center"設(shè)置線性布局里2個(gè)按鈕的對(duì)齊方式為居中;默認(rèn)排列方向?yàn)閔orizontal,設(shè)置線性布局內(nèi)部?jī)蓚€(gè)按鈕水平排列;線性布局的寬度和高度都是“match_parent”,代表充滿父容器。btn11、btn12按鈕的寬度和高度為“wrap_content”,代表實(shí)際大小。三、任務(wù)實(shí)施3.頁(yè)面2的布局(1)頁(yè)面2總體布局設(shè)計(jì)。在頁(yè)面2的activity_second.xml文件中,總體是按線性布局設(shè)計(jì)的,如圖2-37所示。圖2-37頁(yè)面2布局預(yù)覽三、任務(wù)實(shí)施代碼如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".SecondActivity">
<!--1.控制--><!--2-狀態(tài)--><!--3-接受消息--><!--4-下一頁(yè)--></LinearLayout>整個(gè)頁(yè)面由4個(gè)部分構(gòu)成,全部采用線性布局,方向垂直。每部分如下:控制部分,有2個(gè)控制用的ImageView;狀態(tài)部分,其中2個(gè)TextView用于顯示溫度、濕度的值;接收消息部分,用于顯示MQTT接收消息;下一頁(yè)部分,由1個(gè)按鈕構(gòu)成,點(diǎn)擊跳轉(zhuǎn)下一頁(yè)。三、任務(wù)實(shí)施(2)準(zhǔn)備2個(gè)圖標(biāo)。在網(wǎng)上(比如阿里巴巴圖標(biāo)庫(kù))下載2個(gè)圖標(biāo),如圖2-38所示,其中2個(gè)圖標(biāo)像素為128×128。名稱中的字母為小寫。圖2-38準(zhǔn)備2個(gè)圖標(biāo)粘貼2個(gè)圖標(biāo)文件到app→main→res→drawable目錄,如圖2-39所示。圖2-39添加圖標(biāo)到工程中三、任務(wù)實(shí)施(3)頁(yè)面2的控制部分布局。代碼如下:
<!--1.控制--><LinearLayout android:layout_marginTop="50dp" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="150dp"> <LinearLayout android:orientation="vertical" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:src="@drawable/led1" android:id="@+id/image21“ android:layout_gravity="center_horizontal" android:layout_width="80dp" android:layout_height="80dp"> </ImageView>三、任務(wù)實(shí)施 <TextView android:text="開燈" android:textSize="20sp
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融安全與誠(chéng)信教育
- 石河子大學(xué)《中藥鑒定學(xué)實(shí)驗(yàn)一》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《藥物分析》2022-2023學(xué)年第一學(xué)期期末試卷
- 食品安全十三五規(guī)劃
- 石河子大學(xué)《計(jì)算機(jī)組織與結(jié)構(gòu)》2022-2023學(xué)年期末試卷
- 石河子大學(xué)《兒科學(xué)與兒童保健學(xué)見習(xí)》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《三維工程軟件》2023-2024學(xué)年第一學(xué)期期末試卷
- 沈陽(yáng)理工大學(xué)《建筑結(jié)構(gòu)》2022-2023學(xué)年第一學(xué)期期末試卷
- 2018年四川內(nèi)江中考滿分作文《我心中的英雄》
- 沈陽(yáng)理工大學(xué)《含能材料》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年九年級(jí)上學(xué)期期中考試英語(yǔ)試題
- 電子發(fā)票管理系統(tǒng)開發(fā)與維護(hù)合同
- 四川新農(nóng)村建設(shè)農(nóng)房設(shè)計(jì)方案圖集川西部分
- 浙江省杭州市2024年中考英語(yǔ)真題(含答案)
- 安全工程導(dǎo)論課件:事故致因理論
- 山東省青島實(shí)驗(yàn)中學(xué)2024-2025學(xué)年七年級(jí)上學(xué)期期中考試數(shù)學(xué)試題(無(wú)答案)
- 2024年國(guó)家公務(wù)員考試《行測(cè)》真題卷(行政執(zhí)法)答案和解析
- 消化內(nèi)科五年發(fā)展規(guī)劃
- 車輛采購(gòu)服務(wù)投標(biāo)方案(技術(shù)方案)
- 中國(guó)融通集團(tuán)招聘筆試題
- 生豬屠宰獸醫(yī)衛(wèi)生檢驗(yàn)人員理論考試題庫(kù)及答案
評(píng)論
0/150
提交評(píng)論