Android編程規範不完全指南

來源:互聯網
上載者:User

標籤:

命名規則

1). 類名,介面名:

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

例如 HttpRequest,CourseActivity

2). 局部變數,類的成員變數,類的成員函數,函數參數:

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

例如 toString()  onCreateView(Bundle savedInstanceState)

3). 靜態常量:全部大寫,單詞之間使用底線分開,常量單詞全部大寫,所以單詞之間使用底線分隔。

例如 WHAT_EMPTY_CONTENT

4). 控制項變數的命名,控制項的ID命名:

建議:xml布局檔案中的控制項的id的命名與*.java的代碼檔案中的控制項對象的命名一致。

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

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

6). 資源命名:

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等
圖片資源的名字:同上
顏色值的命名:  color_description  以color為首碼,全部小寫,底線分隔。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

關於字面常量

代碼中不允許出現直接硬式編碼字面常量,如果是控制項上面顯示的文本,必須放在strings.xml資源檔中。 如果是代碼中用到常量字串,必須定義成 public static final String類型的常量值,在代碼中使用該定義的常量值。這樣做的好處是以後需要修改該常量值,只需要修改一個地方。如果是寫入程式碼在代碼中則要修改所有使用它的地方,而且拷貝容易出錯。在Activity之間傳遞參數的時候,intent.putExtra 的key值也要命名規範,並且統一定義為靜態常量,不能直接寫入程式碼在代碼中,否則想要修改的時候很麻煩。某一個Activity在被啟動的時候需要接受參數,那麼這些參數的key定義就應該放在該Activity中。

JSON解析

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

類成員初始化

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

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;

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

Activity接受參數與模組化

如果一個Activity可能在多個地方被開啟,或者一個Fragment可能在多個地方被用到。那麼在設計該Activity和Fragment的時候一定要考慮低耦合,對外提供統一的參數介面,啟動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的靜態可序列化的內部類。

AndroidStudio工程目錄組織

AndroidStudio中的項目的包結構應該根據工程各個部分的功能來組織。

Handler的封裝

每一個Activity裡面幾乎都會定義一個Handler內部類,但是很多Activity裡面的Handler都使用了重複的訊息類型,這裡面是有冗餘代碼的,所以應該把這些Activity都使用到的Handler類的訊息部分,提取成一個公用的Handler類。然後在各個Activity裡面使用繼承的方式,來提供該Activity特有的Handler訊息類型的Handler類實現。

另外Handler發送訊息應該使用Handler類的成員函數,不應該直接使用handler.obtainMessage(xxx).sendToTarget();這種原始的發送訊息的方式,這樣不利於降低耦合,這種細節應該隱藏在Handler內的裡面。Handler的訊息類型應該定義為Handler類裡面的靜態常量,而該常量不應是public的,對外部不可見。也就是說使用handler對象發送訊息的細節不應該暴露給外部。

List的資料更新

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

Activity與Fragment之間傳遞參數

Activity與Fragment的資料傳遞採用interface的方式,這樣可以降低耦合,有利於Fragment的複用:

網路請求資料模組化

一般在Activity中我們通過網路請求服務端的介面獲得資料,這個過程一般是在一個線程中做的,擷取到資料之後,再通過Activity中的handler發送訊息來通知Activity更新資料。該負責擷取資料的線程類,我們一般都實現為一個Activity的內部類,該類可以直接存取Activity的成員變數,例如handler,資料列表對象等。但是這樣不利於該資料擷取線程的複用。如果另一個Activity裡面也需要擷取相同的資料,那麼這個功能是不能複用的,所以這個負責資料請求的線程類,不應該與具體的Handler和Activity聯絡過於緊密。應該定義為一個靜態類,handler應該作為參數傳遞進來,而不是直接存取外部類的成員變數。

封裝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.v(this,"hello log");

列印結果

V/myapp MainActivity﹕ hello log
版本控制

使用自動化版本管理,自動產生版本號碼,使應用程式的版本與版本庫上保持一致。使用hg替換工程目錄下的app目錄下的build.gradle檔案即可,如果manifest裡面也有版本號碼的設定,AndroidStudio還是以build.gradle為準。不應該在每次發布的時候,在AndroidStudio的工程設定裡面手工修改版本號碼。

為程式添加全域異常捕獲

應該為app添加全域異常捕獲,app中總會有一些我們未捕獲的異常,一旦使用者使用過程中遇到這樣的異常,程式就會崩潰,我們應該檢測該類未捕獲的異常資訊,程式崩潰的時候通過寫檔案日誌,或者發送郵件的方式獲得異常資訊,以便解決bug。

Android編程規範不完全指南

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.