Как я могу создать службу Android, которую dalvik не убьет?

Прежде чем я начну свой вопрос, я хочу предварить его следующим: Я ЗНАЮ, ЧТО ЗАСТАВЛЯТЬ СЛУЖБУ ЗАПУСКАТЬ ВЕЧНУЮ ИДЕЮ ПЛОХАЯ... Мне просто все равно.

Это приложение не предназначено для использования потребителем. В магазине приложений его нет. Это только для моего использования.

Хорошо, у меня есть этот неиспользованный HTC Sensation под управлением 4.0.3 (ICS), и я добровольно отдал его в местный театр для выполнения задания. Задача состоит в том, чтобы он звонил по сигналу всякий раз, когда это необходимо в шоу. Нам не нужна сим-карта, потому что кто-то может случайно позвонить по телефону во время шоу, когда он не должен звонить.

Поэтому я создал поддельное телефонное приложение, которое получает сигнал через TCP с сервера, который я настроил для отправки сигналов на устройства по локальной сети. Прямо сейчас у меня есть слушатель, работающий в бесконечном цикле службы. Однако я все еще сталкиваюсь с тем, что служба не отвечает на сигналы TCP.

Я был бы очень признателен, если бы некоторые гуру Android могли дать мне несколько советов / советов, как сделать этот сервис максимально надежным, не говоря уже о хороших / плохих методах кодирования. Я хочу сделать все возможное, чтобы сделать этот сервис неубиваемым. У этого телефона сейчас только одна задача — всегда слушать входящие сообщения, несмотря ни на что.

Что я сделал до сих пор:

Создал службу (и запустил отдельный поток из этой службы). Использовал startForeground (id, уведомление); Активировал DeviceAdmin и создал пробуждение

что-нибудь еще, ребята, вы можете придумать?


person the_camino    schedule 29.05.2014    source источник
comment
stackoverflow .com/questions/3856767/ Но это не гарантировано? Android знает, что это не то, что нужно делать на потребительских устройствах, поэтому они на самом деле не поддерживают это.   -  person zgc7009    schedule 29.05.2014
comment
В настоящее время я использую startForeground(). Я надеялся на любые другие настройки, которые я могу использовать.   -  person the_camino    schedule 29.05.2014
comment
Почему это должна быть услуга? Для приложения поддельного телефонного звонка, которое нужно только обмануть людей в аудитории, подойдет действие, и вы можете оставить его работающим на переднем плане.   -  person x-code    schedule 30.05.2014
comment
@x-code — ваш комментарий немного обрезан, но, если догадаться, о чем вы спрашивали, это должна быть служба, потому что приложение нужно запускать удаленно в произвольное время в течение двухчасового шоу.   -  person the_camino    schedule 30.05.2014
comment
@user Извините, я толстым пальцем нажал кнопку публикации в середине предложения. Должно быть исправлено сейчас.   -  person x-code    schedule 30.05.2014


Ответы (3)


Первой идеей, которая приходит мне в голову, будет установка AlarmManager, который каждые 5 секунд проверяет, запущена ли служба. Это описывает способ проверки того, запущена ли служба< /а>. И если служба не запущена, вы можете просто перезапустить ее.

Использование этого метода и метода startForeground() может сработать.

С уважением

person LorToso    schedule 29.05.2014
comment
Это хорошая идея. Я могу проверить еще несколько вещей. Единственная проблема заключается в повторном установлении TCP-соединения, поскольку сервер не будет знать, что телефон отключился, и он может не ждать в методе socket.accept(). - person the_camino; 29.05.2014
comment
Является ли AlarmManager постоянным процессом? т. е. Могу ли я всегда рассчитывать на его запуск? - person the_camino; 29.05.2014
comment
Если я могу заставить это работать и постоянно проверять каждые 1 или 2 секунды. Затем, немного поработав с TCP-сервером (сделав его основанным на состоянии, а не постоянным), тогда AlarmManager должен создать прекрасную систему безопасности, спасибо. - person the_camino; 30.05.2014

Невозможно гарантировать, что Android никогда не убьет службу. Если вы сделаете его сервисом переднего плана, это уменьшит шансы, но вы не сможете его застраховать.

person Gabe Sechan    schedule 29.05.2014
comment
Я полагаю, что сделал это, вызвав метод startForeground() в методе onStart() моей службы. Если вы не имеете в виду что-то другое? - person the_camino; 29.05.2014

Основываясь на этой цитате из Service javadoc...

Другие компоненты приложения, работающие в том же процессе, что и служба (например, Activity), конечно, могут повысить важность всего процесса, помимо важности самой службы.

... если вы оставите действие, которое запускает вашу службу, на переднем плане, это в значительной степени гарантирует, что служба не будет остановлена ​​[я опубликовал комментарий, начавший предлагать эту идею, которая, возможно, была отрезана.]

Чтобы добавить еще один уровень надежности, включите блокировку пробуждения в своей деятельности, используя этот документ в качестве руководства: https://developer.android.com/reference/android/os/PowerManager.WakeLock.html

Пример кода:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
// ..screen will stay on during this section..
wl.release();
person x-code    schedule 29.05.2014
comment
Спасибо за это, я думаю, что оставлю это на переднем плане. Я новичок в Android, но я считаю, что активность остается на переднем плане даже после блокировки экрана, если нет доступа к другим действиям? - person the_camino; 30.05.2014
comment
Нет, это хороший момент, потому что экран блокировки становится активным на переднем плане, если устройство заблокировано. Вы можете предотвратить блокировку устройства, удерживая блокировку пробуждения. - person x-code; 30.05.2014