2011-10-28 3 views
7

Okey、これは私の問題です。 1つのサービスクラスでは、いつもバックグラウンドで音楽を再生するメディアプレーヤーを作成することができました。ここでは、コードです:バックグラウンドミュージック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

アプリケーションが起動している間はいつでも再生したいですが、ホームボタンを押しても音楽が再生されます。 – 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

ただ1つの質問。私は新しいクラスのBackgroundSoundを作る必要がありますか?またはこれをBackgroundSoundServiceクラスの下に置くか、これをメインアクティビティクラスの中に入れますか? – Zookey

0

確かに、サービスはバックグラウンドで実行され、バックグラウンドに移行するときにはアクティビティから手動で停止する必要があります。

+2

手動で停止するには? – Zookey

0

はい、ホームボタンを押したときにサービスを停止する必要があります。 OnPause(){}オーバーライドメソッドでは、音楽サービスを停止する必要があります。 OnDestroy()メソッドのサービス内で、メディアプレーヤーを停止してください。 これで、自宅でonPauseとonPause() - >を押すとサービスが停止し、OnDestroyがサービスで実行され、odestroy()でmediaplayerが停止し、問題が解決しました。あなたの停止の方法でコードの下

0

書き込み:

システム。出口(0);

このメディアプレーヤーを終了します、あなたが戻って押し/ホームボタンまたは近いアプリケーション

0

HOMEまたはBACKを押すだけでBGMを停止するには、次の試してみてください。

@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はちょうど非常に短いクリップに適していますが、それは音楽ファイルであれば、あなたは次のような問題に直面するだろう:あなたは途中で音楽を一時停止/停止することができなくなります

  • 。私にとっては本当の問題です。

ここではAsyncTasksは、理想的には、短い操作に使用する必要がありますAsyncTasks

についてのAndroid開発者のページからいくつかの行である(数秒、最大で 。)あなたは長時間実行中のスレッドを維持する必要がある場合 の場合は、 によって提供されるさまざまなAPI(Executor、ThreadPoolExecutor 、FutureTaskなど)を使用することを強くお勧めします。

現在、私は解決策を見つけたら、他のオプションを探して答えを更新しています。

0

onDestroy()メソッドでplayer.stop()を挿入してみます。それは助けになるはずです。

関連する問題