2013-04-02 35 views
0

我有一個擴展了我的應用程序的背景音樂服務管理器的類。當您退出應用程序時,會成功完全停止服務,但當您使用主頁按鈕退出應用程序時,後臺音樂會停止,但後者會繼續而不會返回到應用程序中。它會是什麼?服務管理器和背景音樂的問題

謝謝。

我的服務:

public class MusicManager extends Service implements MediaPlayer.OnErrorListener{ 

private final IBinder mBinder = new ServiceBinder(); 
MediaPlayer mPlayer; 
private int length = 0; 

String[] myMusic = {"mfx/Track01.ogg", "mfx/Track02.ogg", "mfx/Track03.ogg"};   
private static int mUltimaPista = -1; 

public MusicManager() { } 

public class ServiceBinder extends Binder { 
    public MusicManager getService() 
    { 
     return MusicManager.this; 
    } 
} 

@Override 
public IBinder onBind(Intent arg0){return mBinder;} 

@Override 
public void onCreate(){ 
    super.onCreate(); 

//Musica 
    SiguienteCancion();   
    MusicFactory.setAssetBasePath("mfx/"); 
    AssetFileDescriptor afd = null;  
    try { 
    afd = getAssets().openFd(myMusic[mUltimaPista]); 
    mPlayer = new MediaPlayer(); 
    mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
     afd.close(); 
     mPlayer.prepare(); 
    } catch (IllegalArgumentException e) { 
     Log.d("Kids",e.getMessage()); 
    } catch (IllegalStateException e) { 
     Log.d("Kids",e.getMessage());   
    } catch (IOException e) { 
     Log.d("Kids",e.getMessage()); 
    }   

    mPlayer.setOnCompletionListener(new OnCompletionListener() {    
     public void onCompletion(MediaPlayer mp) { 
      mp.reset(); 
      mp.setVolume(0.25f, 0.25f); 
      try { 
      SiguienteCancion(); 
      MusicFactory.setAssetBasePath("mfx/");     
       AssetFileDescriptor afd = getAssets().openFd(myMusic[mUltimaPista]); 
       if (afd != null) { 
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
        afd.close(); 
        mp.prepare(); 
        mp.setVolume(0.25f, 0.25f); 
        mp.start(); 
       } 
      } catch (Exception ex) { 
       // report a crash 
      Log.d("Kids",ex.getMessage()); 
      } 
     } 
    });  

    mPlayer.setOnErrorListener(new OnErrorListener() { 

    public boolean onError(MediaPlayer mp, int what, int 
     extra){ 

     onError(mPlayer, what, extra); 
     return true; 
    } 
     }); 
} 

@Override 
public int onStartCommand (Intent intent, int flags, int startId) 
{ 
    mPlayer.start(); 
    return START_STICKY; 
} 

public void pauseMusic() 
{ 
    if(mPlayer.isPlaying()) 
    { 
     mPlayer.pause(); 
     length=mPlayer.getCurrentPosition(); 

    } 
} 

public void resumeMusic() 
{ 
    if(mPlayer.isPlaying()==false) 
    { 
     mPlayer.seekTo(length); 
     mPlayer.start(); 
    } 
} 

public void stopMusic() 
{ 
    mPlayer.stop(); 
    mPlayer.release(); 
    mPlayer = null; 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    if(mPlayer != null) 
    { 
    try{    
    mPlayer.stop(); 
    mPlayer.reset();   
    mPlayer.release(); 
     }finally { 
      mPlayer = null; 
     } 
    } 
} 

public boolean onError(MediaPlayer mp, int what, int extra) { 

    Toast.makeText(this, "music player failed", Toast.LENGTH_SHORT).show(); 
    if(mPlayer != null) 
    { 
     try{ 
      mPlayer.stop(); 
      mPlayer.release(); 
     }finally { 
      mPlayer = null; 
     } 
    } 
    return false; 
} 

// Obtenemos la siguiente canción a reproducir 
public void SiguienteCancion() 
{ 
    Random rand = new Random(); 
    int track = Math.abs(rand.nextInt() % 3); 

    while (track == mUltimaPista) 
    { 
     track = Math.abs(rand.nextInt() % 3); 
    }    

    mUltimaPista = track; 
} 

}

主要活動:

private boolean mIsBound = false; 
private MusicManager mServ; 
private ServiceConnection Scon =new ServiceConnection() 
{ 
    public void onServiceConnected(ComponentName name, IBinder service) {      
     mServ = (MusicManager)((ServiceBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName name) { 
     mServ = null; 
    } 
}; 

void doBindService(){ 
    bindService(new Intent(this,MusicManager.class),Scon,Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
} 

void doUnbindService() 
{ 
    if(mIsBound) 
    { 
     unbindService(Scon); 
     mIsBound = false; 
    } 
} 

public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) 
     throws Exception {                
    Intent music = new Intent(); 
    music.setClass(this,MusicManager.class); 
    startService(music); 

    doBindService(); 

    pOnCreateResourcesCallback.onCreateResourcesFinished(); 
} 
@Override 
public void onResumeGame() { 
    super.onResumeGame(); 

    if (mServ != null) 
    {     
     mServ.resumeMusic();       
    }           
} 
@Override 
public void onPauseGame() { 
    if (mServ != null) 
    {   
     mServ.pauseMusic(); 
    } 

    super.onPauseGame();               
} 

其他活動:

private boolean mIsBound = false; 
private MusicManager mServ; 
private ServiceConnection Scon =new ServiceConnection() 
{ 
    public void onServiceConnected(ComponentName name, IBinder service) {      
     mServ = (MusicManager)((ServiceBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName name) { 
     mServ = null; 
    } 
}; 

void doBindService(){ 
    bindService(new Intent(this,MusicManager.class),Scon,Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
} 

void doUnbindService() 
{ 
    if(mIsBound) 
    { 
     unbindService(Scon); 
     mIsBound = false; 
    } 
} 
public void onCreateResources(
     OnCreateResourcesCallback pOnCreateResourcesCallback) 
     throws Exception { 

    doBindService(); 

    pOnCreateResourcesCallback.onCreateResourcesFinished(); 

} 
@Override 
public void onResumeGame() { 
    super.onResumeGame(); 

    if (mServ != null) 
    {   
     mServ.resumeMusic();       
    } 
} 

@Override 
public void onPauseGame() {  
    super.onPauseGame();     

    if (mServ != null) 
    { 
     mServ.pauseMusic(); 
    }    
} 

回答

0

在您的主要活動把下面的代碼。

@Override 
protected void onResume() { 
    if (!SoundService.isMediaPlaying()) { 
      startService(new Intent(Game.this, SoundService.class)); 
    } 
} 

@Override 
protected void onPause() { 
    stopService(new Intent(this, SoundService.class)); 
} 

另外補充以下功能爲您服務。

public static boolean isMediaPlaying() { 
    if (bgMusic != null) { 
     try { 
      return bgMusic.isPlaying(); 
     } catch (Exception e) { 
     } 
    } 

    return false; 
} 

因爲如果處理所有活動的一個遊戲活動的所有代碼,然後設置簡歷布爾變量和方法暫停

+0

難道只有會是這樣?不應該把ServiceConnection的部分,doBindService無效()等?什麼也刪除了doBindService onCreate()?在我的應用程序中的其他活動也將相同的代碼放在onResume和onPause? 非常感謝。 – user2151505