【问题标题】:Play background music across all my activities, and stop it only when my app is not displayed在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止
【发布时间】:2013-01-23 12:10:33
【问题描述】:

我尝试了一百万种方式,但是当我播放手机的 HOME 按钮时,音乐一直在播放。 我最后一次尝试是应用程序,但我仍然遇到同样的问题。

这是我的代码。

public class ProvaMusica extends Application {
Intent musica_backGround;
public Background_music musicaDiBackground = new Background_music(); 

    public void avvia(){    
           //this is the class where i manage mediaplayer//////////
           musica_backGround=new Intent(this, Background_music.class); 
           startService(musica_backGround);
    }    


    public void onDestroy(){    
        stopService(musica_backGround);     
    }

}

在我的第一个活动中,我使用此代码开始播放音乐

 ProvaMusica appState = ((ProvaMusica)this.getApplication());
 appState.avvia();

现在,我应该怎么做才能在显示其他活动时让音乐播放,而在我的应用不显示时让音乐停止?

我希望音乐在从一项活动转移到另一项活动时继续播放,我不想在新活动开始时停止音乐然后重新开始。

【问题讨论】:

  • 您是否尝试过覆盖 onPause() 并停止音乐?
  • 是的,如果我在 onPause() 中停止音乐,当我更改活动时,音乐就会停止。我只想在我的应用被破坏或未显示时停止播放音乐

标签: android


【解决方案1】:

我这样做的方法是:

  1. 我有一个单例类,即 SoundManager。
  2. 在 onPause 时,每个活动都会调用 soundManager.stopPlayingDelayed。此方法启动一个计时器,该计时器将在 1 或 2 秒内调用 soundManager.checkIfShouldStop。它还将 lastCloseTime 保存到当前时间。
  3. onResume 上的每个活动都会调用 soundManager.startPlaying。如果已经播放声音管理器将忽略该请求。这也清除了 lastCloseTime
  4. 在 checkIfShouldStop 中,如果 lastCloseTime 不为零且超过 1 秒前,则表示在最后一个活动完成后,我的应用没有新的活动启动,因此应该停止音乐。

【讨论】:

    【解决方案2】:

    您可以拥有一个Application 类并将其设置在AndroidManifest 中。在其onDestroy() 回调中,您可以使用stopService() 函数停止服务,也可以使用Intent 启动服务来停止音乐。

    【讨论】:

    • 如果活动不可见,是否会首先调用onPause()
    • 是的,会先调用onPause(),再调用onDestroy()
    • 我编辑了我的帖子。我尝试使用应用程序,但我仍然有同样的问题。你可以看看吗?
    • 调用Application类中的方法后音乐是否开始播放?如果是这样,您是否在 Application 类中使用 onDestroy() 通过 stopService() 函数停止服务?
    • 是的,我做到了.. 我想我做到了!我再次编辑了我的代码。我做错了什么?
    【解决方案3】:

    您的应用在 Android 操作系统中作为一个进程运行。 Android 操作系统有多种终止进程的方法,有时在进程被终止之前可能不会调用像 onDestroy() 这样的回调函数。因此,如果您在服务中启动并播放音乐,只要您的进程存在,音乐就会一直播放。但是,如果您希望它停止,当您的应用程序的特定活动被终止时,您可以覆盖该活动的 onDestroy() 并为您的服务广播一条消息以停止音乐。 使用服务来实现。

    【讨论】:

    • 我无法覆盖 onFinish() 方法。我收到此错误消息The method onFinish() of type MainActivity must override or implement a supertype method 我在 Internet 上查找此错误,但没有找到解决方案。我做错了什么?
    • 对于活动,你应该重写 onDestroy() 方法,对不起。如果进程被杀死,onDestroy() 方法可能不会被调用,但如果活动在导航到其他地方后被销毁,它将被调用。如果进程被操作系统或用户杀死,您的服务将不可避免地停止,无需担心。我希望这会有所帮助
    【解决方案4】:

    也许我找到了一种方法来混合大家给我的建议。

    使用此代码,背景音乐(在本例中由服务管理)仅在用户使用后退按钮关闭应用程序、用户使用主页按钮关闭应用程序以及屏幕关闭时停止,因为用户使用设备的锁定按钮。

    我希望有人比我更专业、更擅长编程来确认这是正确的

    在这个课程中,我检查我当前的活动是否在前台

    public class GestioneApplicazioneInBackground{
        public static boolean applicazioneInBackground(final Context context) {
              ActivityManager am = (ActivityManager) MainActivity.context.getSystemService(Context.ACTIVITY_SERVICE);
              List<RunningTaskInfo> tasks = am.getRunningTasks(1);
              if (!tasks.isEmpty()) {
                ComponentName topActivity = tasks.get(0).topActivity;
                if (!topActivity.getPackageName().equals(context.getPackageName())) {
                  return true;
                }
              }
    
              return false;
            }
    }
    

    在我所有活动的 onStop() 和 onPause() 方法中,我都有这段代码

    /// if my app and his activities are in background i stop the service i started in my main/first activity////
        if(GestioneApplicazioneInBackground.applicazioneInBackground(this) ){
                          context_of_the_Intent.stopService(intent);    
                      }
                      else{
    // if my app and his activities are NOT in background i check if user turned off the screen with the lock button of the device//////        
                        PowerManager kgMgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
                        boolean showing = kgMgr.isScreenOn();
                        if(!showing){
                             context_of_the_Intent.stopService(intent);     
                        }
    
                      }
    

    【讨论】:

      【解决方案5】:

      使用这个:Tf you usr media player then Call this method in your activity...

      MediaPlayer mp=null;
      
      @Override
      protected void onDestroy() {
          super.onDestroy();
      
          if (!(mp == null)) {
              if (mp.isPlaying()) {
                  mp.stop();
                  mp.release();
                  mp = null;
              }
          }
      };
      
      v @Override
      protected void onResume() {
          super.onResume();
      
          if (!(mp == null)) {
              if (mp.isPlaying()) {
                  mp.stop();
                  mp.release();
                  mp = null;
              }
          }
      };
      

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多