拒絕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ù)我們會做一個(gè)BaseActivity 茵宪,用來抽離共性,封裝統(tǒng)一的操作瘦棋; 這也是封裝的優(yōu)點(diǎn)稀火, 比如像下面這樣,我們一般會在 onCreate()onDestory() 里面做功能初始化赌朋、注銷這樣一些動作窃这,比如:推送的注冊注銷忧风、友盟、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);
    }

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

那我們開始動工來實(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 推送的注冊愈诚、友盟去件、eventbus初始化
                 ActivityManager.getAppManager().addActivity(activity);
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
                  //  todo 推送的注銷、友盟扰路、eventbus 注銷
                  ActivityManager.getAppManager().finishActivity(activity);
            }
            //...
        });
    }
}

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

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

BaseAcitivty 局限性:
BaseActivity的優(yōu)點(diǎn)宫莱,那肯定不用說了,不然為啥幾乎多會有哩罪;
就說說局限吧 授霸,它的局限就在于繼承, 在java當(dāng) 單繼承际插、多實(shí)現(xiàn)碘耳,這句話很好理解,繼承只能單個(gè)框弛,和一個(gè)人不能有多個(gè)爸爸是一樣的(不可能隔壁老王和你法律上的爸爸同時(shí)是你親爸爸 -);
比如說:我們引用換膚框架辛辨,然而它有自己的BaseActiivty,必須要求繼承它的baseactivity,但并不似所有activity都需要換膚功能斗搞,那么你就需要在多寫一個(gè) Base2Actiivty 指攒,這樣的庫多了,你的應(yīng)用里面就會有多個(gè)baseactivity僻焚,這樣不好管理 代碼的可讀性也會變差
第二點(diǎn): 繼承是一種強(qiáng)耦合的方式允悦,強(qiáng)耦合概念 請自行百度;
說到這,有個(gè)小提示(也是老套路了):優(yōu)秀的第三方庫 都是面向接口編程的虑啤, 如果是使用需要繼承才能實(shí)現(xiàn)的第三方庫 我們要謹(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 我們會在里面做一些什么呢屡律?

1腌逢、 通用的系統(tǒng)配置(狀態(tài)欄,全屏配置什么的)
2超埋、方法拆分(onCreate拆成 initView搏讶、initListener等等)
3、業(yè)務(wù)初始化/銷毀動作(推送霍殴、事件總線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 中的功能了; 共用方法可以抽出來做成工具類的帽衙。


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

人生得意須盡歡, 桃花塢里桃花庵
點(diǎn)個(gè)關(guān)注唄榨崩,對,不信你點(diǎn)試試常侣?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弹渔,隨后出現(xiàn)的幾起案子胳施,更是在濱河造成了極大的恐慌,老刑警劉巖肢专,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞肆,死亡現(xiàn)場離奇詭異,居然都是意外死亡博杖,警方通過查閱死者的電腦和手機(jī)椿胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃根,“玉大人哩盲,你說我怎么就攤上這事”纷恚” “怎么了廉油?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苗傅。 經(jīng)常有香客問我抒线,道長,這世上最難降的妖魔是什么渣慕? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任嘶炭,我火速辦了婚禮,結(jié)果婚禮上逊桦,老公的妹妹穿的比我還像新娘眨猎。我一直安慰自己,他們只是感情好强经,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布宵呛。 她就那樣靜靜地躺著,像睡著了一般夕凝。 火紅的嫁衣襯著肌膚如雪宝穗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天码秉,我揣著相機(jī)與錄音逮矛,去河邊找鬼。 笑死转砖,一個(gè)胖子當(dāng)著我的面吹牛须鼎,可吹牛的內(nèi)容都是我干的鲸伴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼晋控,長吁一口氣:“原來是場噩夢啊……” “哼汞窗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赡译,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仲吏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝌焚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裹唆,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年只洒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许帐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毕谴,死狀恐怖成畦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涝开,我是刑警寧澤羡鸥,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站忠寻,受9級特大地震影響惧浴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奕剃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一衷旅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵朋,春花似錦柿顶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聂薪,卻和暖如春家乘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏澳。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工仁锯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔悠。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓业崖,卻偏偏與公主長得像野芒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子双炕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容