Сохраняйте звук в приложении, но останавливайте его, когда приложение переходит в фоновый режим - PullRequest
0 голосов
/ 29 января 2019

Итак, у меня есть звук, который я хочу воспроизводить непрерывно на протяжении всего моего приложения.Но как только приложение переходит в фоновый режим, звук должен прекратиться.Я пытаюсь сделать это во время onStop ().Проблема в том, что onStop () вызывается каждый раз, когда действие останавливается, независимо от того, остаюсь я в приложении или нет.Есть ли способ провести различие между этими случаями?Примерно так:

override fun onStop() {
    if [App is left but not destroyed] {
        super.onStop()
        mediaLength = mediaPlayer.currentPosition
        mediaPlayer.pause()
    }
    else { //i.e. activity is left but the new activity is from the same app.
        super.onStop()
    }
}

РЕДАКТИРОВАТЬ:

Я пытался реализовать этот ответ , но пришлось перевести его на kotlin.Я думаю, что все сделал правильно, но я получаю unresolved reference: mediaPlayer в Lifecycleobserver.

Вот Обозреватель:

package com.example.asdasd.soulfetch

import android.app.Application
import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleObserver
import android.arch.lifecycle.OnLifecycleEvent
import android.arch.lifecycle.ProcessLifecycleOwner


class CheckLifeCycle: Application(), LifecycleObserver {
override fun onCreate() {
    super.onCreate()
    ProcessLifecycleOwner.get().getLifecycle().addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackground() {
    MainActivity.mediaPlayer.pause()
}
}

А вот соответствующие части MainActivity

class MainActivity : AppCompatActivity() {

lateinit var mediaPlayer: MediaPlayer

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    mediaPlayer = MediaPlayer()

    fun playBordun() {
        mediaPlayer = MediaPlayer.create(this, R.raw.cbordun)
        mediaPlayer.isLooping = true
        mediaPlayer.start()
        }
    playBordun()
    }
override fun onDestroy() {
    super.onDestroy()
    mediaPlayer.stop()
    mediaPlayer.reset()
    mediaPlayer.release()
    }

Есть идеи, что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Вы не можете получить такую ​​функциональность, используя активность.Деятельность очень подвержена разрушению, воссозданию.Вы должны использовать Сервис, чтобы получить такую ​​функциональность, поскольку сервис будет сохраняться независимо от того, уничтожена ваша деятельность или нет.

Эта статья устарела и устарела, но все еще может научиться пользоваться сервисом.с музыкой от нее

0 голосов
/ 30 января 2019

Вы можете использовать LifecycleObserver , чтобы проверить, работает ли приложение в фоновом режиме или нет.

public class CheckLifeCycle extends Application implements LifecycleObserver {

@Override
public void onCreate() 
{
    super.onCreate();
    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppBackground()
{
    MainActivity.mediaPlayer.pause();
}

}

и добавить имя класса CheckLifeCycle в манифест

<manifest >
    ....
    <application
        android:name=".CheckLifeCycle"
        ......
    </application>

</manifest>

не забудьте включить базовую библиотеку поддержки в gradle.

implementation "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
0 голосов
/ 29 января 2019

Вы можете создать пользовательский класс приложения (расширяет приложение) и реализовать его с интерфейсом LifecycleObserver, а также создать функцию в классе CustomApplication и аннотировать его с помощью @OnLifecycleEvent (Lifecycle.Event.ON_STOP), поэтому, когда приложение находится в фоновом режиме,будет активирована функция, и внутри нее вы поместите логику для остановки mediaPlayer (сделайте его глобальным, чтобы получить доступ к нему из другого места во время работы приложения)

Чтобы использовать LifecycleObserver, вам необходимо добавить LifeCycle в ваше приложение(это компонент архитектуры Android) вот ссылка: https://developer.android.com/topic/libraries/architecture/adding-components

...