stopService () не вызывает onDestroy [duplicate]

Передайте аргумент как Long (обратите внимание на L в конце номера):

start(600851475143L)
               // ^
8
задан Primož Kralj 31 January 2012 в 22:22
поделиться

4 ответа

Во-первых, это onDestroy, а не OnDestroy. Во-вторых, вы должны использовать аннотацию @Override для проверки времени компиляции, поэтому ваш код службы должен выглядеть примерно так:

@Override
public void onDestroy(){
    Log.v("SERVICE","Service killed");
    player.stop();
    super.onDestroy();  
}
15
ответ дан Mayjak 27 August 2018 в 04:22
поделиться

В моем случае я печатал журнал внутри onDestroy и не печатал журнал, и я думал, что onDestroy не вызывает, когда я вызываю stopService. но в студии Android много раз не печатает журнал, поэтому вы можете дважды проверить или проверить с помощью отладки или тоста.

0
ответ дан anoopbryan2 27 August 2018 в 04:22
поделиться

Во-первых, вам нужно выяснить, сколько видов услуг в Android. AFAIK, есть:

  • Служба переднего плана.
  • Фоновая служба.
  • Связанная служба.
  • Intent service.

Эти службы останавливаются по-разному.

  • Foreground: останавливайтесь, когда вы намеренно останавливаете его, вызывая stopService() в действии или фрагменте, где вы запускаете эту службу, или позвоните stopItself() в свою собственную службу. И обратите внимание только на этот метод триггера службы onDestroy().
  • Фон: stopService() и stopItself() делают так же, как и переднего плана. Кроме того, вы должны знать, что эта служба находится в том же потоке с активностью или фрагментом, вызывающим ее, поэтому, если вы уничтожаете активность или фрагмент, эта служба также остановится, но без вызова onDestroy(). Это в основном разрушает подполье. Таким образом, если вы хотите поймать, когда эта остановка службы, вам нужно добавить android:stopWithTask="false" при объявлении службы в файле манифеста следующим образом:
    <application>
        //....
        <service android:name=".services.catchingStopService" 
             android:stopWithTask="false" /> 
        //....
    </application>
    
    И теперь в вашем классе обслуживания вы можете переопределить этот метод, который срабатывает, когда эта служба перестает:
    @Override 
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent); 
        // Your job when the service stops. 
    }
    
  • Bound: вам нужно обрабатывать себя через bindService() и unbindService(), вы обнаружите, что он полностью совпадает с starService() и stopService()
  • Цель: этот тип обслуживания останавливается сам по себе, когда он заканчивает работу. И вы можете использовать ResultReceiver для связи между сервисом и активностью или фрагментом. Это похоже на BroadcastReceiver. Вы можете легко искать пример в Google.

Подвести итоги: основываясь на цели, выберите тип обслуживания, который вам удовлетворит. И все они согласны с:

  • Не рассчитывайте onDestroy () знать, когда сервис прекращается, потому что иногда его называют под землей; более точно, onDestroy вызывает, когда stopService () или stopItSelf () вызывает (BoundService работает так же, как мне кажется, но с помощью аналогичного метода, возможно, unBind (), я еще не тестировал).
  • Использовать атрибут android: stopWithTask = "false", а не знать, когда служба действительно останавливается.
  • Все виды обслуживания прекращаются, когда выключение устройства или ОС убивает его, если утечка памяти в памяти.
  • Вы также должны взглянуть на возврат флага на onStartCommand(), чтобы иметь возможность справиться с тем, когда службы перестают работать как перезапуск или что-то еще. Вот несколько ключевых слов, которые вы можете найти: START_STICKY <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.ACTION_SHUTDOWN" /> <actionandroid:name="android.intent.action.QUICKBOOT_POWEROFF" />
2
ответ дан Florescu Cătălin 27 August 2018 в 04:22
поделиться

У меня была аналогичная проблема, даже с правильной настройкой onDestroy - ответ на который может быть полезен для людей, пришедших на эту страницу. Для меня onDestroy не вызывался сразу во время stopService, иногда очень долго - оставляя службу, выполняющую работу, когда она должна была прекратиться.

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

В случае для этого примера (который, вероятно, давно ушел, я, вероятно, решил бы, чтобы служба работала до тех пор, пока она не будет достаточно для приложения, но предоставит способы изменения аудиофайла, пока служба по-прежнему активна.

6
ответ дан james_alvarez 27 August 2018 в 04:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: