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

Keep sound playing within the App but stop it when App goes to the background

所以我想在整个应用程序中连续播放一个声音。但是一旦应用程序进入后台,声音就应该停止。我试图在 onStop() 期间执行此操作。问题是每次 activity 停止时都会调用 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。我想我做的一切都是对的,但我在 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()
    }

知道我在这里遗漏了什么吗?

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

为了使用 LifecycleObserver,您需要将 LifeCycle 添加到您的应用程序(它是一个 Android 架构组件),这里是 link: https://developer.android.com/topic/libraries/architecture/adding-components

您无法使用 activity 获得此类功能。 Activity 很容易被破坏,重新创建。您应该使用 Service 来实现此类功能,因为无论您的 activity 是否被破坏,该服务都会持续存在。

这个 article 已经过时了,但仍然可以从中学习使用音乐服务

您可以使用 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();
}

}

并在清单中添加 class 名称 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"