说起来,对于一个小白的我来说。并不了解什么架构设计。
接触到老大的项目,也不清楚什么是所谓的架构,就发现他写的项目含有BaseAction以及MyApplication.就慢慢的研究了下。。。。
作为所有项目Activity的基类BaseAction,里面含有一些公共的属性,方法,什么自定义Toast,实例化界面了,初始化行为调转下一个界面等等,感觉所有的方法都集成在这个类中,后期的开发过程中的Activity都由原来的继承Activty变成了现在继承我们所写的基类BaseAction。
说多了都是泪,语言组织能力不强,直接上代码。。。。。。
public abstract class BaseAction extends Activity{
public void onCreate(Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);//设置成无标题
onBeforeCreate(savedInstanceState);//定义一个方法,界面之前的操作
super.onCreate(savedInstanceState);
//这部分可以忽略,就是获取屏幕的宽高,用于后面的布局操作
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
ZRUtils.SCREEN_WIDTH = width;
ZRUtils.SCREEN_HEIGHT = height;
//根据配置文件 导入不同性质页面 xml、源码生成
onCreateContent(savedInstanceState);
//业务功能
installBusiness();
// 初始化 行为
installAction();
//xml 或 源码生成页面 分配行为
dispatchListener();
}
先看一下onCreateContent方法,这个根据诠释可以看出是根据配置文件,导入不同性质页面 xml、源码生成。说白了,就是根据你在AndroidMainfest.xml文件中,对于每个Activity的meta-data的获取,然后做出相对应的操作。
拿登陆来说,我们再配置文件中是这样描述的:
<activity
android:name="com.blueinfo.sysetc.LoginAction"
android:windowSoftInputMode="stateHidden|adjustResize"
android:screenOrientation="portrait" >
<meta-data android:name="uisource"
android:value="xml">
</meta-data>
</activity>
再看下我们的这个方法
//实例化界面
public void onCreateContent(Bundle savedInstanceState)
{
try
{
ActivityInfo info = getPackageManager().getActivityInfo(getComponentName(),
PackageManager.GET_META_DATA);
String metaData = info.metaData.getString("uisource");
if(metaData != null && metaData.equals("xml"))
{
installUiFromXML();
}
else if(metaData != null && metaData.equals("source"))
{
installUiFromSource();
}
}catch(Exception e)
{
e.printStackTrace();
}
}
首先获取Activityinfo对象,根据其metaData的名称,也就是这句话
meta-data android:name="uisource"
来获取Value值,然后根据Value值等于xml还是source来做出相对应的操作方法。看下当等于xml的时候。
private void installUiFromXML()
{
try
{
PackageManager pManager = this.getPackageManager();
PackageInfo info = pManager.getPackageInfo(this.getPackageName(), 0);
String pName = info.packageName;
Class<?> cs = Class.forName(pName + ".R$layout");
String XMLName = this.getClass().getName().toLowerCase();
XMLName = XMLName.substring(XMLName.lastIndexOf(".") + 1).replace("action", "");
Field field = cs.getDeclaredField(XMLName);
setContentView(field.getInt(null));
}catch(Exception e)
{
e.printStackTrace();
}
}
这个方法用到的知识点挺多,反射也应用到了,大家可以仔细看下这个方法,虽然复杂点,相信当大家看懂之后就明白,我们为什么要用这个方法了,什么所有的Activity都要在oncreate方法中去setContentView布局都去死吧,现在压根不需要了。
这个方法通俗的意思就是我们现在Activity类命命名一般都是xxxAction.class,那么如果我们继承这个基类调用这个方法后,如果我们的xml布局,变成xxx的小写,就不需要setContentView了。说到这有读者肯定会说,这不是给自己找麻烦嘛,脱了裤子放屁多此一举,我当时接触也是这么想的,可是当你想想别人看你的项目,只需要对比类命和xml名,就可以连接起来,代码感挺强,还简洁。
举个例子:登陆类
public class LoginAction extends BaseAction
那么我们直接在layout下找login就可以看布局了。
这个基类就连跳转到下一个界面方法都封装了。
//跳转到下一个Action
public void dropToNextAction(Class targetAction,Form params)
{
Intent dropIntent = new Intent();
if(params != null)
{
Bundle bundle = new Bundle();
bundle.putSerializable("params", params);
dropIntent.putExtras(bundle);
}
dropIntent.setClass(this, targetAction);
startActivity(dropIntent);
}
xxx1跳转到xxx2调用如下:
xxxx1.this.dropToNextAction(xxxx2.class, null);
其他就是什么实例化控件,或者自定义Toast方法等都可以封装在基类里面。
至于
//业务功能
installBusiness();
// 初始化 行为
installAction();
//xml 或 源码生成页面 分配行为
dispatchListener();
继承基类BaseAction重写这三个方法,可以在相对应的方法中实例化控件,以及控件的点击事件的操作。
总结下这种基类的使用好处:
1.代码编码风格可想而知,整洁简单。
2.减少一定的冗余,减少重复代码的复用。
3.对于后期的维护阅读有一定的的好处。
4.逼格提高。。。。。。
至于Application的自定义,就是存放全局变量而生的嘛。