«

Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

时间:2024-3-2 18:47     作者:韩俊     分类: Android


转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46441571,请尊重他人的辛勤劳动成果,谢谢!

Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

在 Android快速开发之appBase——(1).appBase介绍中使用过com.snicesoft.Application和BaseActivity,本篇则解开她们的面纱。

  1. com.snicesoft.Application

1) 源码分析

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对于对象的引用控制不当,会导致很多问题,后来全部改掉。

  1. BaseActivity

1) 源码分析

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,继承了View控件自动绑定和View数据绑定的特性。增加了操作Fragment的常用方法。
默认实现了android.view.View$OnClickListener接口,并且解决onclick事件分发到Fragment的问题。
getApp():获取com.snicesoft.Application对象或者其子类对象,方便在activity和fragment获取网络、数据库、图片处理等模块操作。
onCreate中默认将当前的activity添加到com.snicesoft.Application管理中
onDestroy中默认将当前的activity从com.snicesoft.Application管理中移除

2) 怎么扩展

继承BaseActivity重写自己的BaseActivity并添加自己APP的通用业务(推荐)
继承AVLib中的基础Activity
完全可以自己重写BaseActivity

  1. 补充
    今天家里网络出现了问题,编辑的时候出现了Markdown处理问题,提交不全,现在补充完整。

对于Application和BaseActivity来讲,只要能满足自己业务的需求,怎样写都可以。这里只是提供我的一个基础模板,如果能满足项目需求,可以直接使用。不能满足或者你有更好的想法,不妨给我留言说说,让我借鉴下,完善我的appBase。下一篇将会讲的BasePresenter,用于处理业务的一个组件(或者称为层,作用相当于javaEE中的Service层)。
最后,希望大家多多点评!!

标签: android

热门推荐