拒絕BaseActivity,優(yōu)雅的代替BaseActivity

給大家分享一下 ? Get 到的一個(gè)新技能;不用封裝BaseActivity也能實(shí)現(xiàn)它所達(dá)到的效果。
我取名叫拒絕,那說明BaseActivity肯定有弊端或者是限制、局限性的;‘優(yōu)雅’ 說明新的方式是相比較優(yōu)秀的實(shí)現(xiàn)方式。 第一次錄了個(gè)視頻
套路如下:

1、BaseActivity做些什么?
2、 ? 新技能
3、BaseActivit 與新方式的優(yōu)缺點(diǎn)比較
4、一個(gè)完整的BaseActivity在 new Way如何體現(xiàn)

1、 BaseActivity的作用

絕大多數(shù)我們會(huì)做一個(gè)BaseActivity ,用來抽離共性,封裝統(tǒng)一的操作; 這也是封裝的優(yōu)點(diǎn), 比如像下面這樣,我們一般會(huì)在 onCreate()onDestory() 里面做功能初始化、注銷這樣一些動(dòng)作,比如:推送的注冊(cè)注銷、友盟、eventbus初始化 activity管理堆棧的進(jìn)棧出棧等等這些事情。
抽離共性,封裝操作。

BaseActivity搞事情
2、? 新技能 new Way

既然我們要抽離共性統(tǒng)一管理,那不用繼承BaseActivity,就只能在application內(nèi)來搞事情了, 在application里面有一個(gè)方法叫registerActivityLifecycleCallbacks( ActivityLifecycleCallbacks),看名字就很好理解,訂閱activity生命周期回調(diào)。

看一下 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);
    }

上面不解釋了,很容易看明白。

那我們開始動(dòng)工來實(shí)現(xiàn)吧:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                  //  todo 推送的注冊(cè)、友盟、eventbus初始化
                 ActivityManager.getAppManager().addActivity(activity);
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
                  //  todo 推送的注銷、友盟、eventbus 注銷
                  ActivityManager.getAppManager().finishActivity(activity);
            }
            //...
        });
    }
}

好很簡(jiǎn)單吧,這就實(shí)現(xiàn)了。

3、BaseActivit 與新方式的優(yōu)缺點(diǎn)比較

BaseAcitivty 局限性:
BaseActivity的優(yōu)點(diǎn),那肯定不用說了,不然為啥幾乎多會(huì)有;
就說說局限吧 ,它的局限就在于繼承, 在java當(dāng) 單繼承、多實(shí)現(xiàn),這句話很好理解,繼承只能單個(gè),和一個(gè)人不能有多個(gè)爸爸是一樣的(不可能隔壁老王和你法律上的爸爸同時(shí)是你親爸爸 -);
比如說:我們引用換膚框架,然而它有自己的BaseActiivty,必須要求繼承它的baseactivity,但并不似所有activity都需要換膚功能,那么你就需要在多寫一個(gè) Base2Actiivty ,這樣的庫(kù)多了,你的應(yīng)用里面就會(huì)有多個(gè)baseactivity,這樣不好管理 代碼的可讀性也會(huì)變差
第二點(diǎn): 繼承是一種強(qiáng)耦合的方式,強(qiáng)耦合概念 請(qǐng)自行百度;
說到這,有個(gè)小提示(也是老套路了):優(yōu)秀的第三方庫(kù) 都是面向接口編程的, 如果是使用需要繼承才能實(shí)現(xiàn)的第三方庫(kù) 我們要謹(jǐn)慎的引用。

新方式的優(yōu)點(diǎn)
面向接口,多實(shí)現(xiàn),松耦合。

視頻扯淡地址

4、一個(gè)完整的BaseActivity在 new Way如何體現(xiàn)

有好多同學(xué)認(rèn)為我以偏概全,我并不認(rèn)同,我認(rèn)為這種是一種新的實(shí)現(xiàn)方式,從某種程度上來講選擇哪種方式看個(gè)人取舍。
一個(gè)完整的BaseActivity 大概如下:

public interface IActivity {
        void initView();
        void initListener();
        int  getLayoutId();
}

public abstract class BaseActivity extends AppCompatActivity implements IActivity {
    /**  是否禁止旋轉(zhuǎn)屏幕 */
    protected boolean isAllowScreenRoate=false;
    /** 是否允許全屏*/
    protected boolean mAllowFullScreen= true;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 一些系統(tǒng)配置
        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 我們會(huì)在里面做一些什么呢?

1、 通用的系統(tǒng)配置(狀態(tài)欄,全屏配置什么的)
2、方法拆分(onCreate拆成 initView、initListener等等)
3、業(yè)務(wù)初始化/銷毀動(dòng)作(推送、事件總線EventBus\otto什么的)
4、寫一些共用方法(比如跳轉(zhuǎn)方法);

大概總結(jié)起來應(yīng)該就做了上面這些事情; 其實(shí)放在application內(nèi)都好解決。

public class BaseSettings{
    /**  是否禁止旋轉(zhuǎn)屏幕 */
    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) {
                   // 一些系統(tǒng)配置
                   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();  
                  }
                  //各種業(yè)務(wù)初始化
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
                  //  各種業(yè)務(wù) 注銷、友盟、eventbus 注銷
            }
        });
    }
}

這樣就是一個(gè)完整的實(shí)現(xiàn)了 示例Base 中的功能了; 共用方法可以抽出來做成工具類的。


希望我的文章不會(huì)誤導(dǎo)在觀看的你,如果有異議的地方歡迎討論和指正。
如果能給觀看的你帶來收獲,那就是最好不過了。

人生得意須盡歡, 桃花塢里桃花庵
點(diǎn)個(gè)關(guān)注唄,對(duì),不信你點(diǎn)試試?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容