拒绝BaseActivity,优雅的代替BaseActivity

给大家分享一下 ✔ Get 到的一个新技能;不用封装BaseActivity也能实现它所达到的效果。
我取名叫拒绝,那说明BaseActivity肯定有弊端或者是限制、局限性的;‘优雅’ 说明新的方式是相比较优秀的实现方式。 第一次录了个视频
套路如下:

1、BaseActivity做些什么?
2、 ✔ 新技能
3、BaseActivit 与新方式的优缺点比较
4、一个完整的BaseActivity在 new Way如何体现

1、 BaseActivity的作用

绝大多数我们会做一个BaseActivity ,用来抽离共性,封装统一的操作; 这也是封装的优点, 比如像下面这样,我们一般会在 onCreate()onDestory() 里面做功能初始化、注销这样一些动作,比如:推送的注册注销、友盟、eventbus初始化 activity管理堆栈的进栈出栈等等这些事情。
抽离共性,封装操作。

拒绝BaseActivity,优雅的代替BaseActivity_第1张图片
BaseActivity搞事情
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 中的功能了; 共用方法可以抽出来做成工具类的。


希望我的文章不会误导在观看的你,如果有异议的地方欢迎讨论和指正。
如果能给观看的你带来收获,那就是最好不过了。

人生得意须尽欢, 桃花坞里桃花庵
点个关注呗,对,不信你点试试?

你可能感兴趣的:(拒绝BaseActivity,优雅的代替BaseActivity)