【问题标题】:Keep sound playing within the App but stop it when App goes to the background在 App 内保持声音播放,但在 App 进入后台时停止
【发布时间】:2019-01-29 15:02:33
【问题描述】:

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

知道我在这里缺少什么吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。我现在使用服务来播放声音。我取消绑定 onUserLeaveHint() 服务并使用 FLAG_ACTIVITY_NO_USER_ACTION 防止 Intent 中的取消绑定。它工作正常,所以从技术上讲,这是公认的答案。我现在的问题是我有和以前一样的问题,只是在新的活动中:当我在那里使用主页按钮时,声音一直在播放。知道如何将服务与新 Activity 解除绑定吗?
    • 一个选项是,您可以使用监听器....当应用程序进入后台时,通过监听器暂停声音
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 非常感谢。我试图实现这一点,但得到一个unresolved reference: mediaPlayer。在 MainActivity 我做 lateinit var mediaPlayer: MediaPlayer 并在 onCreate 我做 mediaPlayer = MediaPlayer()fun playBordun() { mediaPlayer = MediaPlayer.create(this, R.raw.cbordun) mediaPlayer.isLooping = true mediaPlayer.start() } 我还有其他事情要做吗?
      • 我听不懂。您的代码中似乎一切正常。你能提供更多细节吗?您何时遇到此错误?
      • 我在编写代码时收到了警告。然后在尝试编译时会抛出相同的错误:C:\[path]\CheckLifeCycle.kt: (17, 22): Unresolved reference: mediaPlayer &gt; Task :app:buildInfoGeneratorDebug 要提供更多详细信息,我将不得不提出一个新问题或尝试回答这个问题。一旦我这样做了,我会在这里告诉你。
      • 我为这个问题添加了一些细节。见上文。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多