溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android命名規(guī)范有哪些

發(fā)布時(shí)間:2021-06-24 14:16:39 來(lái)源:億速云 閱讀:173 作者:Leah 欄目:移動(dòng)開發(fā)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Android命名規(guī)范有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

PROCESS

在書中“使用解決方案領(lǐng)域名稱”部分里,Martin寫到:

記住,只有程序員才會(huì)讀你的代碼。所以,盡管用那些計(jì)算機(jī)科學(xué)術(shù)語(yǔ)、算法名、模式名、數(shù)學(xué)術(shù)語(yǔ)吧。

Process(進(jìn)程)的名字就是這么來(lái)的。在Android系統(tǒng)中,Process只不過(guò)是一個(gè)普通的計(jì)算進(jìn)程,這是計(jì)算機(jī)所關(guān)心的東西,使用者自然不會(huì)關(guān)心它,事實(shí)上開發(fā)者也很少使用到這個(gè)概念。當(dāng)我們談?wù)撨M(jìn)程、多進(jìn)程實(shí)現(xiàn)與進(jìn)程間通信時(shí),你會(huì)想到這些在計(jì)算機(jī)內(nèi)是如何完成的。

在Android中,每個(gè)Application(應(yīng)用)會(huì)在自己的Linux線程中開啟,當(dāng)系統(tǒng)需要回收內(nèi)存時(shí),最終會(huì)殺掉一個(gè)進(jìn)程。進(jìn)程的五個(gè)狀態(tài)包括:forground(前臺(tái))、visible(課件)、service(服務(wù))、background(后臺(tái))和empty(空)。所以簡(jiǎn)單來(lái)說(shuō),一個(gè)進(jìn)程包括指令集和內(nèi)存空間,而且是可被系統(tǒng)殺死的單元。

TASK

在書中“使用源自所涉問題領(lǐng)域的名稱”部分中,Martin寫到:

 如果不能用程序員熟悉的術(shù)語(yǔ)來(lái)給手頭的工作命名,就采用從所涉問題領(lǐng)域而來(lái)的名稱吧。至少,負(fù)責(zé)維護(hù)代碼的程序員就能去請(qǐng)教領(lǐng)域?qū)<伊?amp;hellip;…與所涉問題領(lǐng)域更為貼近的代碼,應(yīng)當(dāng)采用源自問題領(lǐng)域的名稱。

Android設(shè)備所解決的最基本的問題是什么?它們能幫助人們完成任務(wù)。這看起來(lái)異常簡(jiǎn)單,但想想過(guò)去在智能手機(jī)剛被發(fā)明的時(shí)候人們是如何憧憬的。誰(shuí)也不知道未來(lái)人們能用手機(jī)完成什么事情,但是開發(fā)者所開發(fā)的工具根本上都是為了幫助人們完成任務(wù)的,也就是task(任務(wù))。任務(wù)是以人為中心的術(shù)語(yǔ),它包含未知數(shù)目的步驟,但有一個(gè)核心的主題。在日常生活中有哪些任務(wù)實(shí)例呢?打掃房間、開車上班、逛超市,這些都是任務(wù)。人們?cè)谏钪锌赡芤瓿稍S多任務(wù),但在同一時(shí)刻只能進(jìn)行一項(xiàng)任務(wù)。人可以開始或停止做任務(wù),也可以在任務(wù)間切換。

Android中也是這樣。使用者在點(diǎn)擊應(yīng)用圖標(biāo)時(shí)開始一個(gè)task,可以在最近任務(wù)界面中看到最近的task,可以將task暫停或重新開始,甚至可以通過(guò)在最近任務(wù)界面中移除某task來(lái)完全銷毀掉這個(gè)task。最重要的是,使用者只能同時(shí)與一個(gè)task進(jìn)行交互。

ACTIVITY

就像task一樣,activity是問題領(lǐng)域中的術(shù)語(yǔ)。每個(gè)task包含了一個(gè)或多個(gè)activity。當(dāng)一個(gè)人在進(jìn)行任務(wù)時(shí),他需要完成許多活動(dòng)。比如打掃房間時(shí),一個(gè)人可能正在疊衣服,當(dāng)他疊完衣服時(shí),他要開始清理浴缸。在完成一件活動(dòng)前,他可以暫停并跳轉(zhuǎn)到當(dāng)前任務(wù)下的另一個(gè)活動(dòng)中。

當(dāng)一個(gè)人在任務(wù)間切換時(shí),他需要先暫停***個(gè)任務(wù)中的一個(gè)活動(dòng),然后開始第二個(gè)任務(wù)中的某個(gè)活動(dòng)。比如當(dāng)一個(gè)人從打掃房間轉(zhuǎn)到開車上班時(shí),他需要先停止疊衣服的活動(dòng),并開始走向他的車。

雖然人可以在多個(gè)活動(dòng)間切換,他同時(shí)只能進(jìn)行一個(gè)活動(dòng)。沒有人可以同時(shí)疊衣服和擦馬桶,如果有人嘗試那么畫面一定頗為娛樂。就算他在活動(dòng)之間來(lái)回跳,也要線性地進(jìn)行任務(wù)。

Android中Activity也類似,Activity是一個(gè)面向使用者的概念,它描述了使用者正在做的事情。一個(gè)Task包含了一個(gè)或多個(gè)Activity,但使用者只能同時(shí)與一個(gè)Activity交互,這個(gè)Activity通過(guò)占據(jù)整個(gè)屏幕來(lái)獲得使用者所有的注意力。使用者在進(jìn)行任務(wù)切換的同時(shí)會(huì)停止與啟動(dòng)Activity,每個(gè)Task都會(huì)記住用戶正在使用哪個(gè)Activity,這樣通過(guò)回退鍵回退時(shí)就會(huì)回到正確的Activity。

Activity的概念是基于使用者的,所以它負(fù)責(zé)向使用者展示數(shù)據(jù)并響應(yīng)輸入,也正因此,它不應(yīng)該進(jìn)行任何幕后操作,比如數(shù)據(jù)庫(kù)讀寫、網(wǎng)絡(luò)請(qǐng)求與大量計(jì)算。這些代碼模塊都應(yīng)該與Activity解耦,并離開用戶的視野。

只有當(dāng)對(duì)使用者產(chǎn)生直接影響的變化發(fā)生時(shí),計(jì)算機(jī)才會(huì)操作Activity生命周期,這些變化叫做配置信息改變,比如設(shè)備旋轉(zhuǎn)。

這也是為什么我們不應(yīng)該在設(shè)備旋轉(zhuǎn)時(shí)讓AsyncTask存貨。Robospice看起來(lái)幫助了想在Activity中啟動(dòng)AsyncTask的開發(fā)者。其實(shí),這個(gè)類庫(kù)本不應(yīng)這么做,因?yàn)锳ndroid中有更簡(jiǎn)潔的架構(gòu)模式來(lái)處理這些情況。

Fragment

Activity大到一定程度后就需要分割成更小的組件,現(xiàn)在暫時(shí)我們還沒有用于表示這個(gè)小組件的術(shù)語(yǔ)。這些Activity的部件是面向用戶的,所以我們不能去找解決方案領(lǐng)域的名稱。我們可能會(huì)想到“Sub Activity(子活動(dòng))”、“Component(組件)”、“Part(部分)”或是“Partial Activity(部分活動(dòng))”這些名稱,但是這些不免有誤導(dǎo)信息。Martin在“避免誤導(dǎo)”部分中講:

 程序員必須避免留下掩藏代碼本意的錯(cuò)誤線索。應(yīng)當(dāng)避免使用與本意相悖的詞。

“sub Activity(子活動(dòng))”可能會(huì)被誤解為Activity的子類?!盋omponent(組件)”和”Part(部分)”都太模糊?!癙artial Activity(部分活動(dòng))”隱含意是一個(gè)”部分活動(dòng)”是不夠的,我們需要多個(gè)這種組件來(lái)構(gòu)建一個(gè)Activity。說(shuō)實(shí)話,我猜當(dāng)內(nèi)部人員在設(shè)計(jì)框架時(shí),對(duì)于這個(gè)組件的命名的爭(zhēng)論最為激烈。開發(fā)者最終選擇“Fragment(碎片)”這個(gè)詞,我也想不出更好的詞了。

就像Activity一樣,F(xiàn)ragment的目的一樣是完成任務(wù),但是尺度則小了一些。比如“擦浴缸”與“打掃廚房”這兩件活動(dòng),都需要以“準(zhǔn)備清潔用具”這個(gè)碎片為開始。所以“準(zhǔn)備清潔用具”這個(gè)碎片是可以在多個(gè)活動(dòng)中使用的,而且不清楚整體的活動(dòng)到底是擦浴缸還是打掃廚房。但比如“給花澆水”這類很小的活動(dòng),它本身就不需要再分碎片。

有些碎片很小很小,它們可以同時(shí)進(jìn)行。比如“擦浴室瓷磚“和”擦浴室玻璃“是可以同時(shí)完成的,雖然它們是不同的碎片。

當(dāng)使用者停止了一個(gè)任務(wù)或是任務(wù)中的一個(gè)活動(dòng)時(shí),自動(dòng)就會(huì)停止一個(gè)碎片。一個(gè)人可以在多個(gè)碎片間切換,而不會(huì)停止活動(dòng)。例如,一個(gè)人可以停止“準(zhǔn)備清潔用具”并開始“往桶中灌水”,但他一直在進(jìn)行”拖地”這項(xiàng)活動(dòng)。

Android中的Fragment也是這個(gè)道理。一個(gè)Activity可以包含零個(gè)或多個(gè)Fragment,兩個(gè)Activity可以包含同一個(gè)Fragment的不同實(shí)例。如果一個(gè)Fragment足夠小,而且和另外的Fragment緊密相關(guān),它們可以同時(shí)被顯示,比如master/detail design pattern(主-從視圖)。

使用者可以以任何順序在Fragment間切換。開發(fā)者甚至可以讓用戶通過(guò)回退鍵在多個(gè)Fragment間回退。當(dāng)使用者停止或暫停一個(gè)Activity時(shí),Activity也會(huì)停止或暫停它的Fragment。

THREAD

Thread(線程),就像Process(進(jìn)程)一樣,也是解決方案領(lǐng)域的名稱。就像Process一樣,thread也只是一個(gè)計(jì)算機(jī)科學(xué)概念的基礎(chǔ)實(shí)現(xiàn)。Android沒有把事情搞得太復(fù)雜,直接使用了Java的thread。Android中的多數(shù)Thread都是Java Thread。Java Thread表現(xiàn)很好,Android只需要繼承Thread一次就能實(shí)現(xiàn)HandlerThread。

就像Process一樣,Thread是一個(gè)面向計(jì)算機(jī)的概念。使用Thread是為了同時(shí)完成多件事。就像計(jì)算機(jī)科學(xué)中線程的概念一樣,多個(gè)Thread實(shí)例可以存在于一個(gè)Process中。

使用者永遠(yuǎn)不關(guān)心每個(gè)線程上正在發(fā)生什么,或是到底有多少個(gè)線程在運(yùn)行。開發(fā)者使用Thread是為了告訴計(jì)算機(jī)干的再快一點(diǎn)。因?yàn)殚_發(fā)者是與計(jì)算機(jī)交談,需要像計(jì)算機(jī)一樣思考。所以涉及線程的問題一般都更難理解與debug,開發(fā)者需要考慮計(jì)算機(jī)的時(shí)間,而不是人類的時(shí)間,開發(fā)者需要思考有關(guān)內(nèi)存訪問的問題,以及要不要限制某些組件只能在規(guī)定時(shí)間訪問規(guī)定內(nèi)存空間。Thread之一,main thread又稱UI Thread,負(fù)責(zé)監(jiān)聽使用者輸入并與使用者交互。這個(gè)線程不應(yīng)該進(jìn)行任何后臺(tái)操作。所有的Activity都存活在這個(gè)線程中,并完成其所有工作。每個(gè)應(yīng)用開啟時(shí)都只有一個(gè)線程,至于是否需要多個(gè)線程則是開發(fā)者所要考慮的問題。HandlerThread是進(jìn)行后臺(tái)任務(wù)的一個(gè)很好的選項(xiàng)。

APPLICATION

就像Process和Thread一樣,Application(應(yīng)用)也是解決方案領(lǐng)域的名稱,也是一個(gè)基本的計(jì)算機(jī)科學(xué)概念。一個(gè)Application是一個(gè)幫助使用者完成(多個(gè))任務(wù)的軟件。但是,Application已經(jīng)成為使用者與開發(fā)者所共同熟知的概念,所以有時(shí)它會(huì)帶來(lái)一些面向使用者的問題。

銀行和超市是物理意義上的Application(應(yīng)用),它們被創(chuàng)建出來(lái)的目的就是幫助人們完成任務(wù)。超市的某些部分是直接與人交互的,但有些部分是在后臺(tái)幫助超市實(shí)現(xiàn)功能,比如倉(cāng)庫(kù)和會(huì)計(jì)室。

許多應(yīng)用可以組合成一個(gè)任務(wù)來(lái)幫助使用者完成更多的事情,即使這些應(yīng)用是不同的人寫的。如果使用者正在進(jìn)行烤蛋糕的任務(wù),那么他可以去超市來(lái)進(jìn)行“購(gòu)買原材料”的活動(dòng),然后回家繼續(xù)烤蛋糕。只要有人在與一個(gè)應(yīng)用交互,這個(gè)應(yīng)用實(shí)例就存在。

開啟一個(gè)應(yīng)用可以說(shuō)是開啟一項(xiàng)任務(wù)的一部分。比如我們要開始做打掃房間這項(xiàng)任務(wù),隱含意就是房間已經(jīng)存在。當(dāng)一個(gè)應(yīng)用不再被使用時(shí),它會(huì)被關(guān)閉掉。當(dāng)所有的人都完成了超市中要完成的任務(wù),超市就會(huì)關(guān)門。當(dāng)一個(gè)人完成了要在家做的所有任務(wù)時(shí),他就會(huì)把所有東西都關(guān)掉。

Android中的Application也是這個(gè)道理。啟動(dòng)一個(gè)Task,進(jìn)而啟動(dòng)一個(gè)Activity的一部分就是啟動(dòng)一個(gè)Application。一般來(lái)說(shuō),開發(fā)者只需要?jiǎng)?chuàng)建一個(gè)Application實(shí)例就可以服務(wù)所有的Activity,當(dāng)用戶完成了所有的Activity,Android可能就會(huì)銷毀Application。

在進(jìn)行一項(xiàng)任務(wù)時(shí),使用者可以轉(zhuǎn)換到另一個(gè)Application來(lái)幫助他完成附加的活動(dòng),比如通過(guò)相機(jī)應(yīng)用,使用者可以啟動(dòng)郵箱應(yīng)用來(lái)發(fā)送有圖片附件的郵箱。這兩個(gè)應(yīng)用是可以由不同的開發(fā)者開發(fā)的,但是都屬于一個(gè)任務(wù)。

如果使用者在郵箱應(yīng)用中強(qiáng)制停止當(dāng)前任務(wù),系統(tǒng)會(huì)停止郵箱應(yīng)用中的Activity。如果使用者只是暫停并繼續(xù)當(dāng)前任務(wù),系統(tǒng)會(huì)立即重新啟動(dòng)郵箱應(yīng)用中的Activity。

如果使用者直接啟動(dòng)郵箱應(yīng)用,系統(tǒng)會(huì)開啟一個(gè)新的任務(wù)。相機(jī)任務(wù)中屬于郵箱應(yīng)用的Activity不受新創(chuàng)建的郵箱任務(wù)影響。也就是說(shuō),同一個(gè)Activity的不同實(shí)例可以在不同的任務(wù)中生存。

即使使用者沒有與任何Activity進(jìn)行交互,一個(gè)Application還是可以存在,比如當(dāng)一個(gè)Application只在進(jìn)行后臺(tái)任務(wù),沒有Activity被展示,Application一樣可以生存。

CONTEXT

有一篇來(lái)自Dave Smith的博客很好地解釋了不同種類的Context(上下文)以及它們的功能。但什么是Context呢?很簡(jiǎn)單。Context就是Context(上下文)。

在我們的Android基礎(chǔ)系列課程中,我將Context比作一個(gè)深入操作系統(tǒng)的鉤子。因?yàn)锳ctivity需要系統(tǒng)來(lái)啟動(dòng),你需要使用Context來(lái)要求系統(tǒng)啟動(dòng)一個(gè)Activity)。因?yàn)橄到y(tǒng)可以填充布局,你需要通過(guò)Context來(lái)要求系統(tǒng)填充布局。因?yàn)橄到y(tǒng)可以發(fā)送廣播,你可以通過(guò)Context來(lái)發(fā)送廣播或是注冊(cè)BroadcastReceiver(廣播接收器)。因?yàn)橄到y(tǒng)提供系統(tǒng)服務(wù),你可以通過(guò)Context來(lái)訪問系統(tǒng)服務(wù)。

但是這些事情并不能隨處完成。比如在Service中,要求系統(tǒng)展示對(duì)話框或是啟動(dòng)Activity是毫無(wú)意義的。再比如在Application中,系統(tǒng)甚至都不知道當(dāng)前Activity的theme是什么,所以讓系統(tǒng)填充布局是毫無(wú)意義的。所以當(dāng)你要求系統(tǒng)來(lái)完成任務(wù)時(shí),你需要告訴系統(tǒng)你是在哪種Context(上下文)里想要做這些事情。當(dāng)系統(tǒng)認(rèn)定你想要做的事情對(duì)于當(dāng)前上下文是合理的。Context的名字就是這么來(lái)的。就像Task和Activity一樣,Context屬于問題領(lǐng)域的名稱。

Context有許多子類,但我們主要會(huì)用到Application、Activity和Service。這幾個(gè)組件都描述了不同的上下文,可以做不同的事情。Dave Smith的文章詳細(xì)講述了它們都能干什么。

Context是暫時(shí)的,隨著時(shí)間變化會(huì)發(fā)生改變。當(dāng)處理有關(guān)Context的問題時(shí),我總是告訴自己:這個(gè)Context可以用于操作這個(gè)類,可是不一定能操作其他類。內(nèi)存泄漏的一大來(lái)源就是到處傳遞Context并讓其他對(duì)象持有其引用。如果這里的Context是一個(gè)Activity,那么Activity在生命周期結(jié)束后也不會(huì)被回收,所以到處傳遞Context并不是一個(gè)好主意,我們不應(yīng)該這么做。

當(dāng)你的確需要傳遞Context對(duì)象時(shí),要確保這個(gè)Context對(duì)象適用范圍越大越好,一般來(lái)說(shuō)我們應(yīng)該傳遞一個(gè)Application Context。當(dāng)你傳遞Context時(shí),不要假設(shè)傳遞過(guò)來(lái)的人考慮過(guò)你的需求,也不要假設(shè)傳過(guò)來(lái)的就是正確的Context。

public void doSomething(Context context) {      // 不要假設(shè)傳過(guò)來(lái)的就是Application      mContext = context;        // 永遠(yuǎn)要手動(dòng)獲取Application Context      mContext = context.getApplicationContext();       ...  }

所以呢?

明白了這些名字是哪里來(lái)的又有什么用呢?我經(jīng)常看到學(xué)生的問題是如下格式:我怎么讓X完成Y?他們其實(shí)應(yīng)該先問問自己:X應(yīng)該完成Y嗎?為了回答這個(gè)問題,他們需要問:X的單一職責(zé)是什么?對(duì)于所有的Android框架中的組件,其職責(zé)就體現(xiàn)在命名中。這個(gè)名稱可以映射到問題領(lǐng)域或是解決方案領(lǐng)域的名臣很高。解決方案領(lǐng)域的名稱,如Process、Thread和Application,是開發(fā)者所理解與熟知的。問題領(lǐng)域的術(shù)語(yǔ)如task、activity、context和fragment則只當(dāng)我們?cè)诿枋霈F(xiàn)實(shí)生活中的問題時(shí)才可以被理解。

上述就是小編為大家分享的Android命名規(guī)范有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI