保持声音在App内播放,但在App进入后台时停止播放

时间:2019-01-29 15:02:34

标签: android audio kotlin android-mediaplayer android-lifecycle

所以我有一个声音,我想在我的整个App中连续播放。但是,一旦应用进入后台,声音就会停止。我正在尝试在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()
    }
}

编辑:

我尝试实现this answer,但不得不将其翻译为kotlin。我认为我做对了所有事情,但是Lifecycleobserver中出现了unresolved reference: mediaPlayer

这里是观察者:

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 :(得分:1)

您可以创建一个自定义Application类(扩展Application)并使用LifecycleObserver接口实现它,并在CustomApplication类中创建一个函数,并使用@OnLifecycleEvent(Lifecycle.Event.ON_STOP)对其进行注释,以便当应用程序在后台运行时,函数将被触发,在其中,您将放置逻辑以停止mediaPlayer(将其全局访问,以从应用程序的不同位置访问它)

要使用LifecycleObserver,您需要将LifeCycle添加到您的应用程序(这是一个Android体系结构组件),以下是链接: https://developer.android.com/topic/libraries/architecture/adding-components

答案 1 :(得分:1)

您无法通过活动获得此类功能。活动极易被破坏,重新创建。无论您的活动是否被破坏,您都应该使用Service来获得这种功能,因为该服务将持续存在。

article较旧且过时,但仍可以通过音乐使用服务进行学习

答案 2 :(得分:0)

您可以使用 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"