Вызовы к службам HTTPS с одного из наших серверов также бросали сообщение «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто». Однако HTTP-сервис работал нормально. Использовал Wireshark, чтобы убедиться, что это был отказ от подтверждения TLS. Закончилось то, что набор шифров на сервере необходимо обновить.
Если вы хотите играть только фоновую музыку только для своего приложения, тогда воспроизведите ее в потоке, запущенном из вашего приложения / используйте класс AsyncTask, чтобы сделать это для вас.
Концепция служб заключается в том, чтобы запускать фон; По умолчанию, значение обычно происходит, когда пользовательский интерфейс приложения НЕ ВИДИМО. Правда, его можно использовать так же, как и у вас (если вы его остановите), но он просто не прав, и он потребляет ресурсы, которые вы не должны использовать.
Если вы хотите выполнять задачи на фоном вашей активности, используйте AsyncTask.
Кстати, onStart
устарел. Когда вы используете сервисы, реализуйте onStartCommand
.
UPDATE:
Я думаю, этот код будет работать для вас. Добавьте этот класс (включен в ваш класс активности).
public class BackgroundSound extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr);
player.setLooping(true); // Set looping
player.setVolume(1.0f, 1.0f);
player.start();
return null;
}
}
Теперь, чтобы управлять музыкой, сохраните объект BackgroundSound, а не создавайте его анонимно. Объявите его как поле в своей деятельности:
BackgroundSound mBackgroundSound = new BackgroundSound();
В методе onResume вашей деятельности запустите его:
public void onResume() {
super.onResume();
mBackgroundSound.execute(null);
}
И в методе onPause вашей активности остановите его:
public void onPause() {
super.onPause();
mBackgroundSound.cancel(true);
}
Это будет работать.
AsyncTasks хороши только для очень коротких клипов, но если это музыкальный файл, вы столкнетесь с такими проблемами, как:
Здесь немного строк на странице разработчиков Android о AsyncTasks
AsyncTasks в идеале следует использовать для коротких операций (несколько в секундах.) Если вам нужно поддерживать потоки, работающие в течение длительных периодов времени, настоятельно рекомендуется использовать различные API, предоставляемые пакетом java.util.concurrent, такие как Executor, ThreadPoolExecutor и FutureTask.
< / blockquote>Итак, в настоящее время я просматриваю другие параметры и обновляю ответ, как только найду решение.
(Kotlin) К сожалению Ответ Jong не работал для меня, у меня было несколько ошибок, включая: MediaPlayer finalized without being released
и задержку в остановке и запуске звука. Поэтому я опубликую способ, которым я это сделал, на всякий случай, если у кого-то другая проблема. Моя реализация BackgroundSound
по-прежнему использует AsyncTask и MediaPlayer , однако это не вложенный класс.
class BackgroundSound : AsyncTask<Context, Void?, Void?>() {
override fun doInBackground(vararg params: Context): Void? {
val player = MediaPlayer.create(params[0], R.raw.msc_background)
player.isLooping = true
player.start()
while (!isCancelled) {
}
player.stop()
player.release()
return null
}
}
Вы можете использовать этот класс в своей Activity так:
private var backgroundSound: BackgroundSound? = null
override fun onResume() {
super.onResume()
backgroundSound = BackgroundSound()
backgroundSound!!.execute(this)
}
override fun onPause() {
backgroundSound?.cancel(true)
super.onPause()
}
Попробуйте вставить player.stop () в метод onDestroy (). Это должно помочь.
Попробуйте выполнить остановку фоновой музыки в HOME или BACK.
@Override
protected void onStop() {
super.onStop();
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager
.getRunningTasks(Integer.MAX_VALUE);
boolean isActivityFound = false;
if (services.get(0).topActivity.getPackageName().toString()
.equalsIgnoreCase(getPackageName().toString())) {
isActivityFound = true; // Activity belongs to your app is in foreground.
}
if (!isActivityFound) {
if (player != null && player.isPlaying()) {
player.release();
}
}
}
да, u должен остановить службу, когда u нажмите кнопку «домой». В методе переопределения OnPause () {} u должен остановить музыкальную службу. И внутри службы в методе OnDestroy () u остановите медиаплеер. Итак, теперь нажатие домашних вызовов onPause и onPause () -> останавливает службу, а OnDestroy выполняется в сервисе, а в odestroy () медиаплеер остановлен и проблема ur исправлена.
Конечно, ваш сервис работает в фоновом режиме, и вы должны остановить его вручную из своей активности, когда он переходит в фоновый режим.
напишите ниже код в методе остановки:
. exit (0);
это остановит ваш медиаплеер при нажатии кнопки возврата / дома или закрытия приложения