2011-10-28 238 views
7

Okey,這是我的問題。我有一個服務課,我設法創建媒體播放器,隨時播放背景音樂。這裏是代碼:背景音樂Android

package com.test.brzoracunanje; 
import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.IBinder; 

public class BackgroundSoundService extends Service { 
private static final String TAG = null; 
MediaPlayer player; 
public IBinder onBind(Intent arg0) { 

    return null; 
} 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
     player = MediaPlayer.create(this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(100,100); 
     player.start(); 
} 
@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

protected void onNewIntent() { 
    player.pause(); 
} 
} 

但現在我有問題,當我點擊HOME,或BACK按鈕。它仍然播放音樂。有誰知道如何解決這個問題?

這裏是代碼如何我想要播放音樂的類上的這種服務;

Intent svc=new Intent(this, BackgroundSoundService.class); 
    startService(svc); 
+0

我看不出問題所在......你不想在後臺播放音樂嗎? – m0skit0

+0

我想在應用程序運行的同時播放它,但是當按Home按鈕時,音樂仍在播放。 – Zookey

回答

22

如果您只想爲您的應用播放背景音樂,請在您的應用中啓動的線程中播放它/使用AsyncTask類爲您完成此操作。

服務的概念是在後臺運行;通過背景知識,其含義通常是當您的應用UI爲不可見時。誠然,它可以像你一樣使用(如果你記得要停止它),但它不正確,它會消耗你不應該使用的資源。

如果您想要在活動的背景下執行任務,請使用AsyncTask。

順便說一句,onStart已棄用。當您使用服務時,請執行onStartCommand

UPDATE:

我覺得這段代碼會爲你工作。添加這個類(包含在你的活動類中)。

public class BackgroundSound extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(1.0f, 1.0f); 
     player.start(); 

     return null; 
    } 

} 

現在,爲了控制音樂,保存您的BackgroundSound對象而不是匿名創建它。聲明它作爲一個外地在您的活動:

BackgroundSound mBackgroundSound = new BackgroundSound(); 

您的活動的的onResume方法,啓動它:

public void onResume() { 
    super.onResume(); 
    mBackgroundSound.execute(null); 
} 

而且你的活動的的onPause方法,阻止它:

public void onPause() { 
    super.onPause(); 
    mBackgroundSound.cancel(true); 
} 

這將工作。

+0

你能修正我說的代碼嗎? – Zookey

+0

現在就可以做了。幾分鐘後即可編輯。 – Jong

+0

只是一個問題。我是否需要製作新的BackgroundSound類?或者把它放在BackgroundSoundService類下,或者把它放在我的主要活動類中? – Zookey

0

當然,你的服務在後臺運行,你必須從你的活動手動停止它時,它被切換到後臺。

+2

如何手動停止它? – Zookey

0

是的,你應該停止服務,當你按主頁按鈕。在OnPause()覆蓋方法中,你應該停止音樂服務。在OnDestroy()方法中的服務中,請停止媒體播放器。 所以,現在,按家庭電話onPause和onPause() - >停止服務和OnDestroy在服務和odestroy()執行停止媒體播放器,並解決你的問題。

0

在您的停止方法中寫入以下代碼:

系統。出口(0);

當您按下BACK/HOME按鈕或關閉應用

0

嘗試以下在家裏或BACK按停止背景音樂,這將終止您的媒體播放器。

@Override 
protected void onStop() { 
    super.onStop(); 
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager 
      .getRunningTasks(Integer.MAX_VALUE); 
    boolean isActivityFound = false; 

    if (services.get(0).topActivity.getPackageName().toString() 
      .equalsIgnoreCase(getPackageName().toString())) { 
     isActivityFound = true; // Activity belongs to your app is in foreground. 
    } 

    if (!isActivityFound) { 
     if (player != null && player.isPlaying()) { 
      player.release(); 
     } 
    } 
} 
1

AsyncTasks只是很短的剪輯好,但如果它是一個音樂文件,你會面臨類似的問題:

  • 你將無法停止/暫停音樂在中間。對我來說這是一個真正的問題。

下面是Android開發第幾號線約AsyncTasks

AsyncTasks應該理想地用於短操作(在幾秒鐘 最多的。)如果你需要保持運行的線程長時間 時間,強烈建議您使用java.util.concurrent包,如Executor,ThreadPoolExecutor 和FutureTask提供的各種API。

因此,目前我正在尋找其他選項並在找到解決方案時更新答案。

0

嘗試在onDestroy()方法中插入player.stop()。它應該有所幫助。