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

时间:2013-01-23 12:10:33

标签: android

我尝试了数百万的方式,但是当我播放手机的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();

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

我希望音乐能够在从活动到另一个活动的同时继续播放,我不想停止音乐,然后在新的活动开始时重新开始。

5 个答案:

答案 0 :(得分:2)

我这样做的方式是:

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

答案 1 :(得分:0)

您可以拥有Application课程并将其设置为AndroidManifest。在onDestroy()回调中,您可以使用stopService()功能停止服务,也可以使用Intent启动服务以停止播放音乐。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

也许我找到了一种混合你们所有人给我的建议的方式。

使用此代码进行背景音乐(在此情况下通过服务管理)只有当用户使用后按钮关闭应用程序时,当用户使用主按钮关闭应用程序并且屏幕关闭时,因为用户锁定屏幕设备的锁定按钮。

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

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

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);     
                    }

                  }

答案 4 :(得分:0)

使用这个:如果您使用媒体播放器,请在您的活动中调用此方法...

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;
        }
    }
};