如何在 Activity 处于前台时在 Android 上播放音乐

How to play music on Android while activities are on foreground

我想在我的应用程序后台播放音乐:

public class BackgroundSoundService extends Service {

    MediaPlayer mediaPlayer;

    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer = MediaPlayer.create(this, R.raw.airport_lounge);
        mediaPlayer.setLooping(true);
        mediaPlayer.setVolume(100,100);
    }


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

    @Override
    public void onDestroy() {
        super.onDestroy();
        mediaPlayer.stop();
        mediaPlayer.release();
    }

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

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

然后在我的 MainActivity :

public static Intent musicIntent;

//Start music service
        musicIntent = new Intent(this, BackgroundSoundService.class);
        startService(musicIntent);

 @Override
    protected void onPause() {
        super.onPause();
        stopService(musicIntent);
    }

    @Override
    protected void onResume() {
        super.onResume();
        startService(musicIntent);
    }

我在 onPause 服务中停止了它,因为如果用户切换应用程序但不关闭它,音乐将继续播放。问题是,当我们更改 Activity 时,也会调用 onPaused 但我希望音乐在整个应用程序中继续播放。

所以在我的另一个 Activity 中:

//start music
    startService(MainActivity.musicIntent);

但是音乐又开始播放了,不太好听。有什么解决办法吗?

这取决于应用程序结构,例如,如果您构建一些基于选项卡或导航抽屉的导航,您可能会构建一些片段并且您的 MainActivity 将是您唯一的 activity,因此它的 onPause 方法将仅如果用户关闭您的应用程序将被调用。但是随着您的应用程序的增长,这种情况将不成立(除非它非常简单)。 所以另一种方法是在您的应用程序实例中启动您的服务,以防您使用它。

您可以在您的应用程序中使用 ActivityLifecycleCallbacks class。

public class MusicApplication extends Application implements ActivityLifecycleCallbacks {
    int activitiesOnTop = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(this);
    }


    @Override
    public void onActivityResumed(Activity activity) {
        // one of application activities is visible
        activitiesOnTop ++;
    }

    @Override
    public void onActivityStopped(Activity activity) {
        activitiesOnTop --;
        if(activitiesOnTop == 0){
              // none of activities are on foreground
        }
    }
}

How to check if activity is in foreground or in visible background?中提到了其他解决方案。