如何在android上播放音乐,而活动是在前台

dfty9e19  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(359)

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

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

我在onpause服务中停止它,因为如果用户切换应用程序而不关闭它,音乐将继续播放。问题是,当我们更改活动时,onpaused也会被调用,但我希望音乐在整个应用程序中继续播放。
所以在我的另一项活动中:

//start music
    startService(MainActivity.musicIntent);

但是音乐重新开始,感觉不太好听。有什么解决办法吗?

xfyts7mz

xfyts7mz1#

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

oalqel3c

oalqel3c2#

你可以用 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
        }
    }
}

在“如何检查活动是在前景还是在可见背景中?”中还提到了其他解决方案?。

相关问题