2014年8月30日 星期六

Android - 模擬LINE螢幕鎖功能

前言...............

最近公司接了一個專案

因為資料內容不能隨便給能看見

於是就要求了類似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過後的程式碼


沒有留言:

張貼留言