Android工程架构设计:Base Library(基层MVP框架)基于EventBus

该博客介绍了如何在Android项目中构建一个基层MVP架构,使用EventBus来替代接口回调,降低PV之间的耦合。文章详细阐述了IApplication接口、BaseApplication抽象基类以及对P层的缓存管理。通过对MVP策略的微调,使用EventBus进行PV通信,实现了更高效的代码结构和可读性。同时,讨论了MVP架构在实际应用中的挑战和解决方案。
摘要由CSDN通过智能技术生成

Base Library部分把App中Application,UI(activity,fragment)公用方法重新封装成模板方法,并开放对子类的扩展。同时融入mvp设计思想,封装成基于mvp的基层架构体系。

目录

1,IApplication(接口):

2,BaseApplication(抽象基类)

2.1 规定Application中行为的执行规则(模板方法模式)

2.2 实现IApplication中的部分行为(通用部分)

2.3 Application关键方法

2.4 定义与公共行为相关的抽象方法(具体行为),供子类扩展

2.5 缓存管理Activity

3,mvp(基层mvp架构)

3.1. mvp策略微调

3.1.1.PV之间通讯采用EventBus消息机制替换之前的接口回调机制。

3.1.2.增加对P的缓存管理

3.2. 契约类 Contract

3.3. V层

1. Activity

3.3.2. Fragment

3.4. P层

3.4.1. Presenter

3.4.2. Event

3.5. M层

4,GlobalField

总结


 

1,IApplication(接口):

1,把框架内应用(Application)的通用行为抽象定义(框架内app都会用到的初始化或者公参配置的行为方法)。

2,继承ActivityLifecycleCallbacks接口,整合Activity生命周期回调方法。

之后框架内所有app的自定义Application应该都实现此接口,具体行为放在各个app的Application中实现。

public interface IApplication extends Application.ActivityLifecycleCallbacks {
    /**
     * 初始化组件(生命周期)(组件化)
     */
    void initModules();
    /**
     * 初始化Router(组件化)
     */
    void initRouter();
    /**
     * init net config
     */
    void initNetworkConfig();
    /**
     * create SharedPreference by name
     *
     * @param sharedName SharedPreference name
     */
    void initSharedPreference(String sharedName);
    /**
     * other config
     */
    void initOtherConfig();
}

也就是说,每个app的Application做了两部分事情,一部分是实现了公共行为(IApplication)(共性),另外一部分实现了私有行为(异性)。

2,BaseApplication(抽象基类)

public abstract class BaseApplication extends MultiDexApplication implements IApplication

BaseApplication需要做四件事情:

2.1 规定Application中行为的执行规则(模板方法模式)

@Override
public void onCreate() {
    super.onCreate();
    INSTANCE = this;
    registerActivityLifecycleCallbacks(this);
    /*
     * 组件化框架使用,非组件化无用
     */
    initModules();
    /*
     * 组件化框架使用,非组件化无用
     */
    initRouter();
    initNetworkConfig();
    initSharedPreference(defineSharedPreferenceName());
    initOtherConfig();
    /*
     * 组件化框架调用组件生命周期,非组件化无用
     */
    ModuleRouter.getInstance().onModulesCreate(defineModulesNeedManagedByModuleName());
}

2.2 实现IApplication中的部分行为(通用部分)

@Override
public void initModules() {
    ModuleRouter.getInstance().loadModules(this);
}
@Override
public void initSharedPreference(String sharedName) {
    SharedUtils.initInstance(getApplicationContext(), sharedName);
}

2.3 Application关键方法

@Override
public void onTerminate() {
    super.onTerminate();
    /*
     * 组件化框架调用组件生命周期,非组件化无用
     */
    ModuleRouter.getInstance().
		onModulesTerminate(defineModulesNeedManagedByModuleName());
    unregisterActivityLifecycleCallbacks(this);
}
@Override
public void onLowMemory() {
    super.onLowMemory();
    /*
     * 组件化框架调用组件生命周期,非组件化无用
     */
   ModuleRouter.getInstance().
		onModulesLowMemory(defineModulesNeedManagedByModuleName());
}
@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    /*
     * 组件化框架调用组件生命周期,非组件化无用
     */
    ModuleRouter.getInstance().
		onModulesTrimMemory(defineModulesNeedManagedByModuleName(), level);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    /*
     * 组件化框架调用组件生命周期,非组件化无用
     */
    ModuleRouter.getInstance().
	onModulesConfigurationChanged(defineModulesNeedManagedByModuleName(), newConfig);
}
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

本类库中,利用Activity生命周期回调方法,由BaseApplication对Activity对应P层的注册,解注行为进行统一管理。支持Activity,AppCompatActivity,FragmentActivity。

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    if (activity instanceof BaseActivity) {
        ((BaseActivity) activity).registerPresenter();
    } else if (activity instanceof BaseAppCompatActivity) {
        ((BaseAppCompatActivity) activity).registerPresenter();
    } else if (activity instanceof BaseFragmentActivity) {
        ((BaseFragmentActivity) activity).registerPresenter();
    }
}
@Override
public void onActivityDestroyed(Activity activity) {
    if (activity instanceof BaseActivity) {
        ((BaseActivity) activity).unregisterPresenter();
    } else if (activity instanceof BaseAppCompatActivity) {
        ((BaseAppCompatActivity) activity).unregisterPresenter();
    } else if (activity instanceof BaseFragmentActivity) {
        ((BaseFragmentActivity) activity).unregisterPresenter();
    }
}

2.4 定义与公共行为相关的抽象方法(具体行为),供子类扩展

protected abstract String defineSharedPreferenceName();
/**
 * define modules which need managed in Application lifecycle(组件化使用)
 */
protected abstract String[] defineModulesNeedManagedByModuleName();

// other methods ...

2.5 缓存管理Activity

/**
 * app有效activity缓存
 */
private List<WeakReference<Activity>> activityList = new ArrayList();
/**
 * app当前activity缓存
 */
private List<WeakReference<Activity>> currentActivityList = new ArrayList();
…… ……
/**
 * get current activity
 * @return Activity
 */
public Activity getCurrentActivity() {
    return currentActivityList.size() == 0 ? null : currentActivityList.get(0).get();
}
/**
 * kill all activity
 */
public void killAllActivity() {
    for (WeakReference<Activity> activity : activityList) {
        if (null != activity && null != activity.get()) {
            activity.get().finish();
        }
    }
}
/**
 * kill all activities Except!!!
 * @param activityClass Except activity class
 */
@SuppressWarnings("unchecked")
public void killAllActivityExcept(Class<Activity> activityClass) {
    for (WeakReference<Activity> weakReference : activityList) {
        if (null != weakReference && null != weakReference.get() && !weakReference.get().getClass().equals(activityClass)) {
            weakReference.get().finish();
        }
    }
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    activityList.add(new WeakReference<>(activity));
    // ……
}
@Override
public void onActivityStarted(Activity activity) {
    if (currentActivityList.size() == 0) {
        ModuleRouter.getInstance().
		enterForeground(defineModulesNeedManagedByModuleName());
    }
    currentActivityList.add(new WeakReference<>(activity));
}
@SuppressWarnings("unchecked")
@Override
public void onActivityStopped(Activity activity) {
    for (Iterator iterator = currentActivityList.iterator(); iterator.hasNext(); ) {
        WeakReference<Activity> weakReference = (WeakReference<Activity>) iterator.next();
        if (null != weakReference && null != weakReference.get() && weakReference.get() == activity) {
            iterator.remove();
        }
    }
    if (currentActivityList.size() == 0) {
        ModuleRouter.getInstance().
		enterBackground(defineModulesNeedManagedByModuleName());
    }
}
@SuppressWarnings("unchecked")
@Override
public void onActivityDestroyed(Activity activity) {
    // ……
    for (Iterator iterator = activityList.iterator(); iterator.hasNext(); ) {
        WeakReference<Activity> weakReference = (WeakReference<Activity>) iterator.next();
        if (null != weakReference && null != weakReference.get() 
		&& weakReference.get() == activity) {
            iterator.remove();
        }
    }
}

3,mvp(基层mvp架构)

mvp最近很火,也很烦,各个公司,各位大神,对mvp的理解和应用各异,论坛上各种对mvp的详解,demo,设计分析以及基于mvp的各种开源项目 ……

作者浅见:mvp就是一种架构设计思想,目的在于把UI展现层,业务逻辑处理层,数据管理层在代码中解耦,达到某种程度的代码层次清晰明了(我的理解:某种程度!!!)。至于实际应用中以何种方式设计实现,达到何种程度? …… 因人因项目因公司而已吧&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值