編輯:關於Android編程
常常,當我們需要用到服務的時候可以通果Context來獲取:Context.getSystemService(name);比如:當我們想知道當前電話狀態(來電/去電/sim卡狀態等)時候,我們可以通過Context來獲取TelephonyManager:
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
你可知道,為什麼可以通過Context來獲取各種服務嗎?下面來看看.
我們知道,Context的實現類其實是:ContextImpl,所以我們來看看ContextImpl有上面東西.通過代碼分析,會很快知道:在ContextImpl中通過工廠模式和單列模式在創建和保存各個服務對象的.比較復雜,所以下面一個一個的介紹:
(1)在ContextImpl中定義如下一個HashMap,
private static final HashMap
這是一個靜態的/final的HashMap,其中保存的是每一個服務的ServiceFetcher.其中,String標識當前服務名,ServiceFetcher是這個服務的工具類!其實就是用來創建該服務的對象.
當我們通過getSystemService(String name)來獲取這個服務時候,就是通過這個ServiceFetcher來得到我們需要的服務的:
public Object getSystemService(String name) { ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); return fetcher == null ? null : fetcher.getService(this); }如上代碼可知:其實是通過 ServiceFetcher的getService()來獲取的.
(2)所以我們重點來看看ServiceFetcher實現什麼功能,ServiceFetcher其實是一個簡單的工廠模式設計思路,並且還使用來單列模式! 當通過getService()來獲取服務對象的時候,首先判斷這個服務對象是否已經存在:如果已經存在,則立即返回,否則調用他的一個虛的方法createService()來創建,並保存創建的這個服務對象.隨意不同服務的ServiceFetcher實現了不同的創建對象的方法createService().這樣一來,就可以通過SYSTEM_SERVICE_MAP裡面各個服務的ServiceFetcher來獲取其對象了.
/*package*/ static class ServiceFetcher { int mContextCacheIndex = -1; /** * Main entrypoint; only override if you don't need caching. */ public Object getService(ContextImpl ctx) { ArrayList
在ContextImp中,有一段static的代碼塊,用於初始化所有服務的ServiceFetcher,並且加入SYSTEM_SERVICE_MAP裡面.
下面看看電源管理服務的初始化:
registerService(POWER_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(POWER_SERVICE); IPowerManager service = IPowerManager.Stub.asInterface(b); return new PowerManager(ctx.getOuterContext(), service, ctx.mMainThread.getHandler()); }});registerService其實是一個static的方法,其主要工作就是:SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
通過上面的分析,可以很好的了解工廠模式和單列模式的混合使用,這樣理解沒有問題嗎?說上面的設計模式為享元模式似乎更合適!當然,不夠我覺得不管上面設計模式其實都是一種名稱罷了!重要的是知道如何解決實際問題!其實我認為:享元模式就是等於工廠模式+單列模式+(或者還以有其他模式).其中要清楚的是,享元模式的重點在於:共享,不重復.其目的往往時為了解決:大量重復量級的對象使用.
對於Android事件分發機制,我們在開發的過程中,肯定曾經遇到在最外層添加了ScrollView之後ListView無法正常滑動、我們的圖片輪播在左右滑動圖片為什麼感覺
今天咱們看看android studio的jar打包,但是jar包裡面呢res文件是用不了的,那想用圖片文件怎麼辦呢,這裡可以把圖片文件放進assets文件裡面打進jar
網上demo的效果:差不多應該是這樣的,但是容易出一些問題,比如你的圖片本身就是個圓角?又或者圖片太大,你想縮小顯示,但出現顯示內容不全?我想實現的效果是這樣的:http
記得之前京東首頁有一個效果,有一個畫軸,然後可以滾動畫軸,去打開畫(不知道怎麼去形容這個效果,就叫做畫軸效果吧- -!),然後去做相關操作,剛開始看到這個效果,想法是動態