2016-05-31 76 views
2

我想實現一個Service,其行爲像一個Singleton意向服務單例

我需要我的應用程序來檢查屏幕是否鎖定,然後啓動ListenerIntentService。如果屏幕解鎖,它將終止Listener服務。 我創建了一個ScreenLockService,這是一個IntentService,如果用戶選中了開/關框,則會被Home活動調用,因爲即使應用程序未運行,我也要運行Listener

因此,Home活動運行並停止ScreenLockService服務,該服務將運行並停止Listener服務。

我的問題是,HomeActivity創建ScreenLockService多個實例,它也創建Listener的多個實例。

所以,我想這兩個IntentServices作爲Singletons運行,但我不知道如何這樣做。

我已經簽出了一堆教程,但他們要麼過時或不適合IntentServices如: http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/ Singleton in Android

我可以張貼的我有什麼必要時一些示例代碼,但我真正想要的只是一個方法。

+4

一個'Service'是一個單例:你不能有兩個同一個'Service'的實例 – pskink

+0

你是否在onPause,onResume的活動中停止和啓動服務? – Pablo

+0

@Pablo不,我創建'ScreenLockService'意圖,並在'Home'活動的onCreate中啓動它。然後,如果屏幕被鎖定,我開始「偵聽器」服務。 – Ausche

回答

2

那麼實現Singleton模式的基本思想是創建一個私有的[或protected]構造函數(這意味着它不能從類之外訪問)。該類還需要它自己的類型的私有字段(例如private MyClass myObj;)。接下來,您需要的是公共靜態方法,如newInstance(),它通過myObj返回類的實例,如果它不爲null,則實例化該實例:

public static MyClass newInstance(){ 
    if (myObj == null) { 
     myObj = new MyClass(); 
    } 
return myObj; 
} 

當然,它可以有一個更復雜的實現(構造函數不必沒有參數)。

現在,這將始終創建所需類的一個實例。您需要做的就是始終在您需要使用班級的地方撥打方法newInstance。如果它已經實例化,它會給你舊的實例,如果沒有,它會創建它。

希望這是你正在尋找的解釋。

+0

這個答案解釋瞭如何實現一個Java單例(通常)。問題是關於實施Android Servicies作爲單身人士。 – Pablo

+0

也許以同樣的方式,我不明白爲什麼它會有所不同。 – Vucko

+0

就像@pskink所說的,你不能有兩個相同服務的實例。 – Pablo