从头开始敲代码之《从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>();@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查缺补漏系统学习 EF Core 6 - 原始 SQL 查询

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 EF Core 系列的第五篇文章&#xff0c;上一篇文章盘点了 EF Core 中的几种数据查询方式。但是有有时候&#xff0c;我们可能无法用标准的 LINQ 方法完成查询任务。或者编译后的 LINQ 查询&#xff0c;没有我们想要的…

【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

一、学习目标 了解图片的结构属性了解如何捕获视频了解waitkey的使用方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计…

C# WPF后台动态添加控件(经典)

概述在Winform中从后台添加控件相对比较容易&#xff0c;但是在WPF中&#xff0c;我们知道界面是通过XAML编写的&#xff0c;如何把后台写好的控件动态添加到前台呢&#xff1f;本节举例介绍这个问题。这里要用到UniformGrid布局&#xff0c;UniformGrid 是一种横向的网格分割、…

【Envi风暴】Envi 5.4遥感影像镶嵌原来如此简单!

图像镶嵌指是在一定的数学基础控制下,把多景相邻的遥感图像拼接成一个大范围、无缝图像的过程。 Envi的图像镶嵌功能提供交互式的方式将没有地理坐标或者地理坐标的多幅图像合并,生成一幅单一的合成图像。镶嵌功能提供了透明处理、匀色、羽化等功能。 下面演示基于地理坐标(…

[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑

一、学习目标 了解图片的通道与数组结构了解使用numpy创建一个图片了解使用numpy对图片的一般操作方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的hel…

java 常用类库_JAVA(三)JAVA常用类库/JAVA IO

成鹏致远 |lcw.cnblog.com|2014-02-01JAVA常用类库1.StringBufferStringBuffer是使用缓冲区的&#xff0c;本身也是操作字符串的&#xff0c;但是与String类不同&#xff0c;String类的内容一旦声明之后则不可改变&#xff0c;改变的只是其内存地址的指向&#xff0c;而StringB…

Android之国际化部分文字生效而部分文字没有生效的坑

1 问题 Android国际化我们知道只要在res目录下面&#xff0c;创建不同国家的文件夹然后&#xff0c;把不同国家对于的语言以键值对的方式写进strings.xml文件就行&#xff0c;这是一个非常简单的操作&#xff0c;但是今天遇到了一个很奇葩的问题&#xff0c;在部分手机&#x…

【中间件】c#/.net使用GZY.Quartz.MUI搭建可视化的定时任务面板

GZY.Quartz.MUI是在github上开源的aspnetcore项目, 它旨在帮助开发人员通过面板来设置定时任务&#xff0c;主要想做的就是:像swaggerUI一样,项目入侵量小,仅需要在Startup中注入的UI组件官方地址:https://www.cnblogs.com/GuZhenYin/p/15745002.html主要功能1.增加本地json持久…

iOS UI基础-7.0 UIScrollView

概述 移动设备的屏幕大小是极其有限的&#xff0c;因此直接展示在用户眼前的内容也相当有限.当展示的内容较多&#xff0c;超出一个屏幕时&#xff0c;用户可通过滚动手势来查看屏幕以外的内容,普通的UIView不具备滚动功能&#xff0c;不能显示过多的内容。UIScrollView是一个能…

【ArcGIS风暴】缓冲区分析、叠置分析综合实验案例:购房区域的选择

实验平台:ArcGIS 9.3实验目的:熟练掌握A rcGIS缓冲区分析和叠置分析操作,综合利用各项空间分析工具解决实际问题。实验要求:对每个条件进行缓冲区分析,运用空间叠置分析对多个图层叠加,并分等级,确定合适的区域。实验数据:ArcEx8实验步骤打开ArcMap,加载数据ArcEx8,如…

[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

一、学习目标 了解什么是色彩空间了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python opencv 计算机视觉零基…

java gui 按键 数组_java GUI分配数组值

好的,所以这是一个非常基本的例子.它需要更多的工作和优化,但应该让你朝着正确的方向前进import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Shape;im…

poj1189 简单dp

http://poj.org/problem?id1189 Description 有一个三角形木板,竖直立放。上面钉着n(n1)/2颗钉子&#xff0c;还有(n1)个格子&#xff08;当n5时如图1&#xff09;。每颗钉子和周围的钉子的距离都等于d&#xff0c;每一个格子的宽度也都等于d&#xff0c;且除了最左端和最右端…

WPF|如何在 WPF 中设计漂亮的社交媒体信息仪表板

1. 效果展示先来直接欣赏效果&#xff1a;2. 准备创建一个WPF工程&#xff0c;比如站长使用 .NET 7[1] 创建名为 Dashboard3 的WPF项目&#xff0c;添加一些图片资源&#xff0c;项目目录如下&#xff1a;2.1 图片资源可在网站 iconfont[2] 下载 关闭、最小化 图标&#xff0c;…

CentOS 设置服务开机启动的方法

为什么80%的码农都做不了架构师&#xff1f;>>> CentOS设置服务开机启动的两种方法 1、利用 chkconfig 来配置启动级别 在CentOS或者RedHat其他系统下&#xff0c;如果是后面安装的服务&#xff0c;如httpd、mysqld、postfix等&#xff0c;安装后系统默认不会自动启…

【ArcGIS风暴】水文分析模块实验:山脊线和山谷线提取

实验平台:ArcGIS 9.3实验目的:学习和掌握山脊线和山谷线提取的原理及方法实验要求:利用ArcGIS水文分析模块提取样区的山脊线和山谷线实验数据:Ex1实验步骤:1.正负地形的提取 (1)打开Arcmap,加载数据EX1,如图 (2)平滑处理(均值滤波)。加载Spatial Analyst模块,单击…

[python opencv 计算机视觉零基础到实战] 五、对象追踪

一、学习目标 了解为什么色彩空间的转换那么重要了解opencv中进行对象跟踪的方法 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld [[python op…

【ArcGIS风暴】在ArcGIS中实现将一个圆16等分

本文实现在ArcGIS中画一个圆,然后将其16等分。 步骤一:生成圆(多边形图层) (1)创建一个点图层(图名Center),如果需要精确定位该点,建议通过输入坐标点的方式来创建,这一步比较简单,不再详述; (2)利用Buffer命令创建缓冲区(图名Circle_2km),因为要处理的对象…

[python opencv 计算机视觉零基础到实战] 六、图像运算

一、学习目标 了解opencv中图像运算的方法了解opencv中图像运算的运用 如有错误欢迎指出~ 二、了解OpenCV中图像运算的运用 目录 [python opencv 计算机视觉零基础到实战] 一、opencv的helloworld [【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头…

【ArcGIS风暴】实验:公路建设成本的计算

实验平台:ArcGIS 9.3实验目的:学习和掌握公路建设成本的计算方法实验要求:熟练掌握如何生成通行成本层、计算成本距离,并学会计算最佳路径,且对成本距离与直线距离进行比较。实验数据:ArcEx7实验步骤:生成通行成本层1.打开Arcmap,加载数据ArcEX7,如图 2.执行spatial …