Как запустить многолетнюю фотовую задачу в службе 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.