日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 应用开发】 Android 相关代码规范 更新中 ...

發布時間:2025/6/17 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 应用开发】 Android 相关代码规范 更新中 ... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.


簡介 : Android 常用的代碼結構, 包括包的規范, 測試用例規范, 數據庫模塊常用編寫規范;


參考?: 之前寫的一篇博客??【Android 應用開發】 Application 使用分析?;

--?Application 分析?: Application 概念, 聲明周期, 組件間傳遞數據作用, 數據緩存作用;

--?源碼分析?: 分析 Application 結構接口源碼;

--?使用示例?: 自定義 Application 注冊, 保存崩潰日志到文件, 監聽Activity聲明周期;





一. 包結構規范



1. 基本包, 業務包, 測試包


包基礎結構 :?

-- base 包 : 應用中常用的公共包 和 類放在該包中, 例如 工具類, SQLiteOpenHelper, 配置類, Application, 各種類的基類 等;

-- business 包 : 應用中的實際業務包, 這個包存放 與 app 業務相關的具體實現的類 和 包;

-- test 包 : 用于存放單元測試 和 測試用例相關的包;


示例 :?




2. 根據類型將 Java 類 分入不同包中


UI 相關 :?

-- activity : 存放 Activity 相關的包;

-- fragment : 存放 Fragment 相關類;

-- widget : 存放自定義組件相關類;


適配器相關 :?

-- adapter : 各種適配器, 尤其是 BaseAdapter 子類;


Java Bean相關 : 下面的兩種包名經常存放 JavaBean 對象;

-- bean :?

-- domain :?


工具類相關 :?

-- utils : 存放工具類;


監聽器相關 :?

-- listener : 存放各種監聽器, 如按鈕點擊監聽器等等;


數據庫相關 :?

-- sqlite : 存放數據庫相關的包;


業務相關 :?

-- engine : 存放業務邏輯相關類;




二. Application 代碼規范



1. Application 單例規范


單例屬性 : Application 本身就是單例模式, 在整個應用中, 只存在一個 Application 對象;


實現 Application 單例 :?

-- 定義 Application 類型對象 : 在 自定義的 Application 中定義一個 Application 類型的函數;

private static QIApplication INSTANCE;-- 定義共有構造方法 :?

/*** 構造方法構造 Application*/public QIApplication() {INSTANCE = this;}-- 公共, 靜態方法獲取對象 : 在任何類中, 都可以調用該方法, 獲取 Application 上下文對象;

/*** 獲取 Application 使用該函數可以在任意位置獲取 Application 中的數據* @return*/public static QIApplication getInstance() {return INSTANCE;}


2. Application 用于組件間數據傳遞 和 數據緩存?


在???【Android 應用開發】 Application 使用分析? 博客中有這方面的講解;

Application 組件間數據傳遞 , Application 數據緩存;



3. Application 常用框架


代碼示例 :?

public class MyApplication extends Application {private static MyApplication INSTANCE;/** 用于數據傳遞的 Map 集合 */private Map<String, Object> transferMap;/** 用于緩存數據的 Map 集合 */private Map<String, Object> cacheMap; /*** 構造方法構造 Application*/private MyApplication() {INSTANCE = this;}/*** 獲取 Application 使用該函數可以在任意位置獲取 Application 中的數據* @return*/public static MyApplication getInstance() {return INSTANCE;}@Overridepublic void onCreate() { super.onCreate();// 初始化用于數據傳遞的 Map 集合transferMap = new HashMap<String, Object>();// 初始化用于數據緩存的 Map 集合cacheMap = new HashMap<String, Object>();}/*** 獲取數據傳遞 Map 集合* @return* 數據傳遞 Map 集合*/public Map<String, Object> getTransferMap() {return transferMap;}/*** 向 transferMap 集合中添加數據元素*/public void putTransferMapElement(String key, Object object) {transferMap.put(key, object);}public Object getTransferMapElement(String key) {return transferMap.get(key);}/*** 向 transferMap 數據中移除對應的數據元素*/public void removeTransferMapElement(String key) {transferMap.remove(key);}/*** 獲取數據緩存 Map 集合* @return* 數據緩存 Map 集合*/public Map<String, Object> getCacheMap() {return cacheMap;}}




三. 數據庫模塊代碼常用結構



1.?SQLiteOpenHelper 類



(1) 命令 版本號?


類命名 : 一般命令為 XXOpenHelper, 例如 DBOpenHelper;

版本號 : 在類中定義一個常量, 用于保存版本號;

private static final int DATABASE_VERSION = 1;

(2) 單例模式?


單例 : SQLiteOpenHelper 類, 在應用中只保存一個對象即可;

-- 私有, 靜態化本類成員變量 : 例如該類類名為 DBOpenHelper, 那么定義一個 DBOpenHelper 的成員變量, 注意將改變量設置成靜態變量;

private static DbOpenHelper instance;-- 私有化構造函數 : ?將構造函數設置為私有函數;

private DbOpenHelper(Context context) {super(context, getUserDatabaseName(), null, DATABASE_VERSION);}

-- 共有, 靜態 方法獲取成員變量 : 使用懶漢模式, 如果 本類類型成員變量 為null, 就調用私有的靜態構造方法, 如果不為null, 就直接返回 本類類型靜態變量;

public static DbOpenHelper getInstance(Context context) {if (instance == null) {instance = new DbOpenHelper(context.getApplicationContext());}return instance;}

(3) SQL 語句字段名維護


字段名使用 :?

-- SQLiteOpenHelper 中的字段 : 建立數據庫需要字段名稱;

-- JavaBean 中的字段 : 在代碼中經常用到字段名稱, 一般規律是 在JavaBean 中的變量名 與 數據庫中字段名相同, 字段名在 JavaBean 中需要使用, 用于從 Cursor 中獲取對象;

-- Dao 中的字段 : 在插入數據時, 也許要字段名稱;


維護字段名稱常量 : 個人認為字段名稱常量維護在 JavaBean 中最好, 這樣就可以將所有的字段名都限制在 JavaBean 類中, 其它位置不用關心字段名稱;



(4) SQLiteOpenHelper 代碼示例?


/*** Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* http://www.apache.org/licenses/LICENSE-2.0* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.easemob.chatuidemo.db;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;import com.easemob.applib.controller.HXSDKHelper;public class DbOpenHelper extends SQLiteOpenHelper{private static final int DATABASE_VERSION = 1;private static DbOpenHelper instance;private static final String USERNAME_TABLE_CREATE = "CREATE TABLE "+ UserDao.TABLE_NAME + " ("+ UserDao.COLUMN_NAME_NICK +" TEXT, "+ UserDao.COLUMN_NAME_ID + " TEXT PRIMARY KEY);";private static final String INIVTE_MESSAGE_TABLE_CREATE = "CREATE TABLE "+ InviteMessgeDao.TABLE_NAME + " ("+ InviteMessgeDao.COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ InviteMessgeDao.COLUMN_NAME_FROM + " TEXT, "+ InviteMessgeDao.COLUMN_NAME_GROUP_ID + " TEXT, "+ InviteMessgeDao.COLUMN_NAME_GROUP_Name + " TEXT, "+ InviteMessgeDao.COLUMN_NAME_REASON + " TEXT, "+ InviteMessgeDao.COLUMN_NAME_STATUS + " INTEGER, "+ InviteMessgeDao.COLUMN_NAME_ISINVITEFROMME + " INTEGER, "+ InviteMessgeDao.COLUMN_NAME_TIME + " TEXT); ";private DbOpenHelper(Context context) {super(context, getUserDatabaseName(), null, DATABASE_VERSION);}public static DbOpenHelper getInstance(Context context) {if (instance == null) {instance = new DbOpenHelper(context.getApplicationContext());}return instance;}private static String getUserDatabaseName() {return HXSDKHelper.getInstance().getHXId() + "_demo.db";}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(USERNAME_TABLE_CREATE);db.execSQL(INIVTE_MESSAGE_TABLE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}public void closeDB() {if (instance != null) {try {SQLiteDatabase db = instance.getWritableDatabase();db.close();} catch (Exception e) {e.printStackTrace();}instance = null;}}}


2. Dao 類規范


該類作用 : 將對數據庫增刪查改的操作都放在該類中;



(1) 維護 SQLiteOpenHelper 變量


維護變量 : 在 Dao 類中, 維護該變量, 方法中使用 OpenHelper 快速獲取數據庫;



(2) 在方法中實時獲取 SQLiteDatabase 變量


獲取數據庫對象 : 如果對數據庫進行操作時, 需要在方法中根據需求獲取?dbHelper.getWritableDatabase() 或者?dbHelper.getReadableDatabase() 數據庫對象;



(3) Dao 代碼示例


/*** Copyright (C) 2013-2014 EaseMob Technologies. All rights reserved.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* http://www.apache.org/licenses/LICENSE-2.0* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.easemob.chatuidemo.db;import java.util.HashMap; import java.util.List; import java.util.Map;import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.text.TextUtils;import com.easemob.chatuidemo.Constant; import com.easemob.chatuidemo.domain.User; import com.easemob.util.HanziToPinyin;public class UserDao {public static final String TABLE_NAME = "uers";public static final String COLUMN_NAME_ID = "username";public static final String COLUMN_NAME_NICK = "nick";public static final String COLUMN_NAME_IS_STRANGER = "is_stranger";private DbOpenHelper dbHelper;public UserDao(Context context) {dbHelper = DbOpenHelper.getInstance(context);}/*** 保存好友list* * @param contactList*/public void saveContactList(List<User> contactList) {SQLiteDatabase db = dbHelper.getWritableDatabase();if (db.isOpen()) {db.delete(TABLE_NAME, null, null);for (User user : contactList) {ContentValues values = new ContentValues();values.put(COLUMN_NAME_ID, user.getUsername());if(user.getNick() != null)values.put(COLUMN_NAME_NICK, user.getNick());db.replace(TABLE_NAME, null, values);}}}/*** 獲取好友list* * @return*/public Map<String, User> getContactList() {SQLiteDatabase db = dbHelper.getReadableDatabase();Map<String, User> users = new HashMap<String, User>();if (db.isOpen()) {Cursor cursor = db.rawQuery("select * from " + TABLE_NAME /* + " desc" */, null);while (cursor.moveToNext()) {String username = cursor.getString(cursor.getColumnIndex(COLUMN_NAME_ID));String nick = cursor.getString(cursor.getColumnIndex(COLUMN_NAME_NICK));User user = new User();user.setUsername(username);user.setNick(nick);String headerName = null;if (!TextUtils.isEmpty(user.getNick())) {headerName = user.getNick();} else {headerName = user.getUsername();}if (username.equals(Constant.NEW_FRIENDS_USERNAME) || username.equals(Constant.GROUP_USERNAME)) {user.setHeader("");} else if (Character.isDigit(headerName.charAt(0))) {user.setHeader("#");} else {user.setHeader(HanziToPinyin.getInstance().get(headerName.substring(0, 1)).get(0).target.substring(0, 1).toUpperCase());char header = user.getHeader().toLowerCase().charAt(0);if (header < 'a' || header > 'z') {user.setHeader("#");}}users.put(username, user);}cursor.close();}return users;}/*** 刪除一個聯系人* @param username*/public void deleteContact(String username){SQLiteDatabase db = dbHelper.getWritableDatabase();if(db.isOpen()){db.delete(TABLE_NAME, COLUMN_NAME_ID + " = ?", new String[]{username});}}/*** 保存一個聯系人* @param user*/public void saveContact(User user){SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put(COLUMN_NAME_ID, user.getUsername());if(user.getNick() != null)values.put(COLUMN_NAME_NICK, user.getNick());if(db.isOpen()){db.replace(TABLE_NAME, null, values);}} }



.

總結

以上是生活随笔為你收集整理的【Android 应用开发】 Android 相关代码规范 更新中 ...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天干狠狠干 | 亚洲福利影视 | 男人的天堂毛片 | 久久久女人 | 国产主播福利在线 | 青青久久av北条麻妃黑人 | 美女黄色一级 | 影音先锋亚洲资源 | 精品一区二区三区视频在线观看 | 亚洲欧洲日韩av | 26uuu国产精品视频 | 成人免费视频久久 | 中国一级免费毛片 | 男女靠逼视频 | 亚洲丝袜一区 | 99国产超薄肉色丝袜交足 | 一级性视频 | 加勒比hezyo黑人专区 | 亚洲高清不卡 | 欧美日本国产在线 | 特级西西人体4444xxxx | 成人天堂噜噜噜 | av第一页 | 日韩网 | 欧美亚洲日本在线 | 国产亚洲成av人在线观看导航 | 狠狠澡 | 国产精品久久久精品三级 | 免费观看一区二区三区毛片 | 国产精品黄色网 | 日日摸日日添日日躁av | 午夜亚洲国产 | 亚洲国产看片 | 欧美日韩精品一二三区 | 青青在线视频 | 国产精品一二三四 | 国产精品二区一区二区aⅴ污介绍 | 国产一级一片免费播放 | 日本美女一级视频 | 国产在线1区 | 综合激情婷婷 | www.四虎com| 麻豆精品一区二区三区 | 午夜视频91| 蜜桃99视频一区二区三区 | 亚洲五月婷婷 | 久久久国产打桩机 | 午夜成人影片 | www久久久天天com | 亚洲超碰在线观看 | 色天使在线视频 | 一级免费a| 国产精品人成 | 99国产精品国产免费观看 | 亚洲天码中字 | 久久夜色精品 | 日韩a级片 | 三级在线观看网站 | 人人人插 | 午夜男人的天堂 | 国产欧美一区二区三区国产幕精品 | 野花视频免费在线观看 | 一区二区日韩在线观看 | 午夜精品久久久久久久96蜜桃 | 欧美性受xxxxxx黑人xyx性爽 | 伊人激情影院 | 精品福利影院 | 情欲少妇人妻100篇 黄色一级片欧美 | 日韩欧美成人一区二区 | 操丰满女人 | 日韩精品一区二区在线观看 | 人人干在线 | 成年人在线免费观看 | 亚洲天堂av一区二区三区 | 成人一级在线 | 男人添女人下部高潮全视频 | 大陆av在线播放 | 免费中文字幕日韩 | 日本一区二区视频免费 | 久久精品毛片 | 亚洲欧美福利 | 国产露出视频 | 91av在线播放 | 美女黄免费| 狠狠干女人| 免费观看av网址 | a级片免费在线观看 | 最新三级网站 | 91最新地址永久入口 | 男人的天堂av女优 | 殴美性生活 | 人妻天天爽夜夜爽一区二区三区 | 97在线观看免费 | 福利在线视频导航 | 18禁裸男晨勃露j毛免费观看 | 国产一区二区三区高清视频 | 婷婷资源网 | 成人福利一区 | 亚洲AV无码成人精品国产一区 |