給大家分享一下 ? 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)棧出棧等等這些事情。
抽離共性,封裝操作。

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)在觀看的你,如果有異議的地方歡迎討論和指正。
如果能給觀看的你帶來收獲,那就是最好不過了。