Передайте аргумент как Long
(обратите внимание на L
в конце номера):
start(600851475143L)
// ^
Во-первых, это onDestroy, а не OnDestroy. Во-вторых, вы должны использовать аннотацию @Override для проверки времени компиляции, поэтому ваш код службы должен выглядеть примерно так:
@Override
public void onDestroy(){
Log.v("SERVICE","Service killed");
player.stop();
super.onDestroy();
}
В моем случае я печатал журнал внутри onDestroy и не печатал журнал, и я думал, что onDestroy не вызывает, когда я вызываю stopService. но в студии Android много раз не печатает журнал, поэтому вы можете дважды проверить или проверить с помощью отладки или тоста.
Во-первых, вам нужно выяснить, сколько видов услуг в Android. AFAIK, есть:
Эти службы останавливаются по-разному.
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.
}
bindService()
и unbindService()
, вы обнаружите, что он полностью совпадает с starService()
и stopService()
ResultReceiver
для связи между сервисом и активностью или фрагментом. Это похоже на BroadcastReceiver
. Вы можете легко искать пример в Google. Подвести итоги: основываясь на цели, выберите тип обслуживания, который вам удовлетворит. И все они согласны с:
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" />
У меня была аналогичная проблема, даже с правильной настройкой onDestroy - ответ на который может быть полезен для людей, пришедших на эту страницу. Для меня onDestroy не вызывался сразу во время stopService, иногда очень долго - оставляя службу, выполняющую работу, когда она должна была прекратиться.
Ответ заключается в том, что это ожидаемое поведение - я могу догадаться, но надеть точно знать почему. Таким образом, мое решение в этом случае состояло в том, чтобы создать публичный статический метод, чтобы остановить действия службы вручную, что происходит в момент ее вызова, а затем stopService () вызовет onDestroy в свое собственное время ...
В случае для этого примера (который, вероятно, давно ушел, я, вероятно, решил бы, чтобы служба работала до тех пор, пока она не будет достаточно для приложения, но предоставит способы изменения аудиофайла, пока служба по-прежнему активна.