活动在前台时如何在 Android 上播放音乐

Posted

技术标签:

【中文标题】活动在前台时如何在 Android 上播放音乐【英文标题】:How to play music on Android while activities are on foreground 【发布时间】:2021-04-10 17:14:15 【问题描述】:

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

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,但我希望音乐在整个应用程序中继续播放。

所以在我的另一个活动中:

//start music
    startService(MainActivity.musicIntent);

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

【问题讨论】:

【参考方案1】:

您可以在应用程序类中使用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
        
    

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

【讨论】:

不幸的是,它对我没有帮助,因为每次调用活动 onStop、on resumed 等时都会调用这些方法......我想要的是当我们改变活动时,音乐不会受到影响,但是当我们将应用程序置于后台,因此音乐停止,因为当用户在另一个应用程序中时,音乐不能播放。 @LoicJackotin 我已经更新了我的答案,请检查一下【参考方案2】:

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

【讨论】:

以上是关于活动在前台时如何在 Android 上播放音乐的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何在应用程序内保持音乐播放?

如何通过App在后台连续播放音乐?

Android - 播放将在所有活动中播放的背景音乐

与前台服务android通信

当用户切换到 Android Studio Kotlin 中的其他页面时,如何停止播放音乐?

如何在 android 的 mediaplayer 中停止和播放新歌曲?