从头开始敲代码之《从BaseApplication/Activity开始》

转载请注明出处王亟亟的大牛之路

其安易持,其未兆易谋;其脆易泮,其微易散。为之于未有,治之于未乱。合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。为者败之,执者失之。是以圣人无为故无败,无执故无失。民之从事,常于几成而败之。慎终如始,则无败事。是以圣人欲不欲,不贵难得之货,学不学,复众人之所过,以辅万物之自然而不敢为。

作为系列专题的第一篇,这一篇文章属于小难产,中间夹杂着一些工作上的事,一些蛋疼的事(学车之类的),说实在的,做了Coder之后发现业余时间还真不是太多。。。。唉。。。整个专栏的前 5 6篇将会比较简单,便于过度。

包目录:

好,废话不多进入正题

这篇文章干什么呢?

对我们平时用的最多相当较为常用的Activity进行简单的封装,以满足基础的需求

封装是什么?封装的好处是什么?

1.将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体.

2.增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员.

这一篇来自定义我们自己的 BaseApplication 以及 BaseActivity

为什么要那么做?

白话版:把什么初始化,稀里哗啦一大堆的Toast Dialog的工具全部丢进去,让后续的Activity的业务更清晰。

每一次的例子都是自己花心思写的,质量好坏客观见谅

BaseActivity

public class BaseApplication extends Application{
    /*
    * 初始化TAG
    * */
    private  static String TAG=BaseApplication.class.getName();

    /*Activity堆*/
    private Stack<Activity> activityStack = new Stack<Activity>();

    @Override
    public void onCreate() {
        super.onCreate();
        LogUtils.d(TAG,TAG+"---onCreate()");
        printAppParameter();
    }

    /*打印出一些app的参数*/
    private void printAppParameter(){
        LogUtils.d(TAG, "OS : "+Build.VERSION.RELEASE + " ( " + Build.VERSION.SDK_INT + " )");
        DeviceMgr.ScrSize realSize = DeviceMgr.getScreenRealSize(this);
        LogUtils.d(TAG, "Screen Size: " + realSize.w + " X " + realSize.h);

    }

    public void addActivity(final Activity curAT) {
        if (null == activityStack) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(curAT);
    }

    public void removeActivity(final Activity curAT) {
        if (null == activityStack) {
            activityStack = new Stack<Activity>();
        }
        activityStack.remove(curAT);
    }

    //获取最后一个Activity
    public Activity currentActivity() {
        Activity activity = activityStack.lastElement();
        return activity;
    }

    //返回寨内Activity的总数
    public int howManyActivities() {
        return activityStack.size();
    }

    //关闭所有Activity
    public void finishAllActivities() {
        for (int i = 0, size = activityStack.size(); i < size; i++) {
            if (null != activityStack.get(i)) {
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }

}

上面就是一个比较常用的一个实现,声明了Stack<Activity>用于存放项目过程中未Destory的Activity。写了几个常用增删查的操作,然后打印出一些APP的属性。

那还可以在Application里做什么?

初始化 如初始化 ImageLoader这一类的第三方控件还有Sp,缓存等操作

在onCreate方法中调用

            //创建默认的ImageLoader配置参数
            ImageLoaderConfiguration configuration = ImageLoaderConfiguration
                    .createDefault(this);  

            //Initialize ImageLoader with configuration.
            ImageLoader.getInstance().init(configuration);  

编写一些通用的方法 如吐司 Dialog等

简化吐司

public void showMyToast(final Activity curAT, int textResId) {

        showMyToast(curAT, textResId, Toast.LENGTH_LONG);

    }

退出App

    public void exit() {

        TRIeIDLog.logD(TAG,
                "finishAllActivities...");
        finishAllActivities();

        android.os.Process.killProcess(android.os.Process.myPid());

        System.exit(0);

    }

诸如此类的方法都可以在 Application中进行编写。

那么我们再来看下我们的BaseActivity

public abstract class BaseActivity extends Activity  {

    InputMethodManager _inputMethodManager;
    protected Resources res;
    protected BaseApplication baseApp;
    protected static final String TAG = BaseActivity.class.getName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(getLayout());

        res = this.getApplicationContext().getResources();

        baseApp = (BaseApplication) this.getApplication();

        _inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        this.getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

        findById();

        setListener();

        logic();

        baseApp.addActivity(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (getCurrentFocus() != null
                    && getCurrentFocus().getWindowToken() != null) {
                _inputMethodManager.hideSoftInputFromWindow(getCurrentFocus()
                        .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        baseApp.removeActivity(this);
    }

    //FindById
    protected abstract void findById();

    //setListener
    protected abstract void setListener();

    //Logic
    protected abstract void logic();

    protected abstract int getLayout();

    //是否支持最小SDK
    protected boolean isSupportedSDK(int sdkVerCode) {

        LogUtils.d(TAG, "isSupportedSDK - ConfigUtil.MIN_SDK_VER_CODE = \""
                + ConfigUtil.MIN_SDK_VER_CODE + "\"");
        LogUtils.d(TAG, "isSupportedSDK - sdkVerCode = \"" + sdkVerCode
                + "\"");
        return sdkVerCode >= ConfigUtil.MIN_SDK_VER_CODE;

    }

    //网络错误种类
    protected int getNetworkErrorTip(int code) {

        LogUtils.d(TAG, "getNetworkErrorTip - code = \"" + code + "\"");

        int textResId = R.string.error_network_time_out;
        switch (code) {

            case RespHandleListener.ErrCode.ERR_NETWORK_NOT_AVAILABLE:
                textResId = R.string.error_network_not_available;
                break;

            case RespHandleListener.ErrCode.ERR_SERVER_ERROR:
                textResId = R.string.error_network_server_busy;
                break;

            case RespHandleListener.ErrCode.ERR_TIME_OUT:
            case RespHandleListener.ErrCode.ERR_CLIENT_ERROR:
            case RespHandleListener.ErrCode.ERR_UNKNOWN_ERROR:
                break;

            default:
                break;

        }
        LogUtils.d(TAG, "getNetworkErrorTip - textResId = \"" + textResId + "\"");
        return textResId;

    }

}

网络判断的工具接口

RespHandleListener

public interface RespHandleListener {

     class ErrCode {

        public static final int ERR_SUCCEED = 0;
        public static final int ERR_NETWORK_NOT_AVAILABLE = -1;
        public static final int ERR_TIME_OUT = -2;
        public static final int ERR_SERVER_ERROR = -3;
        public static final int ERR_CLIENT_ERROR = -4;
        public static final int ERR_UNKNOWN_ERROR = -5;

    }
     void onError(int code);
     void onReqBegin();
     void onReqEnd(String jsonResp);

}

分析:

之前 BaseApplication中的一些方法在BaseActivity中进行了调用,BaseActivity又对我们的onCreate进行了简单的封装,把业务逻辑与控件捕捉等操作进行了分离

(具体的使用,在之后会贴出)

那我们还可以在BaseActivity中做些什么?

吐司也可以做在这里,Dialog也一样

protected void showErrorToast(int code) {

        baseApp.showMyToast(this, getNetworkErrorTip(code));

    }

网络判断的工具类getNetworkErrorTip()

屏幕信息等也可以在默认这里获取,以及一些硬件情况诸如NFC BLE等(这部分会在下一篇博文写)

接下来贴下Demo代码

public class MainActivity extends BaseActivity implements View.OnClickListener{
    Button button;

    @Override
    protected void findById() {
        button=(Button)findViewById(R.id.button);
    }

    @Override
    protected void setListener() {
        button.setOnClickListener(this);
    }

    @Override
    protected void logic() {
        LogUtils.d("-------->logic",add(1,3));
    }

    @Override
    protected int getLayout() {
        return R.layout.activity_main;
    }

    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.button){
            Toast.makeText(MainActivity.this,"点击了按钮",Toast.LENGTH_SHORT).show();
        }
    }

    private int add(int a, int b){
        return a+b;
    }
}

运行效果

这么做,妈妈再也不担心我的onCreate方法几百行了,再也不担心我少findById一个控件了,当然还可以进一步的封装 用泛型<T>来对控件操作进一步简化,这个会在后面的文章写到。

用到的第三方库:

一个很简便的日志库

compile ‘com.apkfuns.logutils:library:1.0.6‘

源码:http://yunpan.cn/cmNbQInJuKHXw 访问密码 4a23

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 14:35:43

从头开始敲代码之《从BaseApplication/Activity开始》的相关文章

从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)

转载请注明出处:王亟亟的大牛之路 开场白惯用鼓励诗句: 黑发不知勤学早,白首方悔读书迟. -- 颜真卿<劝学诗> 这一系列的博文这是第五篇了,感谢大家的支持以及陪伴,往后我也会继续努力写出高质量的内容,谢谢 今天上的是一个自定义View,新鲜出炉,先上下效果(是一张张截图拼接的Gif动画都看不出来了,大家理解就行可以下Demo跑) 样例分析(最简单的描述了) 黑色线条是我们的手机 红色是我们自定义的"TitleBar" 蓝色是我们的自定义布局 紫色是自定义布局填充的内容 我

从头开始敲代码之《从BaseApplication/Activity开始(二)》

转载请注明出处:王亟亟的大牛之路 愿意花时间写东西不容易,人啊,都是有血有肉有思想的,借鉴是学习,纯Copy就不好了,谢谢 部分资料参考于网上. <赠梁任父同年>黄遵宪 寸寸河山寸寸金,侉离分裂力谁任? 杜鹃再拜忧天泪,精卫无穷填海心. 上一篇我们讲到了简易的封装 对我们提高效率的好处,这一篇继续写下去,如果第一篇没看过的希望能看下,方便理解.链接:亟亟在安卓的进阶实例 这一次我们利用最基本的Activity生命周期中的方法,来对用户蓝牙进行识别操作,并在过程中考虑用户层面的操作理解,顺便补充

从头开始敲代码之《从BaseApplication/Activity开始(四)》

转载请注明出处:王亟亟的大牛之路 早上无聊看以前下的一大堆资料,发现一个用JNI实现的模糊效果,效果都差不多,但是对JNI的不熟悉让我不太推荐这种办法(不了解的总不方便,调试,修改都是) 然后在Git上找到个不错的实现,还是分2种的,应对于各种需要. 这一篇文章会介绍什么 1.模糊视图处理 2.线程操作优化 1.Renderscript 2.FastBlur 效果图 布局: <?xml version="1.0" encoding="utf-8"?> &

每天下午5点半下班,但是我很少在晚上1点之前睡过觉。因为都在敲代码

有时候,并不是我不想睡觉,不想休息,我也想舒适,也很想舒舒服服的坐着不工作,但很难做到,一天不敲代码,一天不学习新知识现在就浑身难受,不知道我这股热情能坚持多久,但这样的强度已经连续坚持了7个多月了,我很充实也很充实,每天我的精神饱满,战斗力极强.在做项目的时候,有一些细节方面的东西,我总想做到最好,总想做到用户体验最优,代码封装最优.有时候睡觉的时候也在想.我对未来是充满信心和期待的,我并不着急,我还很年轻,永远都年轻~ 前几天,小杰来公司面试,被我公司面试官虐的不要不要的,我总以为他很厉害,

使用Alcatraz为Xcode安装XActivatePowerMode插件, 从此敲代码逼格大大滴~

Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCode的 插件.模版以及颜色配置的工具. 关于Alcatraz的安装,这里有一篇不错的博文,请参考安装:http://www.cnblogs.com/wendingding/p/4964661.html 最近有一款插件叫ActivatePowerMode,堪称装逼神器啊,敲代码的时候,炫彩的火花尾巴效果简直屌炸天~,详情可以看XActivatePowerMode在github中的介绍https://github.com/qfis

程序员不能只会敲代码还要会投资理财

程序员不能只会敲代码,还要会理财或者说投资. 当我们步入职场,随着我们工作经验的增长我们的薪资相应的也会快速提高,很多人可能思维上还没有改变过来,不知道如何利用自己的闲钱去保值或者增值.当然现在互联网理财发展已经比较的成熟了,大多数的人也知道用自己发的工资直接购买余额宝来赚取利息,余额宝可以说是开启了国人理财的意识.对于我们普通人来说可以有以下几种投资: XX宝比如余额宝(货币基金),收益比银行活期存款或者某些定期存款还高,风险低几乎不会损失你的本金,但是一年的收益还是不能抵抗通货膨胀: 互联网

iOS Sprite Kit教程之编敲代码以及Xcode的介绍

iOS Sprite Kit教程之编敲代码以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由非常多的文件组成,比如代码文件.资源文件等.Xcode会帮助开发人员对这些文件进行管理.所以,Xcode的界面也比較复杂,如图1.40所看到的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 图

(016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)

给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树. 因为数组是递增有序的.每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; }; void newNode(TreeNode*& vNode, int vData) { vNode = new TreeNode; vNode->data = vData; vNode->leftChi

十年码农,过了十年他们依旧在敲代码

摘要:话说程序员也是一个吃青春饭的职业,经常需要加班.高强度工作.新技术学习需求等等,让青春不再来的从业者感觉吃力,但仍然有一大批人因为各种原因十年如一日的敲着代码,十年历程是怎样的一种经历,你会成为其中之一吗? 十年前的2004年,中国网民突破9000万可喜可贺,第三代互动式搜索引擎搜狗刚刚问世,新浪.搜狐.网易是中国顶级的互联网企业,2004互联网大事记里看不到BAT的影子,小编在读初中,当然,也有一批很平凡的程序员在敲代码. 来看看这十几位码农十年或平凡.或漂泊的历程(以下程序员信息主要来