Обработчик postdelayed не запускается после заданного интервала задержки при выходе из приложения в Android?

Фрагмент кода:

Handler handler= new Handler();
handler.postDelayed(networkRunnable,
                10000);

/**
 * A runnable will be called after the 10 second interval
 */
Runnable networkRunnable= new Runnable() {
    @Override
    public void run() {
        //Not fired if I quit the app before 10 seconds after 1 second. 
    }
};

Установка сообщения обработчика с задержкой для срабатывания через 10 секунд. Если я выйду из приложения в промежутке от 1 до 10 секунд, метод запуска никогда не будет вызываться.

Пожалуйста помоги мне с этим.

Заранее спасибо.


person M Vignesh    schedule 23.05.2015    source источник


Ответы (2)


Среда выполнения Android агрессивно управляет жизненным циклом процесса, уничтожая процессы по мере закрытия их точек входа (например, когда завершается последнее действие). Сказав это, я не знаю ни одной среды выполнения, в которой приведенный выше код надежно выполнял бы обратный вызов без дополнительной логики.

Если вы хотите, чтобы вызов срабатывал наверняка, вам необходимо зарегистрировать службу в ядре Android и использовать обработчик потока службы, чтобы запланировать вызов. Android (обычно) будет поддерживать работу службы, и ваш вызов будет запущен позже. Затем вы также должны отменить регистрацию службы в вызове, чтобы освободить системные ресурсы.

person Mark McKenna    schedule 23.05.2015
comment
Проверил, запустив службу намерений с моего приемника сигнализации. Это также не работает, потому что я настраиваю задержку сообщения обработчика 15 и 10 секунд и все такое. Так перед тем, как к этому умыслу звонил сервис. Так что насчет того, чтобы попробовать сервисы Android. - person M Vignesh; 23.05.2015
comment
@MVignesh Я не уверен, что понимаю, о чем ты говоришь. Вы запускаете службу в ответ на сигнал тревоги, который удерживает 10-секундный вызов, а вызов все еще не срабатывает? - person Mark McKenna; 23.05.2015
comment
Внутри приемника тревог я собираюсь запустить службу. Сервисный код с обработчиком 10-секундной задержки публикации. Чем хорошо? - person M Vignesh; 23.05.2015
comment
И что будет, звоня в один и тот же сервис снова и снова сразу. - person M Vignesh; 23.05.2015
comment
Используйте шаблон Singleton для своей службы — сначала убедитесь, что вы получили дескриптор службы, и создайте экземпляр службы только в том случае, если дескриптор еще не заполнен. Следите за тем, сколько у вас есть невыполненных вызовов, и закрывайте службу только после того, как этот счетчик обнулится. Наконец, вам нужен блок синхронизации, который гарантирует, что никакие вызовы вашей службы не могут произойти, пока счетчик обслуживается, то есть счетчик не возвращается к ненулевому значению после того, как он достиг нуля, и никакие вызовы не перехватывают умирающий счетчик. экземпляр службы. Получить это право непросто. - person Mark McKenna; 24.05.2015
comment
Спасибо за ответ. Я реализовал это в отдельном сервисе. - person M Vignesh; 27.05.2015

Чтобы добиться этого, я использовал AlarmManager вместо обработчика, теперь он работает, это выдержка из кода, который я использую:

@Override   
protected void onHandleIntent(Intent intent) {
    Log.d(Constants.TAG, "onHandleIntent");
    ...
    restartService();
    Log.d(Constants.TAG, "finish");   
}

private void restartService() {
   AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   Intent queryIntent = new Intent(context, ServiceClass.class);
   PendingIntent pendingQueryIntent = PendingIntent.getService(context, 0, queryIntent,
    PendingIntent.FLAG_UPDATE_CURRENT);
    // schedule the intent for future delivery
    alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + Constants.RESTART_TIME, pendingQueryIntent);
}

Таким образом, я могу перезапустить службу независимо от того, закрывает ли пользователь приложение, используя домашнюю страницу, назад или пролистывая последние приложения, единственный способ, которым он перестает работать, - это если использование заставляет приложение остановиться.

Надеюсь, поможет

person JavierSP1209    schedule 20.11.2015