`

【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;
	}
	
	@Override
	public 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";
    }
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(USERNAME_TABLE_CREATE);
		db.execSQL(INIVTE_MESSAGE_TABLE_CREATE);
		
	}

	@Override
	public 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应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    Android应用开发详解与代码(清晰版)

    《Android应用开发详解与代码(清晰版)》是一本针对初学者精心编写的指南,旨在帮助读者快速掌握Android应用开发的基础知识。这本书以其清晰的PDF格式,为学习者提供了优质的阅读体验,避免了模糊不清的图像或文字...

    Android应用开发详解.pdf

    根据提供的标题“Android应用开发详解.pdf”以及描述“Android应用开发详解.pdf”,我们可以推断这份文档主要涵盖了关于Android平台上的应用程序开发的相关知识和技术。虽然提供的部分内容似乎并不包含具体的信息,...

    Android Studio 阿里java代码规范化插件与开发手册、android开发手册

    在Android应用开发中,遵循一定的编码规范至关重要,它不仅可以提高代码的可读性和可维护性,还能提升团队协作效率。Android Studio作为Google官方推荐的Android集成开发环境,提供了丰富的工具来支持开发者的规范化...

    Android应用开发实战(第2版)》(李宁)新代码121126.zip

    《Android应用开发实战(第2版)》是李宁先生撰写的一本深入浅出的Android应用开发指南。这本书以实战为导向,旨在帮助读者快速掌握Android应用程序的开发技能,提升其在移动开发领域的专业素养。书中的"新代码121126...

    Android应用案例开发大全源代码

    在Android应用开发中,涉及的知识点广泛且深入,包括但不限于以下几方面: 1. **环境搭建**:首先,开发者需要安装并配置Android Studio,这是Google官方推荐的集成开发环境(IDE),集成了Gradle构建系统,用于...

    Android开发规范.zip

    这份文档应该详细介绍了Android应用开发中的最佳实践和标准流程,包括但不限于以下几个方面: - **编码规范**:包括命名规则(如类名、变量名应采用驼峰式命名)、注释规范、代码格式化等,以保持代码的整洁和...

    Android应用程序开发(第三版)课件源程序

    《Android应用程序开发(第三版)》是由王向辉、张国印、沈洁三位专家编著的教材,这本书深入浅出地介绍了Android平台上的应用开发技术。课件源程序是学习此书的重要辅助资料,提供了丰富的实例和练习,帮助读者更好...

    开发Android应用.rar

    在Android平台上进行应用开发是一项广泛且深入的技术领域,涉及到许多不同的知识点。首先,"开发Android应用.rar"这个压缩包很可能是包含了一套完整的Android应用程序开发教程或者资源集合,旨在帮助初学者和有经验...

    大话企业级android开发全集.pdf

    《大话企业级Android开发全集》是一本专为Android初学者设计的全面教程,旨在帮助读者快速掌握在企业环境中进行Android应用开发所需的核心技能。这本书深入浅出地讲解了Android开发的基础与进阶知识,结合实践案例,...

    Android应用程序开发源代码

    这份"Android应用程序开发源代码"的压缩包文件显然包含了完整的Android应用开发流程中的所有关键部分,对于初学者和有经验的开发者来说,都是一个宝贵的资源。 首先,让我们了解一下Android应用程序的基本结构。一...

    Android应用源码代码规范功能完善Wifi对讲机.rar

    Android应用源码代码规范功能完善Wifi对讲机是一个安卓对讲机应用的项目源码,代码规范注释清晰,功能完整界面简单。无论是做二次开发还是参考借鉴都是绝佳的项目源码。一个简单的按钮,按下就可以实时对讲,而且...

    android 应用开发教程

    以上只是Android应用开发的部分核心知识点,实际学习过程中还需要不断实践和探索,理解Android系统的运行机制,熟悉最新的开发趋势和技术,比如Android 12的新特性、Flutter跨平台开发等。通过不断的练习和项目经验...

    android应用开发框架

    在Android应用开发中,框架的选择和使用至关重要,它能够帮助开发者高效、规范地构建应用程序。本文将详细探讨“Android应用开发框架”的相关知识点,包括欢迎界面的实现、选项卡滑动、侧滑栏设计、HTTP请求处理以及...

    专业Android应用开发下载

    在Android应用开发领域,开发者需要掌握一系列技术和工具来创建高效、功能丰富的应用程序。"专业Android应用开发下载" 提供的教程可能涵盖了从基础到高级的全方位知识,旨在帮助初学者和有经验的开发者提升技能。 1...

    阿里Android开发手册.pdf

    手册涵盖了从基础编程到高级优化的多个方面,帮助开发者提升代码质量,提高开发效率,打造更加稳定、高性能的Android应用。 一、编程基础 1. 命名规范:手册详细规定了类名、方法名、变量名等的命名规则,强调使用...

    大话企业级Android应用开发实战[王家林][程序源代码]

    通过《大话企业级Android应用开发实战》中的实例和源代码,读者将能够逐步掌握上述知识点,并能将它们应用于实际的项目开发中,提升自己的专业技能。这本书对于有志于从事Android开发的工程师来说,无疑是一份宝贵的...

    Android开发编码规范.pdf文件下载

    整体而言,这些规范对Android应用开发中代码的编写、命名、格式化以及文件组织等方面提供了指导,目的是提升代码的可读性、一致性和可维护性。开发者在编写代码时遵循这些规范,能够更有效地协作和交流。同时,这份...

    《Android应用开发揭秘》源码

     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    Android开发框架与编码规范

    Android 开发中常用的编码规范包括代码缩进、注释、空格和括号等。 在 Android 开发中,选择合适的技术框架和编码规范是非常重要的。好的技术框架和编码规范可以提高应用程序的可维护性、可读性和可扩展性,提高...

Global site tag (gtag.js) - Google Analytics