- 關(guān)鍵字:通用、高效
- Key Word:Universal发侵、Effective
- 本文中提到的“高效”,不特指運(yùn)行時(shí)執(zhí)行效率高妆偏,偏向于開發(fā)階段時(shí)調(diào)用方便刃鳄。
一、設(shè)計(jì)目標(biāo)和主要突破點(diǎn)
設(shè)計(jì)目標(biāo)就是造輪子钱骂,但不是在別人造好輪子后的重復(fù)勞動(dòng)叔锐,而是把造好的輪子加工成自己的輪子,使其同時(shí)具備通用和高效的特點(diǎn)见秽。
從另一方面講愉烙,通用和高效常常是互相矛盾的兩個(gè)指標(biāo)。高效的往往是專用的解取,而通用的往往會(huì)犧牲效率步责,就像嬰兒爽身粉比普通爽身粉更適合涂在寶寶的皮膚上,而嬰兒爽身粉也只有涂在寶寶的皮膚上時(shí)才能充分體現(xiàn)它的優(yōu)勢(shì)一樣禀苦。誠(chéng)然蔓肯,想做出一款所有膚質(zhì)上效果都最優(yōu)的爽身粉難度很大,但我們的題目是“多個(gè)產(chǎn)品”振乏,不是“所有產(chǎn)品”∈『耍現(xiàn)在大廠的產(chǎn)品都是成系列的,比如螞蟻金服的產(chǎn)品如口碑外賣可以嵌套在支付寶內(nèi)也可以單獨(dú)成為一個(gè)產(chǎn)品昆码,再比如嵌套在美團(tuán)APP內(nèi)的美團(tuán)外賣也可以單獨(dú)成為一個(gè)產(chǎn)品气忠。能做出一款適合且僅適合指定系列產(chǎn)品的輪子邻储,是現(xiàn)階段的最佳選擇。
二旧噪、功能分析和關(guān)鍵拔高點(diǎn)
從設(shè)計(jì)目標(biāo)的選擇中我們可以發(fā)現(xiàn)吨娜,本文之所以能提高輪子的效率,本質(zhì)是因?yàn)閷?duì)其適用范圍做了調(diào)整淘钟,專注應(yīng)用場(chǎng)景中會(huì)出現(xiàn)的情況宦赠,摒棄實(shí)際開發(fā)中不會(huì)遇到的條件。所以米母,我們可以通過(guò)細(xì)化適用范圍的方式進(jìn)一步提高輪子的使用效率勾扭。
public static void sendBroadcast(Context context, String action, Bundle bundle) {
Intent intent = new Intent();
intent.setAction(action);
intent.putExtras(bundle);
context.sendBroadcast(intent);
}
以Android中發(fā)送普通廣播為例,影響該功能適用范圍的關(guān)鍵點(diǎn)在三個(gè)參數(shù)(context/action/bundle)上铁瞒。context確定了廣播發(fā)送者所在的進(jìn)程妙色,action確定了廣播接收者的過(guò)濾條件,bundle確定了廣播附帶的參數(shù)慧耍。發(fā)出廣播的context可以是Application也可以是Activity身辨,而整個(gè)項(xiàng)目所在的進(jìn)程是唯一確認(rèn)的,我們可以將項(xiàng)目中發(fā)送廣播的邏輯統(tǒng)一改成由Application作為context發(fā)出芍碧,這樣在發(fā)送廣播的地方就只需要關(guān)注兩個(gè)參數(shù)即可(context/action/bundle)煌珊,顯然需要關(guān)注的參數(shù)越少,項(xiàng)目開發(fā)階段出現(xiàn)問(wèn)題的概率就會(huì)越小泌豆。
public static void sendBroadcast(String action, Bundle bundle) {
Intent intent = new Intent();
intent.setAction(action);
intent.putExtras(bundle);
MyApplication.getInstance().sendBroadcast(intent);
}
- 少年定庵,你還記得把context傳進(jìn)網(wǎng)絡(luò)模塊、傳進(jìn)數(shù)據(jù)模塊踪危、傳進(jìn)控制模塊洗贰,最后引發(fā)內(nèi)存泄漏的恐懼么?
當(dāng)然陨倡,我們可以繼續(xù)對(duì)參數(shù)的適用范圍進(jìn)行分級(jí)敛滋,如果廣播的action是根據(jù)頁(yè)面進(jìn)行劃分的,例如支付頁(yè)發(fā)出的廣播統(tǒng)一以ACTION_PAY為action兴革,那么我們?cè)诎l(fā)送支付相關(guān)的廣播時(shí)就可以進(jìn)一步節(jié)省一個(gè)參數(shù)(context/action/bundle)绎晃。不過(guò)從實(shí)際的代碼開發(fā)總結(jié)的經(jīng)驗(yàn)中可以發(fā)現(xiàn),將action作為統(tǒng)一參數(shù)進(jìn)行封裝的收益并不明顯杂曲,如果以實(shí)用價(jià)值高為標(biāo)準(zhǔn)的話庶艾,建議細(xì)分到context層即可。
public static void sendBroadcast(Bundle bundle) {
Intent intent = new Intent();
intent.setAction(ACTION_PAY);
intent.putExtras(bundle);
MyApplication.getInstance().sendBroadcast(intent);
}
三擎勘、代碼實(shí)現(xiàn)和最終得分點(diǎn)
上文以Android中發(fā)送普通廣播功能為例子提出了通過(guò)細(xì)化參數(shù)適用范圍來(lái)提高功能庫(kù)使用效率的技巧咱揍,但技巧始終只是技巧,沒(méi)有足夠扎實(shí)的功底終究是做不出完美的功能庫(kù)的棚饵∶喝梗基本功就靠大家積年累月的工作經(jīng)驗(yàn)吧掩完,以下是本文示例中涉及到的部分代碼。
public class MyApplication extends Application {
private static Application instance = new Application();
/**
* 允許從Application中統(tǒng)一獲取context硼砰。
*/
public static Application getInstance() {
return instance;
}
}
public class Tools {
/**
* 普通方式發(fā)送廣播且蓬,需要傳入三個(gè)參數(shù),當(dāng)需要從網(wǎng)絡(luò)模塊/數(shù)據(jù)模塊/控制模塊等context
* 概念較弱的模塊中發(fā)出廣播時(shí)题翰,需要將context一路傳進(jìn)去恶阴,此時(shí)發(fā)生內(nèi)存泄漏的風(fēng)險(xiǎn)很大。
*/
public static void sendBroadcast(Context context, String action, Bundle bundle) {
Intent intent = new Intent();
intent.setAction(action);
intent.putExtras(bundle);
context.sendBroadcast(intent);
}
/**
* context統(tǒng)一從Application中獲取豹障,用完即釋放冯事,不用考慮內(nèi)存泄漏的問(wèn)題。
*/
public static void sendBroadcast(String action, Bundle bundle) {
Intent intent = new Intent();
intent.setAction(action);
intent.putExtras(bundle);
MyApplication.getInstance().sendBroadcast(intent);
}
}
public class PayActivity extends AppCompatActivity {
private static String ACTION_PAY = "ACTION_PAY";
/**
* context和action都用統(tǒng)一的方式獲取血公,但應(yīng)用面太窄昵仅,按個(gè)人喜好可以嘗試,不推薦坞笙。
*/
public static void sendBroadcast(Bundle bundle) {
Intent intent = new Intent();
intent.setAction(ACTION_PAY);
intent.putExtras(bundle);
MyApplication.getInstance().sendBroadcast(intent);
}
}