Android: stopService () не вызывает onDestroy ()! - PullRequest
10 голосов
/ 01 февраля 2012

У меня большие проблемы с остановкой службы, которая воспроизводит аудиофайл. Я хочу остановить текущую службу перед воспроизведением другого файла.

Активность:

public void playTrack(View view){       
    Intent i=new Intent(this,playService.class);
    i.setAction("com.c0dehunterstudios.relaxer.PLAY");

    if(isPlaying){ 
          stopService(i);   
          isPlaying=false;
          Log.v("ACTIVITY", "Stopping..");
    }

    startService(i);
    isPlaying=true;
}

Услуги:

public void OnDestroy(){
    Log.v("SERVICE","Service killed");
    player.stop();
    super.onDestroy();  
}

Но, к сожалению, это не работает - на самом деле это даже не сводится к «Службе убито» внутри OnDestroy ().

Что я делаю не так?

Ответы [ 4 ]

14 голосов
/ 01 февраля 2012

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

@Override
public void onDestroy(){
    Log.v("SERVICE","Service killed");
    player.stop();
    super.onDestroy();  
}
8 голосов
/ 20 февраля 2015

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

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

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

3 голосов
/ 21 сентября 2017

Для начала нужно уточнить, сколько видов сервисов в Android.AFAIK, есть:

  • Передний план обслуживания.
  • Фоновый сервис.
  • Связанный сервис.
  • Служба намерений.

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

  • Передний план: остановка только в том случае, если вы намеренно остановили ее, вызвав stopService() в действииили фрагмент, где вы запускаете эту службу или звоните stopSelf() в ее собственную службу.И обратите внимание, только эти триггерные методы службы onDestroy().
  • Фон: stopService() и stopSelf() делают так же, как и передний план.Более того, вы должны знать, что эта служба находится в том же потоке, что и активность или фрагмент, вызывающий ее, поэтому, если вы уничтожите активность или фрагмент, эта служба также остановится, но без вызова 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. 
    }
    
  • Связано: вам нужно справиться с самим собой на bindService() и unbindService(), вы обнаружите, что оно полностью совпадает с starService()и stopService()

  • Намерение: этот тип службы останавливается сам по себе, когда завершает свою работу.И вы можете использовать ResultReceiver для связи между службой и деятельностью или фрагментом.Это похоже на BroadcastReceiver.Вы можете легко найти, например, в Google.

Суммируйте: исходя из ваших целей, выберите тип услуги, которая вас устраивает.И все они согласны с:

  • Не рассчитывайте, что onDestroy () узнает, когда служба останавливается, потому что иногда ее вызывают из-под земли;точнее, вызовы onDestroy при вызовах stopService () или stopSelf () (я думаю, 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" />
0 голосов
/ 06 апреля 2018

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

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