Android: планирование перезапуска сбойного сервиса с ОГРОМНОЙ задержкой? - PullRequest
4 голосов
/ 08 ноября 2011

У меня запущена служба, которую ОС убивает - проблема в том, что когда она убивает ее и планирует перезапуск, она запланирована на перезапуск через час.Эта служба поддерживает два приемника для изменений соединения Bluetooth, поэтому мне нужно перезапускать намного быстрее, а не сидеть в состоянии «Перезапуск» более часа.

Вот отрывок из журнала:

I/ActivityManager( 1064): No longer want com.deadbeat.bta (pid 25455): hidden #17
W/ActivityManager( 1064): Scheduling restart of crashed service com.deadbeat.bta/com.deadbeat.btalib.BTService in 3600210ms`

По истечении этих 3600 секунд он просто убьет его и снова перенесет на 2 часа, и так далее.Когда это происходит, кажется, что onDestroy (), onCreate () и onStartCommand () не вызываются.Запуск основного действия успешно перезапустит службу, и все будет в порядке в течение нескольких часов, пока это не произойдет снова.

Это началось, когда я внес изменение, которое требует, чтобы я передал дополнительные функции при запуске службы,

Вот мои onStartCommand и onCreate, если это поможет ...

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("BTA", ">>> onStartCommand()");
    setIntent(intent);

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        setGlobals((Globals) extras.getSerializable("Globals"));
    }
    if (getGlobals() == null) {
        Log.e("BTA", "!!! Call an ambulance!!");
    }
    Log.i(getGlobals().getLogPrefix(), ">>> Service starting up");

    setWorker(new BTAWorker(this, getGlobals()));
    getWorker().doLog("Service Worker Set and Active");

    return START_REDELIVER_INTENT;
}

@Override
public void onCreate() {
    // Create
    super.onCreate();
    Log.d("BTA", ">>> onCreate()");
    // Register BroadcastReceiver with connect and disconnect actions
    IntentFilter intentToReceiveFilter = new IntentFilter();
    intentToReceiveFilter.addAction("android.bluetooth.device.action.ACL_CONNECTED");
    intentToReceiveFilter.addAction("android.bluetooth.device.action.ACL_DISCONNECTED");
    registerReceiver(this.mIntentReceiver, intentToReceiveFilter, null, this.mHandler);
    Log.d("BTA", ">>> Bluetooth State Receiver registered");
    Log.d("BTA", ">>> Intent = " + getIntent());
}

Буду очень признателен за любые советы относительно того, что я делаю неправильно.Я искал, но не нашел ничего похожего на эту долгую задержку перезапуска.Должна ли родительская активность быть активной, чтобы START_REDELIVER_INTENT работал?(Поэтому, когда моя основная деятельность очищена, я больше не могу перезапустить службу без повторного открытия основной операции?) Или что-то еще происходит?

1 Ответ

3 голосов
/ 28 июня 2012

Я был полностью в такой же ситуации. Время перезапуска было действительно огромным около 3M-9M мс.

Я много исследовал эту проблему и много раз обнаруживал, что startForeground может решить все. Но я не был удовлетворен этим решением.

В моей ситуации я использовал HandlerThread для обработки фоновых задач, и решение состояло в том, чтобы изменить приоритет этого потока THREAD_PRIORITY_BACKGROUND на значение по умолчанию. Раздражает то, что я нашел THREAD_PRIORITY_BACKGROUND в официальном примере сервиса.

onStartCommand по-прежнему не вызывается, но после того, как я переместил все в onCreate (onStartCommand просто возвращает START_STICKY), теперь все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...