在 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"
所以我想在整个应用程序中连续播放一个声音。但是一旦应用程序进入后台,声音就应该停止。我试图在 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()
}
}
编辑:
我尝试实现 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"