從頭開始敲代碼之《從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.pswp.cn/news/287597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287597.shtml
英文地址,請注明出處:http://en.pswp.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 計…

python冒泡排序代碼完整_用Python寫冒泡排序代碼

python代碼實現冒泡排序代碼其實很簡單&#xff0c;具體代碼如下所示&#xff1a;代碼Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 def bubbleSort(numbers):for j in xrange(len(numbers),-1,-1):for i in xra…

[C++]VS2005(VC8) 使用 Boost

測試環境&#xff1a;[1] Widnows XP Professional[2] Visual Studio 2005 Team Studio(VC8.0)[3] WinCvs 1.31. 下載 Boost透過 CVS 下載最新版 cvs -d:pserver:anonymousboost.cvs.sourceforge.net:/cvsroot/boost login [詢問密碼時&#xff0c;直接輸入 Enter 略過] cvs …

Android之編譯提示error: Apostrophe not preceded by

1 問題 as編譯提示錯誤如下 error: Apostrophe not preceded by 2 原因 字符串資源文件里面value包含一個單引號 <string name"key">Don t ....</string> 2 解決辦法 1) 加雙引號 <string name"key">"Don t ...."</s…

【ArcObject開發】實驗:ArcGIS Desktop開發方式入門基礎教程

一、實驗目的: 熟練掌握ArcGIS Desktop開發方式。 二、實驗準備: 學習ArcGIS Desktop定制步驟;熟悉VBA編程環境、Active DLL和Active EXE開發一般過程。 三、實驗內容: (1)描述在ArcGIS Desktop環境下定制窗體界面的一般步驟;(2)在VBA環境下編寫宏,實現圖層視圖…

C# WPF后臺動態添加控件(經典)

概述在Winform中從后臺添加控件相對比較容易&#xff0c;但是在WPF中&#xff0c;我們知道界面是通過XAML編寫的&#xff0c;如何把后臺寫好的控件動態添加到前臺呢&#xff1f;本節舉例介紹這個問題。這里要用到UniformGrid布局&#xff0c;UniformGrid 是一種橫向的網格分割、…

Android Button監聽的方式

Android Button的幾種監聽方式 1、一個Button對應一個監聽 1&#xff09;xml文件中綁定監聽 <Buttonandroid:id"id/btn_test"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"test listener"a…

hdu 5441 (并查集)

題意&#xff1a;給你n個點&#xff0c;m條邊構成無向圖。q個詢問&#xff0c;每次一個值&#xff0c;求有多少條路&#xff0c;路中的邊權都小于這個值 a->b 和 b->a算兩種 思路&#xff1a;把權值從小到大排序&#xff0c;詢問從小到大排序&#xff0c;如果相連則用并查…

【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…

Error: package or namespace load failed for ‘rJava’:

https://stackoverflow.com/questions/30738974/rjava-load-error-in-rstudio-r-after-upgrading-to-osx-yosemite 安裝好的“xlsx”不能正常加載 library("xlsx") 報錯&#xff1a; 載入需要的程輯包&#xff1a;rJava Error: package or namespace load failed for…

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持久…

Python學習筆記之字典

一、創建和使用字典 1、創建字典 phonebook{Alice:2341,Beth:9102,Cecil:3258} 2、dict,通過映射創建字典 >>> items[(name,Gumby),(age,34)] >>> ddict(items) >>> d 顯示&#xff1a;{name:Gumby,age:34} dict&#xff0c;通過關鍵字創建字典 >…

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…