Base Library部分把App中Application,UI(activity,fragment)公用方法重新封装成模板方法,并开放对子类的扩展。同时融入mvp设计思想,封装成基于mvp的基层架构体系。
目录
2.1 规定Application中行为的执行规则(模板方法模式)
2.2 实现IApplication中的部分行为(通用部分)
2.4 定义与公共行为相关的抽象方法(具体行为),供子类扩展
3.1.1.PV之间通讯采用EventBus消息机制替换之前的接口回调机制。
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