Java 如何在Android上播放音乐,而活动则在前台

Java 如何在Android上播放音乐,而活动则在前台,java,android,android-music-player,Java,Android,Android Music Player,我想在我的应用程序的背景中播放音乐: public class BackgroundSoundService extends Service { MediaPlayer mediaPlayer; @Override public void onCreate() { super.onCreate(); mediaPlayer = MediaPlayer.create(this, R.raw.airport_lounge);

我想在我的应用程序的背景中播放音乐:

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;
    }
}
然后在我的主要活动中:

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);
    }
//start music
    startService(MainActivity.musicIntent);
我在“暂停服务”中停止它,因为如果用户切换应用程序而不关闭它,音乐将继续播放。问题是,当我们更改活动时,onPaused也会被调用,但我希望音乐在整个应用程序中继续播放

因此,在我的另一项活动中:

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);
    }
//start music
    startService(MainActivity.musicIntent);

但是音乐重新开始,听起来不太好听。任何解决方案?

这取决于应用程序结构,例如,如果您构建一些基于tab或navigationDrawer的导航,您可能会构建一些片段,并且MainActivity将是您唯一的活动,因此只有当用户关闭应用程序时才会调用onPause方法。但随着应用程序的增长,这种情况不会持续(除非它非常简单)。
因此,另一种方法是在应用程序实例中启动服务,以备您使用。

这取决于应用程序结构,例如,如果您构建一些基于tab或navigationDrawer的导航,您可能会构建一些片段,MainActivity将是您唯一的活动,所以,只有当用户关闭应用程序时,才会调用onPause方法。但随着应用程序的增长,这种情况不会持续(除非它非常简单)。
因此,另一种方法是在应用程序实例中启动服务,以备使用。

您可以在应用程序类中使用
ActivityLifecycleCallbacks

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
        }
    }
}

中提到了其他解决方案。

您可以在应用程序类中使用
ActivityLifecycleCallbacks

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
        }
    }
}

还有其他解决方案,请参见。

哦,是的。。。。我忘了。哦,是的。。。。我忘了这一点。不幸的是,这对我没有帮助,因为每次调用“在顶部”、“在恢复中”等活动时都会调用这些方法。。。我想要的是,当我们更改活动时,音乐不会受到影响,但当我们将应用程序置于后台时,音乐会停止,因为当用户在另一个应用程序中时,音乐不能播放。@LoicJackotin我已经更新了我的答案,请检查一下谢谢!很不幸,这对我没有帮助,因为每次调用“在顶部”、“在恢复中”等活动时都会调用这些方法。。。我想要的是,当我们更改活动时,音乐不会受到影响,但当我们将应用程序置于后台时,音乐会停止,因为当用户在另一个应用程序中时,音乐不能播放。@LoicJackotin我已经更新了我的答案,请检查一下谢谢!它起作用了。