如何在 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?中提到了其他解决方案。
我想在我的应用程序后台播放音乐:
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?中提到了其他解决方案。