2

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

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

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

4

5 回答 5

2

我这样做的方法是:

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

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

于 2013-01-23T12:12:40.397 回答
0

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

于 2013-01-23T15:05:48.663 回答
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);     
                    }

                  }
于 2013-01-26T13:39:58.537 回答
0

使用这个:Tf you usr media player 然后在你的活动中调用这个方法......

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;
        }
    }
};
于 2013-08-07T05:59:56.613 回答