Android 项目实践(五)——基础类和工具类的实现
2015-10-29 08:42
751 查看
Android项目开发一般都是由团队来完成,一个团队能够顺利搭配合作,完成一个优秀的项目,少不了良好的编码习惯。这里的编码习惯不单单是指命名规则等基础,还包括基础类BaseApplication,BaseFragment,BaseActivity的定义,工具包工具类的搭建等。
下面我们就讲一下命名规则,基础类,工具类的实现和搭建。
包名:全部字母小写。不允许包含下滑线。
类名和接口名:首字母大写, 多单词首字母大写。
变量名和方法名:首字母小写。多单词第一个单词首字母小写, 其余单词首字母大写。
常量名: 单词全部大写, 多单词中间用下划线隔开。
成员变量:一般为“mData”。小写”m”+字母单词首字母大写。
局部变量:首字母小写。多单词第一个单词首字母小写, 其余单词首字母大写。
在命名过程中,尽量不要出现字母拼写出错,使用缩写等情况,命名尽量完整,可以让别人在名称上获得更多信息。
BaseApplication中,我们一般做如下定义:
Point One:
定义BaseApplication的作用是:
在启动这个应用程序时,首先运行在AndroidManifest中注册的Application,也就是”name“的值代表的Application。在初始运行这个应用时我们需要先加载一些数据或其他,做一些初始化的操作,这时,我们就需要在BaseApplication中定义。(其实将应用的Application定义为BaseApplication这个名字也不太合适,可能定义为MyApplication更加合适点,这里我们暂且使用BaseApplication)。
Point Two:
在BaseApplication这个类中,我们定义了获得Application Context的一个方法,这里原因有二:
(1)内存优化。 Application和Android四大组件都持有一个Contex对象。网络连接,数据库,UI设计等很多地方都会用到Context对象,但是Context对象的持有会使得Activity,Service等一直存在于内存中,占消耗内存。所以在使用Context时,应该尽量使用Application的Context。当然,象Dialog等必须依赖于Activity的Context时,我们就不得不使用了。
(2)使用方便。有时候,我们经常会碰到在类中需要使用一个Context对象,但是这个类,又不是四大组件,不包含Context。这时,我们可能就想通过构造器传入一个Context对象,比较麻烦。我们可以直接定义一个静态的方法获取Application的 Context,这样减少了Activity的Context的持有,还优化了内存。
这里简单的列举几个工具类:
Uri工具:
Toast工具:
下面我们就讲一下命名规则,基础类,工具类的实现和搭建。
命名规则
在Java《Java的命名规范 》博客中我们也讲过命名规则了,Android使用Java编写,命名规则当然是相同的:包名:全部字母小写。不允许包含下滑线。
类名和接口名:首字母大写, 多单词首字母大写。
变量名和方法名:首字母小写。多单词第一个单词首字母小写, 其余单词首字母大写。
常量名: 单词全部大写, 多单词中间用下划线隔开。
成员变量:一般为“mData”。小写”m”+字母单词首字母大写。
局部变量:首字母小写。多单词第一个单词首字母小写, 其余单词首字母大写。
在命名过程中,尽量不要出现字母拼写出错,使用缩写等情况,命名尽量完整,可以让别人在名称上获得更多信息。
基础类
BaseApplication
一般情况下在开发的过程中,我们会定义一个BaseApplication继承Application,然后在AndroidManifest中进行如下更改:<application android:name=".BaseApplication"<!--【此处注释不正确】 将"name"值更改为自定义的"BaseApplication"类。--> android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> </application>
BaseApplication中,我们一般做如下定义:
public class BaseApplication extends Application { private static String mLock = "LOCK"; private static BaseApplication mApplication; private BaseApplication() { } public static BaseApplication newInstance(){ if(mApplication!==null){ synchronized(mLock ){ if(mApplication!==null){ mApplication = new BaseApplication(); } } } return mApplication; } /** * 获取Context * @return 返回Context的对象 */ public static Context getContext(){ return mApplication.getApplicationContext(); } @Override public void onCreate() { super.onCreate(); this.mApplication = this; /* *做一些初始化的处理:初始化数据库,化图片缓存,初始化地图等 */ } }
Point One:
定义BaseApplication的作用是:
在启动这个应用程序时,首先运行在AndroidManifest中注册的Application,也就是”name“的值代表的Application。在初始运行这个应用时我们需要先加载一些数据或其他,做一些初始化的操作,这时,我们就需要在BaseApplication中定义。(其实将应用的Application定义为BaseApplication这个名字也不太合适,可能定义为MyApplication更加合适点,这里我们暂且使用BaseApplication)。
Point Two:
在BaseApplication这个类中,我们定义了获得Application Context的一个方法,这里原因有二:
(1)内存优化。 Application和Android四大组件都持有一个Contex对象。网络连接,数据库,UI设计等很多地方都会用到Context对象,但是Context对象的持有会使得Activity,Service等一直存在于内存中,占消耗内存。所以在使用Context时,应该尽量使用Application的Context。当然,象Dialog等必须依赖于Activity的Context时,我们就不得不使用了。
(2)使用方便。有时候,我们经常会碰到在类中需要使用一个Context对象,但是这个类,又不是四大组件,不包含Context。这时,我们可能就想通过构造器传入一个Context对象,比较麻烦。我们可以直接定义一个静态的方法获取Application的 Context,这样减少了Activity的Context的持有,还优化了内存。
BaseActivity
BaseActivity的使用与BaseApplication的使用时如出一辙的。之前我们在《如何知晓当前界面是哪个活Activity? 》这篇博客中就使用到了BaseActivity。在实际开发中的使用也是很相似的。BaseActivity主要也是做一些数据的存储,初始化等。这里不再列举代码。然后在使用Activity时,继承BaseActivity。BaseFragment
BaseFragment也是,BaseFragment继承Fragment,然后在使用Fragment时,继承BaseFragment。工具类
在我们开发的过程中,难免要使用一些工具,例如:网络状态获取,dp转px尺寸转换,获取Uri路径,压缩图片等工具。我们一般会将这些工具分别封装为类,然后放在一个”utils”的package中。这样我们在使用这使用工具时可直接调用使用,不必在在自己的类中反复的定义,即简化了代码,还提高了效率。这里简单的列举几个工具类:
Uri工具:
public class UriUtils { /** * 获取Uri的真实地址 * @param uri 要进行转化的Uri对象 * @return Uri指向的文件File对象。 */ public static File getFilePath(BaseActivity activity,Uri uri) { String[] proj = {MediaStore.Images.Media.DATA}; Cursor actualimagecursor = activity.managedQuery(uri, proj, null, null, null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actualimagecursor.moveToFirst(); String img_path = actualimagecursor.getString(actual_image_column_index); return new File(img_path); } }
Toast工具:
public class ToastUtils { /** * 弹出Toast方法 * @param content Toast展示的内容。 */ public static void showToast(String content){ Toast.makeText(BaseApplication.getContext(), content, Toast.LENGTH_SHORT).show(); } }
相关文章推荐
- Android系统应用信息中存储和缓存的计算方法
- AndroidManifest配置文件介绍
- Android 开发之 ---- 底层驱动开发(二)
- Android 开发之 ---- 底层驱动开发(一)
- Android 中关于 【Cursor】 类的介绍
- Android Api Demos登顶之路(111)Views-->Seacure View
- Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法
- Android笔记(四十四) Android中的数据存储——SQLite(六)整合
- Android学习之保存 Activity 的状态
- android 群英传读书笔记---listview使用技巧(一)
- Android Studio安装完后,遇到了sdk manager无法更新问题
- Android Activity启动模式分析
- MSF android apk动态分析
- IT蓝豹强烈推荐:符合1-2年工作经验,开发中的难点及相关优化:
- Fragment的简单用法
- 记录Android 资源镜像
- Android开发高薪之路 蜂窝教育与您同行
- Android设置字体
- Android的Bitmap与Drawable
- 给 Android 开发者的 RxJava 详解(转载)