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