日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从头开始敲代码之《从BaseApplication/Activity开始》 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載請注明出處王亟亟的大牛之路

其安易持,其未兆易謀;其脆易泮,其微易散。為之于未有,治之于未亂。合抱之木,生于毫末;九層之臺,起于壘土;千里之行,始于足下。為者敗之,執(zhí)者失之。是以圣人無為故無敗,無執(zhí)故無失。民之從事,常于幾成而敗之。慎終如始,則無敗事。是以圣人欲不欲,不貴難得之貨,學(xué)不學(xué),復(fù)眾人之所過,以輔萬物之自然而不敢為。

作為系列專題的第一篇,這一篇文章屬于小難產(chǎn),中間夾雜著一些工作上的事,一些蛋疼的事(學(xué)車之類的),說實在的,做了Coder之后發(fā)現(xiàn)業(yè)余時間還真不是太多。。。。唉。。。整個專欄的前 5 6篇將會比較簡單,便于過度。

包目錄:

好,廢話不多進(jìn)入正題

這篇文章干什么呢?
對我們平時用的最多相當(dāng)較為常用的Activity進(jìn)行簡單的封裝,以滿足基礎(chǔ)的需求

封裝是什么?封裝的好處是什么?
1.將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個有機的整體.
2.增強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細(xì)節(jié),而只是要通過外部接口,以特定的訪問權(quán)限來使用類的成員.

這一篇來自定義我們自己的 BaseApplication 以及 BaseActivity

為什么要那么做?
白話版:把什么初始化,稀里嘩啦一大堆的Toast Dialog的工具全部丟進(jìn)去,讓后續(xù)的Activity的業(yè)務(wù)更清晰。

每一次的例子都是自己花心思寫的,質(zhì)量好壞客觀見諒

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的參數(shù)*/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;}//返回寨內(nèi)Activity的總數(shù)public int howManyActivities() {return activityStack.size();}//關(guān)閉所有Activitypublic void finishAllActivities() {for (int i = 0, size = activityStack.size(); i < size; i++) {if (null != activityStack.get(i)) {activityStack.get(i).finish();}}activityStack.clear();}}

上面就是一個比較常用的一個實現(xiàn),聲明了Stack<Activity>用于存放項目過程中未Destory的Activity。寫了幾個常用增刪查的操作,然后打印出一些APP的屬性。

那還可以在Application里做什么?
初始化 如初始化 ImageLoader這一類的第三方控件還有Sp,緩存等操作
在onCreate方法中調(diào)用

//創(chuàng)建默認(rèn)的ImageLoader配置參數(shù) 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中進(jìn)行編寫。

那么我們再來看下我們的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;}//網(wǎng)絡(luò)錯誤種類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;}}

網(wǎng)絡(luò)判斷的工具接口
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中進(jìn)行了調(diào)用,BaseActivity又對我們的onCreate進(jìn)行了簡單的封裝,把業(yè)務(wù)邏輯與控件捕捉等操作進(jìn)行了分離
(具體的使用,在之后會貼出)

那我們還可以在BaseActivity中做些什么?

吐司也可以做在這里,Dialog也一樣

protected void showErrorToast(int code) {baseApp.showMyToast(this, getNetworkErrorTip(code));}

網(wǎng)絡(luò)判斷的工具類getNetworkErrorTip()
屏幕信息等也可以在默認(rèn)這里獲取,以及一些硬件情況諸如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;} }

運行效果

這么做,媽媽再也不擔(dān)心我的onCreate方法幾百行了,再也不擔(dān)心我少findById一個控件了,當(dāng)然還可以進(jìn)一步的封裝 用泛型<T>來對控件操作進(jìn)一步簡化,這個會在后面的文章寫到。

用到的第三方庫:
一個很簡便的日志庫

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

源碼:http://yunpan.cn/cmNbQInJuKHXw 訪問密碼 4a23

總結(jié)

以上是生活随笔為你收集整理的从头开始敲代码之《从BaseApplication/Activity开始》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。