Прочитав большую часть доступной документации по сервисам 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, а не расширение службы, но, похоже, он лучше подходит для запуска задачи, а затем завершает работу.