架构学习BaseAction以及MyApplication

说起来,对于一个小白的我来说。并不了解什么架构设计。

接触到老大的项目,也不清楚什么是所谓的架构,就发现他写的项目含有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的自定义,就是存放全局变量而生的嘛。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值