標籤:android 快速開發 appbase
Android快速開發之appBase——(4).詳解com.snicesoft.Application和BaseActivity
在 Android快速開發之appBase——(1).appBase介紹中使用過com.snicesoft.Application和BaseActivity,本篇則解開她們的面紗。
1. com.snicesoft.Application1) 源碼分析
package com.snicesoft;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.graphics.drawable.Drawable;import android.view.View;import com.lidroid.xutils.BitmapUtils;import com.lidroid.xutils.DbUtils;import com.lidroid.xutils.HttpUtils;import com.lidroid.xutils.bitmap.BitmapDisplayConfig;import com.snicesoft.avlib.AVLib;import com.snicesoft.avlib.AVLib.LoadImg;import com.snicesoft.http.APIs;import com.snicesoft.http.Charset;import com.snicesoft.http.HttpReq;/** * 程式Application,作為應用管理配置 * * @author zhe * */public class Application extends android.app.Application { private HttpUtils httpUtils; private BitmapUtils bitmapUtils; private HashMap<String, DbUtils> dbHashMap = new HashMap<String, DbUtils>(); private HttpReq httpReq; public HttpReq httpReq() { if (httpReq == null) httpReq = new HttpReq(httpUtils); return httpReq; } public HttpUtils hu() { return httpUtils; } public BitmapUtils bu() { return bitmapUtils; } public DbUtils du(String dbName) { if (dbHashMap.get(dbName) == null) dbHashMap.put(dbName, DbUtils.create(getBaseContext(), dbName)); return dbHashMap.get(dbName); } @Override public void onCreate() { httpUtils = new HttpUtils(); httpUtils.configTimeout(APIs.Base.TIME_OUT); httpUtils.configRequestThreadPoolSize(10); httpUtils.configResponseTextCharset(Charset.UTF_8); bitmapUtils = new BitmapUtils(getBaseContext()); AVLib.setLoadImg(new LoadImg() { @SuppressWarnings("deprecation") @Override public void loadImg(View v, int loading, int fail, String uri) { BitmapDisplayConfig config = new BitmapDisplayConfig(); if (loading != 0) { Drawable drawable = getResources().getDrawable(loading); config.setLoadingDrawable(drawable); } if (fail != 0) { Drawable drawable = getResources().getDrawable(fail); config.setLoadFailedDrawable(drawable); } bitmapUtils.display(v, uri, config); } }); } private List<Activity> activities = new ArrayList<Activity>(); public void addActivity(Activity activity) { activities.add(activity); } public void removeActivity(Activity activity) { if (activities.contains(activity)) { activities.remove(activity); } } public void finishActivity(Class<?> activity) { for (Activity act : activities) { if (act.getClass() == activity) { act.finish(); break; } } } public void exitApp() { for (Activity activity : activities) { activity.finish(); } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); }}
- List及相關的方法,是常用的App中管理activity的方法
- exitApp() 是真正退出app的方法,只有將所有的activity全部finish,以及殺掉app的進程才能夠真正退出一個應用。
- HttpReq、BitmapUtils、DbUtils、HttpUtils 全部在application啟動的時候配置好,並且提供對應方法擷取,這樣做的目的就是讓整個APP只保留一個對象,放置資源浪費,任何只要能擷取到Application的地方都可以擷取對應的模組唯一對象進行操作。
- hu():返回HttpUtils對象
- bu():返回BitmapUtils對象
- httpReq():返回HttpReq對象
- du(String dbName):根據資料庫名字返回DbUtils對象,提供多資料支援。
2) 怎麼擴充
- 可以繼承com.snicesoft.Application實現自己的Application(推薦)
- 也可以完全仿照com.snicesoft.Application自己實現Application
com.snicesoft.Application在最早的時候用到了static方法,由於static對於對象的引用控制不當,會導致很多問題,後來全部改掉。
2. BaseActivity1) 源碼分析
package com.snicesoft.base;import android.os.Bundle;import android.view.View;import com.snicesoft.Application;import com.snicesoft.avlib.base.AvFragment;import com.snicesoft.avlib.base.AvFragmentActivity;import com.snicesoft.avlib.rule.IData;import com.snicesoft.avlib.rule.IHolder;import com.snicesoft.util.FragmentUtil;public abstract class BaseActivity<H extends IHolder, D extends IData> extends AvFragmentActivity<H, D> { public Application getApp() { return (Application) getApplication(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getApp().addActivity(this); } protected AvFragment<?, ?, ?> curFragment; public void openFragment(int id, AvFragment<?, ?, ?> fragment) { if (curFragment != null && curFragment == fragment) return; FragmentUtil.openFragment(id, fragment, getSupportFragmentManager()); curFragment = fragment; } public void replaceFragment(int id, AvFragment<?, ?, ?> fragment, boolean backStack) { FragmentUtil.replaceFragment(id, fragment, getSupportFragmentManager(), backStack); curFragment = fragment; } @Override public void onClick(View v) { super.onClick(v); if (curFragment != null) curFragment.onClick(v); } @Override protected void onDestroy() { super.onDestroy(); getApp().removeActivity(this); }}
- BaseActivity擴充子AVLib中的AvFragmentActivity
2) 怎麼擴充
- 繼承BaseActivity重寫自己的BaseActivity並添加自己APP的通用業務(推薦)
- 繼承AVLib中的基礎Activity
Android快速開發之appBase——(4).詳解com.snicesoft.Application和BaseActivity