さて、これは私の問題です。私は、バックグラウンドで音楽を再生するためのメディアプレーヤーを作成することに成功したサービスクラスを1つ持っています。コードは次のとおりです。
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);
アプリのバックグラウンドミュージックのみを再生する場合は、アプリから起動されたスレッドで再生するか、AsyncTaskクラスを使用して再生します。
サービスの概念は、バックグラウンドで実行することです。背景として、意味は通常、アプリのUIが非表示の場合です。確かに、それはあなたが持っているのと同じように使用できますが(それを停止することを覚えている場合)、それは正しくなく、使用すべきではないリソースを消費します。
activityのバックグラウンドでタスクを実行する場合は、AsyncTaskを使用します。
ちなみに、onStart
は非推奨です。サービスを使用する場合は、onStartCommand
を実装してください。
更新:
このコードはあなたのために働くと思います。このクラスを追加します(アクティビティクラスに含まれます)。
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);
}
これは機能します。
AsyncTasksは非常に短いクリップにのみ適していますが、音楽ファイルの場合は次のような問題が発生します。
AsyncTasksに関するAndroid開発者ページからの数行です
AsyncTasksは、理想的には短い操作(最大で数秒)に使用する必要があります。スレッドを長期間実行し続ける必要がある場合は、Java.util.concurrentパッケージによって提供されるさまざまなAPIを使用することを強くお勧めします。 Executor、ThreadPoolExecutorおよびFutureTask。
そのため、現在、他のオプションを検討しており、解決策が見つかったら回答を更新しています。
onstopメソッドに以下のコードを記述します。
システム。 exit(0);
これにより、戻る/ホームボタンを押すか、アプリケーションを閉じると、メディアプレーヤーが終了します。
OnDestroy()メソッドにplayer.stop()を挿入してみてください。それは役立つはずです。
サービスを開始するアクティビティのstopService(svc)
メソッドにonDestroy()
を挿入してみてください。わたしにはできる。
はい、ホームボタンを押したらサービスを停止する必要があります。 OnPause(){}オーバーライドメソッドでは、uは音楽サービスを停止する必要があります。そして、OnDestroy()メソッドのサービス内でメディアプレーヤーを停止してください。そのため、ホームコールを押すとonPauseとonPause()->サービスが停止し、OnDestroyがサービスで実行され、odestroy()でメディアプレーヤーが停止し、問題が修正されます。
(Kotlin)悲しいことに Jongの答え 私にはうまくいきませんでした。次のようないくつかのエラーがありました:MediaPlayer finalized without being released
そして音の停止と開始の遅れ。ですから、他の誰かが同じ問題を抱えている場合に備えて、私が行った方法を投稿します。 BackgroundSound
の実装では、引き続き AsyncTask および MediaPlayer を使用しますが、ネストされていないクラスです。
class BackgroundSound : AsyncTask<Context, Void?, Void?>() {
override fun doInBackground(vararg params: Context): Void? {
val player = MediaPlayer.create(params[0], R.raw.msc_background)
player.isLooping = true
player.start()
while (!isCancelled) {
}
player.stop()
player.release()
return null
}
}
このクラスは、次のように Activity 内で使用できます。
private var backgroundSound: BackgroundSound? = null
override fun onResume() {
super.onResume()
backgroundSound = BackgroundSound()
backgroundSound!!.execute(this)
}
override fun onPause() {
backgroundSound?.cancel(true)
super.onPause()
}
HOMEまたは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();
}
}
}
確かに、サービスはバックグラウンドで実行され、バックグラウンドに移行したときにアクティビティから手動で停止する必要があります。