最近公司接了一個專案
因為資料內容不能隨便給能看見
於是就要求了類似LINE的螢幕鎖
像這樣
這時我第一個想到的是 : 用activity life cycle 來做操作
於是我就在每個可能會鎖到的activity,fragment 都加入一個共通的boolean 來做判斷
這時發現只用onResume跟onStop還不夠,還要從onCreate跟onActivityResult來下手才行
到最後成功了!!
可是程式碼醜到不行......萬一加了新的activity還要加入一堆判斷
我根本就違反了 Single responsibility principle (SOLID),
維護也變得相當困難,下一個看你程式碼的人根本不知道你在幹嘛
然後我就想到了otto ,只要regist,其他完全不用理它是怎麼實做的
所以我今天就做出了一個 screenLocker 來達到隱藏實做細節的目的
這演算法的概念大概是這樣:
使用stack來監控目前activity task的狀態
我把它命名為taskStack
每次執行到onResume就檢查一次,
依據目前的taskStack狀態來決定要不要鎖螢幕
(如果taskStack沒改變的話就鎖)
結束了!!就這樣!!
概念不難但是還是花了我不少時間
只要在每個要使用的activity加上
@Override
public void onResume()
{
super.onResume();
screenLocker.regist(this);
}
就可以用了,跟之前的實現方法根本天差地遠
程式碼看不懂嗎??
放心,我明天來看也會看不懂
最近讀了Clean code
受了他的影響
只要程式邏輯不是很直觀我就馬上改
改到到有點瘋狂....
以下是refactoring過後的程式碼
沒有留言:
張貼留言