拒绝BaseActivity,优雅的代替BaseActivity

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

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

1、 BaseActivity的作用

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

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 中的功能了; 共用方法可以抽出来做成工具类的。


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

人生得意须尽欢, 桃花坞里桃花庵
点个关注呗,对,不信你点试试?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容