Как запустить длительную фоновую задачу в сервисе Android

Прочитав большую часть доступной документации по сервисам Android на сайте разработчика и здесь, в stackoverflow, меня все еще смущают несколько аспектов запуска сервиса в отдельной задаче. Надеюсь, кто-то может поставить меня на правильный путь.

Допустим, у нас есть тривиальная структура службы, такая как

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(), так как тогда ни один из них не завершится при вызове из системы? Должен ли я запускать его с таймером или будильником?

Мне потребуется добавить обработчик сообщений для связи с действием графического интерфейса, но, поскольку я запускаю службу в другом потоке (на основании инструкции «процесса» в манифесте), нужно ли вместо этого использовать AIDL?

Я также рассматривал возможность использования AysnchTask вместо расширения Service, но мне кажется, что он больше подходит для запуска задачи с последующим ее завершением.

7
задан madth3 16 March 2013 в 17:25
поделиться