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

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

作为系列专题的第一篇,这一篇文章属于小难产,中间夹杂着一些工作上的事,一些蛋疼的事(学车之类的),说实在的,做了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>();@Overridepublic 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);}//获取最后一个Activitypublic Activity currentActivity() {Activity activity = activityStack.lastElement();return activity;}//返回寨内Activity的总数public int howManyActivities() {return activityStack.size();}//关闭所有Activitypublic 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();@Overrideprotected 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);}@Overridepublic 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);}@Overrideprotected void onPause() {super.onPause();}@Overrideprotected void onResume() {super.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();baseApp.removeActivity(this);}//FindByIdprotected abstract void findById();//setListenerprotected abstract void setListener();//Logicprotected abstract void logic();protected abstract int getLayout();//是否支持最小SDKprotected 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;@Overrideprotected void findById() {button=(Button)findViewById(R.id.button);}@Overrideprotected void setListener() {button.setOnClickListener(this);}@Overrideprotected void logic() {LogUtils.d("-------->logic",add(1,3));}@Overrideprotected int getLayout() {return R.layout.activity_main;}@Overridepublic 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

从头开始敲代码之《从BaseApplication/Activity开始》相关推荐

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

    转载请注明出处:王亟亟的大牛之路 开场白惯用鼓励诗句: 黑发不知勤学早,白首方悔读书迟. -- 颜真卿<劝学诗> 这一系列的博文这是第五篇了,感谢大家的支持以及陪伴,往后我也会继续努力写出 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:王亟亟的大牛之路 愿意花时间写东西不容易,人啊,都是有血有肉有思想的,借鉴是学习,纯Copy就不好了,谢谢 部 ...

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

    转载请注明出处:王亟亟的大牛之路 开场白惯用鼓励诗句: 黑发不知勤学早,白首方悔读书迟. -- 颜真卿<劝学诗> 这一系列的博文这是第五篇了,感谢大家的支持以及陪伴,往后我也会继续努力写出 ...

  4. 不是码农,不会敲代码的她,却最懂程序员!| 人物志

    受访者 | 西乔 采访人 | 伍杏玲 出品 | 程序人生(ID:coder_life) 作为程序员,想必你肯定看过这样一组漫画:简洁的画风,常年驼背对着电脑敲代码的程序员,他表情木讷,嘴里吐槽的内容扎 ...

  5. 第二! 他排中本聪与V神中间, 单靠文字就“打败”了敲代码的程序员!

    来源 | <Mastering Ethereum> 作者 | Andreas Antonopoulos.Gavin Wood 出品 | 区块链大本营(blockchain_camp) An ...

  6. 程序员再也不能埋头敲代码了

    上周,阿里巴巴重磅发布了机器学习平台 PAI 3.0 版本,据悉,这个 PAL 平台封装了 200 多种经典算法,可以轻松搭建机器学习实验.作为码农一枚,使我不得不抬起原本一直低着敲代码的头,看看这个 ...

  7. 写代码神器!双屏敲代码飞起,包邮送一台!

    写代码如果用多个屏是件很爽的事情,敲代码Bug多不多不重要,逼格必须先到位! 所以,小编联合9位公众号主给大家送一款全新的金正(NINTAUS)20英寸直面黑色电脑显示器.写代码逼格高! 赠送规则 本 ...

  8. 某女程序员吐槽自己被男同事集体排挤!一个人吃饭,一个人敲代码!深深感觉到世界的恶意!...

    请点击上面 一键关注! 都说女程序员是程序员里的团宠,事实真是这样吗? 一个女程序员发帖吐槽自己太孤独,上班时一个人吃饭,一个人敲代码.男程序员却能一起讨论不会的问题,吃饭也一起吃.小姐姐感慨:终于知 ...

  9. 敲代码也能赚大钱吗?

    我们好像永远也追不上互联网的浪潮. 你看,人工智能的浪潮还未退去,区块链就应时而生了. 一个又一个新技术的产生不由让人产生联想: 程序员的薪资一定很高吧 其实不然. 知乎上有人说:程序员已经成了天底下 ...

最新文章

  1. 『Python Web框架之Django』第几节: AJAX
  2. 路由(route)是什么意思?
  3. Java 8 Friday Goodies:Lambda和XML
  4. 在c++中qsort()排序函数的使用qsort函数应用大全
  5. 计算机大学生学生证,电子学生证运行一月争议多:学生感觉被监控
  6. java 用户、角色、权限数据库设计
  7. C盘的“压缩驱动器以节约磁盘空间”有用吗
  8. avl cruise与matlab,AVL CRUISE下载,AVL CRUISE购买,AVL CRUISE试用,AVL CRUISE介绍,AVL CRUISE评价...
  9. 爆!看过这么多教程吗?不管你看没看过,我反正是没看过!
  10. Tableau bug合集1:无法展示emoji表情包
  11. CTF|逆向工程软件之IDA
  12. 物料编码是计算机识别和检索物料的( ),物料编码是计算机识别和检索物料的
  13. C语言四种swap函数
  14. 一元函数积分学的概念与性质
  15. 2021年中国外卖行业发展现状、市场竞争格局及未来发展趋势分析:美团外卖市场份额持续提升[图]
  16. number1(python)
  17. 职称英语计算机考试取消,2020年职称英语考试取消了吗
  18. 工业镜头和民用镜头的特点和区别
  19. 扒皮下音悦台的“返回顶部”图标效果
  20. ❤️UNITY实战进阶-OBB包围盒详解-6

热门文章

  1. 2016-6-28 工作总结
  2. strip 命令的使用方法
  3. Http状态码完整说明
  4. 微软中国推校园先锋计划,保障学生低价获取正版软件
  5. MYsql 安装后启动服务1067错误
  6. 仅对此用户禁用 java_Spring Security实现禁止用户重复登陆的配置原理
  7. 嵌入式软件工程师2021面试指南【转】
  8. 全国计算机等级考试题库二级C操作题100套(第25套)
  9. python显示目录中的文件_Python中的文件和目录操作实现
  10. @EnableConfigurationProperties 注解和@ConfigurationProperties注解实现配置绑定