給大家分享一下 ? 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)棧出棧等等這些事情。
抽離共性埠巨,封裝操作。
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)在觀看的你菜皂,如果有異議的地方歡迎討論和指正。
如果能給觀看的你帶來收獲厉萝,那就是最好不過了恍飘。