Android 项目实践(五)——基础类和工具类的实现
Android项目开发一般都是由团队来完成,一个团队能够顺利搭配合作,完成一个优秀的项目,少不了良好的编码习惯。这里的编码习惯不单单是指命名规则等基础,还包括基础类BaseApplication,BaseFragment,BaseActivity的定义,工具包工具类的搭建等。
下面我们就讲一下命名规则,基础类,工具类的实现和搭建。
命名规则
在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();
}
}
还没有评论,来说两句吧...