Я использовал диспетчер аварийных сигналов, чтобы пользователь мог планировать выполнение определенной задачи за определенное время. В контексте приложения у меня есть игра для Android, в которой люди могут планировать, когда отправлять свои корабли. Менеджер сигнализации работает нормально, сигнализация получить стартовало в нужное время и т.д.Использование службы Intent в сочетании с диспетчером аварийных сигналов
Что происходит, когда сигнал тревоги выпалил (обычно каждый час и немного), является то, что мой IntentService начнет связь с сервером отправлять корабли. Это действие может занять 1 минуту, но это может продолжаться до 10 минут. Даже все это прекрасно работает. Сигнализации увольняются, корабли отправляются, все счастливы. Проблема возникает ночью, я ложись спать и ожидаю, когда проснусь, что мои корабли отправлены всю ночь напролет. Неа. Журналы & показывают, что аварийные сигналы запускаются правильно, но кажется, что IntentService убит, когда он общается с сервером.
Возможная причина этого заключается в том, что я не смотрю на игру каждый раз в то время, как я, когда я просыпаюсь, и тем самым сохранить некоторую форму процесса бега, который предотвращает IntentService от сборщиком мусора ,
Я уже пробовал много вещей, чтобы исправить это. Раньше я работал с BroadCastReceiver, я использовал для создания ASyncTasks в IntentService, но с тех пор я обновил свой код, чтобы больше не использовать эти вещи, поскольку они являются плохой практикой для Сервисов.
Я также проверял этот ресурс: http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html, но я все еще не уверен, что то, что я делаю, является правильной вещью, чтобы справиться с этой ситуацией. Я поместил некоторые обширные регистрации на следующую ночь, чтобы рассмотреть утром, но я бы хотел, чтобы вы, ребята, высказались по этому поводу.
О, я также с просьбой о WakeLock для полной продолжительности функции onHandleIntent с помощью:
PowerManager pm = (PowerManager) c.getSystemService(Context.POWER_SERVICE);
this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "MyApplicationWakeLock");
Мой IntentService:
public class ScheduledRequestService extends IntentService {
public ScheduledRequestService() {
super("ScheduledRequestService");
}
@Override
public int onStartCommand(Intent intent, int flags, int startID){
Logger.d("OnStartCommand!");
return super.onStartCommand(intent, flags, startID);
}
@Override
protected void onHandleIntent(Intent intent) {
ScheduledRequest request = (ScheduledRequest) intent.getExtras().getSerializable("request");
// This function will start a lot of client <-> server communication
request.onExecute(this, intent);
}
@Override
public void onDestroy(){
Logger.d("OnDestroy!");
super.onDestroy();
}
}
Так опять же, мой вопрос; Я правильно структурирую это? Должен ли я использовать обычный Сервис вместо IntentService? Может ли мой IntentService получить сбор мусора, пока он обрабатывает Intent (я думаю, что я читал, что это возможно)?
Если мой IntentService не может быть собран в мусор, когда он обрабатывает намерение, он должен быть чем-то другим, что мешает Intent правильно выполнять всю свою работу. Что означает сигнализация «_WAKEUP»? Я попробую сделать его передним планом, посмотрим, что это делает. Спасибо за предложение. – Wotuu
@Wotuu: Как я уже писал, ваш процесс может быть прекращен. – CommonsWare
Все может быть убито, за исключением запущенных служб, если процесс завершен, а мои службы будут прекращены, поэтому мне нужно как-то предотвратить это. – Wotuu