Как запустить многолетнюю фотовую задачу в службе android
Прочитав большую часть доступной документации по сервисам Android на сайте разработчика, и здесь, в stackoverflow, я все еще смущен несколькими аспектами запуска службы в отдельной задаче. Надеюсь, кто-то может поставить меня на правильный путь.
Скажем, у нас есть инфраструктура trival service, такая как
public class HliService extends Service {
@Override
public void onCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
}
}
и в манифесте, я
<service android:name=".HliService" android:process=":HLI_Comms"/>
чтобы служба запускалась в своем потоке.
Целью службы является предоставление фоновой задачи, которая будет обмениваться данными
к устройству, использующему сокет TCP, и делать некоторые другие вещи. Рискуя игнорировать проблемы с батареями и т.д., В основном я бы хотел, чтобы он работал вечно.
Что-то вроде
// Method that communicates using a TCP socket, and needs to send
// information back to the activity and receive messages from activity
// not shown here.
private void dummytask() {
boolean keepGoing = true;
while (keepGoing) {
// do useful stuff in here
// sets keepGoing false at some point
}
stopSelf();
}
Каков наилучший способ инициировать этот метод/задачу?
Я просмотрел код на сайте разработчика, который использует обработчик сообщений и петлеукладчик, который я только частично понимаю, но он кажется очень сложным и, возможно, больше, чем я требую?
Я не верю, что могу вызвать этот метод из onCreate()
или onStartCommand()
, так как тогда не будет завершено при вызове из системы? Должен ли я запускать его с помощью таймера или тревоги?
Мне нужно будет добавить обработчик сообщений для связи с активностью gui, но поскольку я запускаю службу в другом потоке (в силу инструкции манифеста "process" ), мне нужно использовать AIDL вместо этого?
Я также рассматривал использование AysnchTask, а не расширение службы, но, похоже, он лучше подходит для запуска задачи, а затем завершает работу.
Ответы
Ответ 1
чтобы служба запускалась в своем потоке.
Это ставит службу в свой процесс. Этого обычно можно избежать, поскольку он потребляет дополнительную оперативную память и процессор (для IPC). Вы можете создать поток, просто создав Thread
или любое количество других средств, большинство из которых были на Java в течение десятилетия или около того.
Рискуя игнорировать проблемы с батареями и т.д., в основном я бы хотел, чтобы он работал вечно.
Практически невозможно запустить службу навсегда. Пользователи или ОС в конечном итоге избавятся от вашего сервиса.
Каков наилучший способ инициировать этот метод/задачу?
Вызовите dummytask()
из фонового потока.
Нужно ли вместо этого использовать AIDL?
Нет. Ваш сервис может транслировать Intent
или вызывать a PendingIntent
, предоставленные активностью, или отправить Message
через Messenger
, предоставленный активностью, и т.д. Лучше всего использовать LocalBroadcastManager
из Android Support, но это не будет работать через границы процесса, что приведет вас к более дорогостоящим параметрам связи.
Ответ 2
Я думаю, вы можете использовать IntentService
, который вы запускаете, настроив (регулярный) сигнал тревоги (AlarmManager.setRepeating
) с помощью PendingIntent
в нем. Вы можете уведомить пользовательский интерфейс, передав Intent из IntentService
и получив его в своем интерфейсе через BroadcastReceiver
.