给大家分享一下 ✔ Get 到的一个新技能;不用封装BaseActivity也能实现它所达到的效果。
我取名叫拒绝,那说明BaseActivity肯定有弊端或者是限制、局限性的;‘优雅’ 说明新的方式是相比较优秀的实现方式。 第一次录了个视频
套路如下:
1、BaseActivity做些什么?
2、 ✔ 新技能
3、BaseActivit 与新方式的优缺点比较
4、一个完整的BaseActivity在 new Way如何体现
1、 BaseActivity的作用
绝大多数我们会做一个BaseActivity ,用来抽离共性,封装统一的操作; 这也是封装的优点, 比如像下面这样,我们一般会在 onCreate()
与onDestory()
里面做功能初始化、注销这样一些动作,比如:推送的注册注销、友盟、eventbus初始化 activity管理堆栈的进栈出栈等等这些事情。
抽离共性,封装操作。
2、✔ 新技能 new Way
既然我们要抽离共性统一管理,那不用继承BaseActivity
,就只能在application
内来搞事情了, 在application
里面有一个方法叫registerActivityLifecycleCallbacks( ActivityLifecycleCallbacks)
,看名字就很好理解,订阅activity生命周期回调。
看一下 ActivityLifecycleCallbacks
都能做那些事情:
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
上面不解释了,很容易看明白。
那我们开始动工来实现吧:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
// todo 推送的注册、友盟、eventbus初始化
ActivityManager.getAppManager().addActivity(activity);
}
@Override
public void onActivityDestroyed(Activity activity) {
// todo 推送的注销、友盟、eventbus 注销
ActivityManager.getAppManager().finishActivity(activity);
}
//...
});
}
}
好很简单吧,这就实现了。
3、BaseActivit 与新方式的优缺点比较
BaseAcitivty 局限性:
BaseActivity的优点,那肯定不用说了,不然为啥几乎多会有;
就说说局限吧 ,它的局限就在于继承, 在java当 单继承、多实现,这句话很好理解,继承只能单个,和一个人不能有多个爸爸是一样的(不可能隔壁老王和你法律上的爸爸同时是你亲爸爸 -);
比如说:我们引用换肤框架,然而它有自己的BaseActiivty,必须要求继承它的baseactivity,但并不似所有activity都需要换肤功能,那么你就需要在多写一个 Base2Actiivty ,这样的库多了,你的应用里面就会有多个baseactivity,这样不好管理 代码的可读性也会变差
第二点: 继承是一种强耦合的方式,强耦合概念 请自行百度;
说到这,有个小提示(也是老套路了):优秀的第三方库 都是面向接口编程的, 如果是使用需要继承才能实现的第三方库 我们要谨慎的引用。
新方式的优点
面向接口,多实现,松耦合。
视频扯淡地址
4、一个完整的BaseActivity在 new Way如何体现
有好多同学认为我以偏概全,我并不认同,我认为这种是一种新的实现方式,从某种程度上来讲选择哪种方式看个人取舍。
一个完整的BaseActivity 大概如下:
public interface IActivity {
void initView();
void initListener();
int getLayoutId();
}
public abstract class BaseActivity extends AppCompatActivity implements IActivity {
/** 是否禁止旋转屏幕 */
protected boolean isAllowScreenRoate=false;
/** 是否允许全屏*/
protected boolean mAllowFullScreen= true;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 一些系统配置
isAllowScreenRoate= null!=savedInstanceState.getKey(xxx)?savedInstanceState.getKey(xxx):isAllowScreenRoate;
mAllowFullScreen= null!=savedInstanceState.getKey(xxx)?savedInstanceState.getKey(xxx):mAllowFullScreen;
if(!isAllowScreenRoate){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if(mAllowFullScreen){
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
//方法拆分
setContentView(getLayoutId());
initView();
initListener();
//各种初始化:方法初始化、通用配置、
// EventBus初始化
//
}
@Override
protected void onDestroy() {
// 一些销毁 比如 EventBus销毁等等
super.onDestroy();
}
//....一些便于使用的共用方法
/**
* startActivity
*
* @param clazz
*/
protected void readyGo(Class> clazz) {
Intent intent = new Intent(this, clazz);
startActivity(intent);
}
}
一般完整的Base 我们会在里面做一些什么呢?
1、 通用的系统配置(状态栏,全屏配置什么的)
2、方法拆分(onCreate拆成 initView、initListener等等)
3、业务初始化/销毁动作(推送、事件总线EventBus\otto什么的)
4、写一些共用方法(比如跳转方法);
大概总结起来应该就做了上面这些事情; 其实放在application
内都好解决。
public class BaseSettings{
/** 是否禁止旋转屏幕 */
public boolean isAllowScreenRoate=false;
/** 是否允许全屏*/
public boolean mAllowFullScreen= true;
}
// 共用方法
public class CommonFunction{
/**
* startActivity
*/
public static void readyGo(Context context,Class> clazz) {
Intent intent = new Intent(context, clazz);
context.startActivity(intent);
}
}
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
// 一些系统配置
BaseSettings settings=savedInstanceState.getSerializable();
settings=settings!=null?settings:new BaseSetting();
if(!settings.isAllowScreenRoate){
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if(settings.mAllowFullScreen){
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
// 方法拆分(onCreate拆成 initView、initListener等等)
if(activity instanceof IActivity){
//方法拆分
setContentView(getLayoutId());
initView();
initListener();
}
//各种业务初始化
}
@Override
public void onActivityDestroyed(Activity activity) {
// 各种业务 注销、友盟、eventbus 注销
}
});
}
}
这样就是一个完整的实现了 示例Base 中的功能了; 共用方法可以抽出来做成工具类的。
希望我的文章不会误导在观看的你,如果有异议的地方欢迎讨论和指正。
如果能给观看的你带来收获,那就是最好不过了。