2016-05-31 4 views
2

Я хочу реализовать Service, который действует как Singleton.Intent 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

a «Сервис» - это одноэлемент: вы не можете иметь два экземпляра одной и той же «Службы» – pskink

+0

Вы останавливаете и запускаете службу в onPause, onResume вашей активности? – Pablo

+0

@Pablo Нет, я создаю намерение «ScreenLockService» и начинаю его в onCreate из «Home» Activity. Затем, если экран заблокирован, я запускаю службу «Слушатель». – Ausche

ответ

2

Ну, основная идея реализации шаблонов Singleton заключается в создании частного конструктора [или защищенного] (что означает, что он не будет доступен извне класса). Класс также нуждается в частном поле собственного типа (например, private MyClass myObj;) Следующее, что вам нужно, это публичный статический метод, называемый как-то вроде newInstance(), который возвращает экземпляр класса через myObj, если он не является нулевым, и создайте его, если это:

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

Конечно, он может иметь более сложную реализацию (конструктор не должен иметь без параметров).

Теперь это всегда создаст ровно один экземпляр желаемого класса. Все, что вам нужно сделать, - всегда вызывать метод newInstance в том месте, где вам нужно использовать свой класс. Если он уже был создан, он даст вам старый экземпляр, если нет, он его создаст.

Надеюсь, это было объяснение, которое вы искали.

+0

В этом ответе объясняется, как реализовать синглтон java (обычно). Вопрос состоял в том, чтобы реализовать Android Servicies как singleton. – Pablo

+0

Наверное, так же, я не понимаю, почему это будет отличаться. – Vucko

+0

Как @pskink сказал, вы не можете иметь два экземпляра одного и того же сервиса. – Pablo

Смежные вопросы