1. 程式人生 > >Android程式設計規範不完全指南

Android程式設計規範不完全指南

1. 命名規則

1.1 類名,介面名:

以大寫開頭,如果一個類的類名由多個單片語成,所有單詞的首字母必須大寫,單詞儘量寫全稱,不要簡寫,除非約定俗成的名字,例如:URL,RTMP,RTSP 這些廣泛使用的專有名詞,可以全部大寫,也可以首字母大寫。

例如:HttpRequestCourseActivity

1.2 區域性變數,類的成員變數,類的成員函式,函式引數:

以小寫字母開頭其他的單詞首字母大寫,變數名不建議使用下劃線分隔單詞,建議使用駝峰命名法,Android 的系統類都採用此方法。

例如:toString()onCreateView(Bundle saveInstanceState)

1.3 靜態常量:

常量單詞全部大寫,所以單詞之間使用下劃線分隔。

例如:WHAT_EMPTY_CONTENT

1.4 控制元件變數的命令,控制元件的ID命名:

建議:xml 佈局檔案中的控制元件的id的命令與*.java的程式碼檔案中的空間物件的命名保持一致。

class MyActivity extends Activity {
    TextView txtUserName;
    ...
    void onCreate(Bundle saveInstanceState) {
        txtUserName = (TextView) findViewById(R
.id.txtUserName); } }

1.5 常用控制元件以及類物件命名的規範說明:

類名 變數名 類名 變數名
TextView txtDescription ProgressBar progressDescription
Button btnDescription SeekBar seekBarDescription
ImageButton imgBtnDescription VideoView vvDescription
ImageView imgDescription Spinner spinDescription
RadioButton rbDescription WebView webViewDescription
EditText editDescription ListView listViewDescription
ScrollView scrollDescription GridView gridDescription
Handler descriptionHandler RatingBar ratingBarDescription
PullToRefreshListView pullRefreshViewDescription Adapter descriptionAdapter
Fragment descriptionFragment Activity descriptionActivity
List<T> descriptionList Map<> mapDescription
SlidingMenu slidMenuDescription ViewPager viewPagerDescription
CheckBox chBoxDescription View viewDescription
RadioGroup rgDescription ExpandableListView expDescription
FrameLayout frameLayDescription SharedPreferences spDescription
LinearLayout lineLayDescription RelativeLayout relativeLayDescription
startActivityForResult(requestCode) REQUEST_CODE_DESCRIPTION msg.what WHAT_DESCRIPTION

1.6 資源命名:

  1. layout資原始檔的命名(全部小寫,下劃線分隔):
    • activity資原始檔:activity_description1_description2.xml
    • fragment資原始檔:fragment_description1_description2.xml
    • listview列表項資原始檔:list_item_description1_description2.xml
    • 可複用(被include)的元件資原始檔:control_description1_description2.xml
    • drawable資源:controlName_description1_description2_selector.xml
      • controlName表示該資源要用在什麼型別的控制元件上,例如:如果是按鈕的圖片切換則應該命名為button_bg_sendmessage_selector.xml
      • selector表示該資源的形式,例如還有shape
  2. 圖片資源的命名:同上
  3. 顏色值的命名:color_descriptioncolor為字首,全部小寫,下劃線分割。
    description既可以是該顏色使用的功能描述,也可以是該顏色的英文描述,也可以是具體的顏色值,例如:
    <color name="color_white">#ffffff</color>
    <color name="color_grey_ccc">#cccccc</color>
    <color name="color_grey_ddd">#dddddd</color>
    因為grey可能有很多的等級,有時候需要不同等級的灰色,沒有那麼多英文名可以區分,所以名字中可以直接使用顏色值
    <color name="color_button_pressed">#4c4c4c</color>
    根據功能定義description,表示該顏色用於按鈕按下

注:不允許出現毫無意義的命名,例如 textview1, textview2

2. 關於字面常量

程式碼中不允許出現直接硬編碼的字面常量,如果是控制元件上顯示的文字,必須放在string.xml資原始檔中。如果是程式碼中用到的常量字串,必須定義成public static final String型別的常量值,在程式碼中使用該定義的常量值。

這樣做的好處是以後需要修改該常量值,只需要修改一個地方。如果是硬編碼在程式碼中則需要修改所有使用它的地方,而且拷貝容易出錯。

Activity之間傳遞引數的時候,intent.putExtrakey值也要符合命名規範,並且統一定義為靜態常量,不能直接硬編碼在程式碼中,否則想要修改的時候非常麻煩。某一個Activity在被啟動的時候需要接受引數,那麼這些引數的key定義就應該放在該Activity中。

3. JSON解析

Android中呼叫伺服器端的介面一般返回的是JSON資料,在解析JSON的時候,無論是使用原始的手工解析方式,還是使用javabean的解析方式,解析出來的結果在使用的時候必須都進行判空處理。不允許因為服務端的json出問題,導致app在解析json的時候出現崩潰。

4. 類成員初始化

所有類的成員變數一定要賦初始值,不允許只定義,不賦值。

5. Int型別常量

函式返回的時候,如果返回的int型別的資料並不是真實的實用的資料值(例如表示寬度、高度、大小等值),僅僅代表函式執行成功、失敗、異常的狀態值,並且這些值是有限的幾個值,必須要將這些值使用靜態常量描述,或者使用列舉型別,例如:

int GetJsonString()

該函式返回-1表示獲取解析JSON資料異常,返回0表示成功,返回1表示網路連線異常,返回2表示JSON內容中的資料部分為空。

那麼在函式內部的程式碼裡不要直接使用這些字面值,這些字面值對於程式設計師來說是毫無意義的,程式碼可閱讀性很差,建議做成下面的模式:

public static final int RESULT_PARSE_JSON_EXCEPTION = -1;
public static final int RESULT_SUCCESS = 0;
public static final int RESULT_NETWORK_EXCEPTION = 1;
public static final int RESULT_NO_DATA = 2;

使用這些符號常量值代替字面值的好處是,符號常量值是由大寫的英文單片語成,是有意義的,可以幫助程式設計師更好的理解函式返回值的意義,而且符號常量值對應的具體的賦值在後期也是很方便修改的。

6. Activity 接受引數與模組化

如果一個Activity可能在多個地方被開啟,或者一個Fragment可能在多個地方被用到。那麼在設計該ActivityFragment的時候一定要考慮低耦合,對外提供統一的引數介面,啟動Activity的過程封裝在該Activity類的靜態成員方法裡。

類似如下:

class MyActivity extends Activity {
    ...
    public static void startActivity(Context context, Params param) {
        Intent intent = new Intent(context, MyActivity.class);
        intent.putExtra("param", param);
        startActivity(intent);
    }

    public static void startActivityForResult(Context context, Params param) {
        Intent intent = new Intent(context, MyActivity.class)
        intent.putExtra("param", param);
        startActivityForResult(intent, REQUEST_CODE);
    }
}

引數的傳遞最好是封裝在一個Model實體中,避免使用Map這種方式進行引數傳遞。建議該實體類實現為對應的Activity的靜態可序列化的內部類。

7. Android Studio 工程目錄組織

Android Studio 中的專案的包結構應該根據工程各個部分的功能來組織。

8. Handler 的封裝

每個Activity裡面幾乎都會定義一個Handler內部類,但是很多Activity裡面的Handler都使用了重複的訊息型別,這裡面是有冗餘程式碼的,所以應該把這些Activity都是用到的Handler類的訊息部分,提取成一個公共的Handler類。

然後在各個Activity裡面使用繼承的方式,來提供該Activity特有的Handler訊息型別的Handler類實現。

另外Handler傳送訊息應該使用Handler類的成員函式,不應該直接使用handler.obtainMessage(xxx).sendToTarget();這種原始的傳送訊息的方式,這樣不利於降低耦合,這種細節應該隱藏在Handler類的裡面。

Handler的訊息型別應該定義為Handler類裡面的靜態常量,而該常量不應是public的,對外部不可見。也就是說使用handler物件傳送訊息的細節不應該暴露給外部。

9. List 資料更新

封裝ListView的資料更新,在handlerMessage中更新資料,避免出現java.lang.IllegalStateException問題

10. Activity 與 Fragment 之間傳遞引數

ActivityFragment的資料傳遞採用interface的方式,也就是代理的方式,這樣可以降低耦合,有利於Fragment的複用:
在你的fragment中定義一個介面:

public interface OnDataPass {
    public void onDataPass(String data);
}

然後,在你的fragmentonAttach(Activity a)方法中例項化一個OnDataPass

OnDataPass dataPasser;

@Override
public void onAttach(Activity a) {
    super.onAttach(a);
    dataPasser = (OnDataPass) a;
}

在你的fragment中,當你想處理傳遞的資料時,只需要呼叫dataPasseronDataPass方法即可:

public void passData(String data) {
    dataPasser.onDataPass(data);
}

最後,在你的容器activity中實現OnDataPass介面:

public class MyActivity extends Activity implements OnDataPass {
    ...
    @Override
    public void onDataPass(String data) {
        Log.d("LOG", "Hello " + data);
    }
}

11. 網路請求資料模組化

一般在Activity中我們通過網路請求服務端的介面獲得資料,這個過程一般是在一個執行緒中做的,獲取到資料之後,再通過Activity中的handler傳送訊息來通知Activity更新資料。

該負責獲取資料的執行緒類,我們一般都實現為一個Activity的內部類,該類可以直接訪問Activity的成員變數,例如handler,資料列表物件等。但是這樣不利於該資料獲取執行緒的複用。如果另一個Activity裡面也需要獲取相同的資料,那麼這個功能是不能複用的。

所以這個負責資料請求的執行緒類,不應該與具體的HandlerActivity聯絡過於緊密。應該定義為一個靜態類,handler應該作為引數傳遞進來,而不是直接訪問外部類的成員變數。

12. 封裝 Log 功能

Log功能應該封裝成為自動將當前所在類的類名變成log輸出的TAG引數,釋出的app最好是能迴圈寫日誌檔案到系統儲存中,並且日誌檔案應該使用反覆覆蓋的方式重複利用。

下面僅僅是一個不完善的例子:

public class MyLog {
    public static final String TAG = "myapp ";
    public static void v(Object o, String message) {
        Log.v(TAG + o.getClass().getSimpleName(), message);
    }
}

使用方法:

MyLog(this, "Hello Log");

列印結果

V/myapp MainActivity: Hello Log

13. 版本控制

使用自動化版本管理,自動生成版本號,使應用程式的版本與版本庫上保持一致。

使用hg替換工程目錄下的app目錄下的build.gradle檔案即可,如果

相關推薦

Android程式設計規範完全指南

1. 命名規則 1.1 類名,介面名: 以大寫開頭,如果一個類的類名由多個單片語成,所有單詞的首字母必須大寫,單詞儘量寫全稱,不要簡寫,除非約定俗成的名字,例如:URL,RTMP,RTSP 這些廣泛使用的專有名詞,可以全部大寫,也可以首字母大寫。 例如:HttpRe

Laravel(PHP)使用Swagger生成API文件完全指南 - 基本概念和環境搭建 - 簡書

在PHPer中,很多人聽說過Swagger,部分人知道Swagger是用來做API文件的,然而只有少數人真正知道怎麼正確使用Swagger,因為PHP界和Swagger相關的資料實在是太少了。所以鄙人斗膽一試,希望能以本文幫助到大家瞭解Swagger,從此告別成天用Word、Markdown折騰API文件的日

Laravel(PHP)使用Swagger生成API文檔完全指南 - 基本概念和環境搭建 - 簡書

function 閱讀 編程語言 文字 formdata 自動 tom dev 開始 在PHPer中,很多人聽說過Swagger,部分人知道Swagger是用來做API文檔的,然而只有少數人真正知道怎麽正確使用Swagger,因為PHP界和Swagger相關的資料實在是太少

Bullet物理引擎完全指南 Bullet Physics Engine not complete Guide

                前言    Bullet據稱為遊戲世界佔有率為第三的物理引擎,也是前幾大引擎目前唯一能夠找到的支援iPhone,開源,免費(Zlib協議,非常自由,且商業免費)的物理引擎,但是文件資料並不是很好,Demo雖然多,但是主要出於特性測試/展示的目的,會讓初學者無從看起,一頭霧水。我

高效使用Pycharm完全指南

定位 Search EverywhereCtrl+游標最近開啟的檔案目錄樹的“雷達”查詢補全 Tab萬能的Alt-EnterSurroud withEmmet編輯 BasicExtend Select

ctf工具完全指南

最近接連趕上了ssctf和hctf,對我來說算是一償夙願,總算從在網站上做做以前的題,到參加比賽,正式邁入圈內了。雖然學校內的氛圍不濃厚,但總算也能拉起一支能參賽的隊伍,第一次正式參賽的結果算是讓我挺滿意的。戰後是時候來個總結了。 經驗上的差距讓一些本來可以做的題目也

Chrome開發者工具完全指南(四、效能進階篇)

前言   Profiles面板功能的作用主要是監控網頁中各種方法執行時間和記憶體的變化,簡單來說它就是Timeline的數字化版本。它的功能選項卡不是很多(只有三個),操作起來比較前面的幾塊功能版本來說簡單,但是裡面的資料確很多,很雜,要弄懂它們需要花費一些時間。尤其是在記憶體快照中的各種龐雜的資料。在這篇

Chrome開發者工具完全指南(五、移動篇)

  前面介紹了Chrome開發者工具的大部分內容工具,現在介紹最後兩塊功能Audits和Console面板。一、Audits  Audits面板會針對目前網頁提出若干條優化的建議,這些建議分為兩大類,一類是網路載入效能,另一類是介面效能。首先開下它的主介面。  Audits面板的網路優化建議參照的是雅虎前端工

Chrome開發者工具完全指南(一、基礎功能篇)

  就算你不是一名前端開發工程師,相信你也不會對Chrome瀏覽器感到陌生。根據最新的一份(2015/06)的瀏覽器市場佔有率報告,Chrome近乎佔有瀏覽器天下的半壁江山。簡單、快捷使它成為了新時代人們的新寵。如果你是一名web開發人員,我推薦你使用Chrome。作為前端開發的"IDE",你只需要搭配一個編

Chrome開發者工具完全指南:(三、效能篇)

<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> div{ height: 20px; widows: 20p

Chrome開發者工具完全指南(二、進階篇)

function a () { b(); } function b() { c(); } function c() { //在該處斷點,檢視call stack } a->b->c. call stack 從上到下的順序就是 c

Chrome 控制檯完全指南

Chrome的開發者工具已經強大到沒朋友的地步了,特別是其功能豐富介面友好的console,使用得當可以有如下功效: 更高「逼格」更快「開發除錯」更強「進階級的Frontender」 Bug無處遁形「Console大法好」 console.log 大家都會用log,但鮮有人很好地利用console.err

Apache Kylin 部署之完全指南

1. 引言 Apache Kylin(麒麟)是由eBay開源的分散式分析引擎,提供Hadoop之上的SQL查詢介面及多維分析(OLAP)能力以支援超大規模資料。底層儲存用的是HBase,資料輸入與cube building用的是Hive,中間資料儲存用的是HDFS。搭建環境: Kylin version =

JNI完全指南

JNI不完全指南 1.概述 JNI做為對JVM的補充,可以完成一些遊離於JVM之外的程式碼,完成一些OS嚴重依賴的功能,比如你想自己實現基於IMCP的ping(如果問為什麼,那麼請重新學習一下IP/TCP/Socket)。 JNI包括Java程式碼和Native程式碼,所謂的

webpack優化完全指南

基礎篇 最基本的一個webpack配置 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extra

完全指南:程式設計師怎麼找海外工作

本文主要針對程式設計師群體,希望提供一些尋找海外工作機會的建議。 留學籤,工作籤還是技術移民? 想要合法地離開中國抵達海外長期生活,不外乎三種途徑: 留學簽證 工作簽證 技術移民 一一瞭解上面這些途徑的基本資訊,然後結合你自身情況,相信可以做出合適的後續規劃。至於做功課的難度,應該不會超

OpenResty 完全指南

作者 | 黃超    杏仁運維工程師,關注容器技術和自動化運維。OpenResty 簡介Open

前端效能優化完全指南

開發十年,就只剩下這套架構體系了! >>>   

重構完全指南

首發公眾號《andyqian》,期待你的關注!   前言   程式設計師在職業生涯中,不可避

前端勸退預警:JavaScript 工具鏈完全指南

![宇宙中最重的物質](https://user-gold-cdn.xitu.io/2020/3/11/170c7474bca121fb?w=958&h=576&f=png&s=232767) 經過這麼多年的發展,JavaScript 早已經不是當年那個不太起眼的指令碼語言。如今的 JavaScript 可