在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止

Posted

技术标签:

【中文标题】在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止【英文标题】: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() 中停止音乐,当我更改活动时,音乐就会停止。我只想在我的应用被破坏或未显示时停止播放音乐 【参考方案1】:

我这样做的方法是:

    我有一个单例类,即 SoundManager。 在 onPause 时,每个活动都会调用 soundManager.stopPlayingDelayed。此方法启动一个计时器,该计时器将在 1 或 2 秒内调用 soundManager.checkIfShouldStop。它还将 lastCloseTime 保存到当前时间。 onResume 上的每个活动都会调用 soundManager.startPlaying。如果已经播放声音管理器将忽略该请求。这也清除了 lastCloseTime 在 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;
        
    
;

【讨论】:

以上是关于在我的所有活动中播放背景音乐,并且仅在我的应用未显示时才停止的主要内容,如果未能解决你的问题,请参考以下文章

android - 如何在我的音乐播放器中从文件管理器播放 mp3 文件?

为啥我的领域通知令牌仅在我的活动设备上触发,而不是在所有具有开放领域的设备上触发?

HTML5 视频无法仅在 Chrome 中播放

Android - 如何在应用程序内保持音乐播放?

将播放给所有班级的游戏应用程序的背景音乐[关闭]

当我点击播放按钮更多然后在我的MP3播放器中我的应用程序崩溃