当应用程序进入后台时停止MediaPlayer服务

我有一个媒体播放器服务,在我的应用程序的后台播放音乐,如:

public class Music extends Service { MediaPlayer player; @Override public IBinder onBind(Intent intent) { return null; } public void onCreate() { player = MediaPlayer.create(this, R.raw.music); player.setLooping(true); } public int onStartCommand(Intent intent, int flags, int startId) { player.start(); return Service.START_NOT_STICKY; } public void onDestroy() { player.stop(); player.release(); stopSelf(); super.onDestroy(); } 

问题是,当用户更改应用程序或进入手机的主屏幕(应用程序进入后台)时,音乐仍在播放。

我试图在onStoponDestroy方法中停止它,但是这会在我改变活动时停止音乐,这是我不想要的(我希望音乐在用户导航活动时继续播放)。

更新

我试过广播:

我补充道

LocalBroadcastManager.getInstance(this).registerReceiver(StateReceiver, new IntentFilter("status"));

in onCreate of music Service和接收事件的方法:

 private BroadcastReceiver StateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String status = intent.getStringExtra("status"); if (parseInt(String.valueOf(status)) == 0) { player.stop(); }else{player.start();} } }; 

在Application类中我做了这个:

 public class app_class extends Application implements Application.ActivityLifecycleCallbacks { private static int resumed; private static int paused; private static String currentActivity; @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { currentActivity = activity.getClass().getSimpleName(); } public static String getCurrentActivity() { return currentActivity; } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { send_status(1); } @Override public void onActivityPaused(Activity activity) { send_status(0); } private void send_status(int status_counter) { Intent intent = new Intent("status"); intent.putExtra("status", String.valueOf(status_counter)); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } 

但音乐不会恢复

您需要在停止后再次准备播放器。 如果您想在应用程序进入后台时停止播放,并在应用程序进入前台时从头开始播放媒体。 只需将您的BroadcastReceiver代码修改为:

 private BroadcastReceiver StateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String status = intent.getStringExtra("status"); if (parseInt(String.valueOf(status)) == 0) { player.stop(); } else { player = MediaPlayer.create(this, R.raw.music); player.setLooping(true); player.start(); } } }; 

但是,如果要暂停播放并从您离开的位置继续播放,请进行以下更改:在Application类中,在onActivityDestroyed()中:

 @Override public void onActivityDestroyed(Activity activity) { send_status(2); } 

并在BroadcastReceiver中:

 private BroadcastReceiver StateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String status = intent.getStringExtra("status"); if (parseInt(String.valueOf(status)) == 0) { player.pause(); //When app is in background and not killed, we just want to pause the player and not want to lose the current state. } else if (parseInt(String.valueOf(status)) == 1) { if (player != null) player.start(); // If the player was created and wasn't stopped, it won't be null, and the playback will be resumed from where we left of. else { // If the player was stopped, we need to prepare it once again. player = MediaPlayer.create(this, R.raw.music); player.setLooping(true); player.start(); } } else if(player != null){ player.stop(); player.release(); } } }; 

另外,看看MediaPlayer状态 。

您可以在应用程序类中添加它,以检查您的应用程序是否在前台。

 public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks { private static int resumed; private static int paused; private static int started; private static int stopped; private static String currentActivity; public static String getCurrentActivity() { return currentActivity; } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { currentActivity = activity.getClass().getSimpleName(); } @Override public void onActivityDestroyed(Activity activity) { } @Override public void onActivityResumed(Activity activity) { ++resumed; } @Override public void onActivityPaused(Activity activity) { ++paused; android.util.Log.w("test", "application is in foreground: " + (resumed > paused)); // send broadcast from here to the service sendBroadcast() } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityStarted(Activity activity) { ++started; } @Override public void onActivityStopped(Activity activity) { ++stopped; android.util.Log.w("test", "application is visible: " + (started > stopped)); } public static boolean isApplicationVisible() { return started > stopped; } public static boolean isApplicationInForeground() { return resumed > paused; } } 

像这样将它添加到您的应用程序:

 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new MyLifecycleHandler()); } } 

收到服务广播后,您可以停止媒体播放器。

编辑

您需要将应用程序类更改为:

 public class app_class extends Application implements Application.ActivityLifecycleCallbacks { private static int resumed; private static int paused; private static String currentActivity; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { currentActivity = activity.getClass().getSimpleName(); } public static String getCurrentActivity() { return currentActivity; } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { send_status(1); } @Override public void onActivityPaused(Activity activity) { send_status(0); } private void send_status(int status_counter) { Intent intent = new Intent("status"); intent.putExtra("status", String.valueOf(status_counter)); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } } 

你实现了onDestroy()吗? 如果没有,我相信这可能是解决方案 – 你停止你的播放器或你在onDestroy()中运行服务的任何东西。

可以通过调用stopSelf()方法或调用Context.stopService()来停止服务。