Android 在服务中播放音频时片段中的 MediaController
Android MediaController in Fragment while audio is playing in Service
我有一个 Activity 使用片段来显示各种屏幕。其中一个屏幕用于播放音频文件。当用户选择要播放的音频文件时,我会启动一个服务并在该服务上播放音频,这样即使用户 returns 回到主屏幕,音频也会继续在后台播放。
我的问题是这样的。我如何在片段中使用 MediaController 来反映服务中发生的事情,这样我就不必重新发明 MediaController 的所有控件?
我可以在我的片段中创建 MediaController 并显示它,但是 mMediaController.setMediaPlayer(this);将控制器设置为我的片段,对吗?如何让它设置为我的服务?
让你的 Service
实施 MediaPlayerControl
,例如...
public class MyMusicService extends Service
implements MediaPlayerControl {
...
// Override the various `MediaPLayerControl` methods
}
现在,为了让您的 Fragment
使用 MediaPlayerControl
,它必须绑定到 Service
。将以下内容添加到 Service
...
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
public MyMusicService getService() {
return MyMusicService.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
现在您需要在 Fragment
代码中添加绑定到 Service
的功能 -注意,我只使用Activity
但理论与 Fragment
相同。在您的 Fragment
代码中添加 ServiceConnection
...
MyMusicService mService = null;
boolean mBound;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
mBound = false;
}
};
您可以在 onResume()
中绑定到您的 Service
并在 Fragment
的 onPause()
中解除绑定,如果您将以下内容添加到您的 Fragment
您可以将 MediaController
设置为 Service
...
public void showMediaControllerHere() {
if (mBound){
controller.setMediaPlayer(mService);
controller.setEnabled(true);
controller.show();
}
}
我有一个 Activity 使用片段来显示各种屏幕。其中一个屏幕用于播放音频文件。当用户选择要播放的音频文件时,我会启动一个服务并在该服务上播放音频,这样即使用户 returns 回到主屏幕,音频也会继续在后台播放。
我的问题是这样的。我如何在片段中使用 MediaController 来反映服务中发生的事情,这样我就不必重新发明 MediaController 的所有控件?
我可以在我的片段中创建 MediaController 并显示它,但是 mMediaController.setMediaPlayer(this);将控制器设置为我的片段,对吗?如何让它设置为我的服务?
让你的 Service
实施 MediaPlayerControl
,例如...
public class MyMusicService extends Service
implements MediaPlayerControl {
...
// Override the various `MediaPLayerControl` methods
}
现在,为了让您的 Fragment
使用 MediaPlayerControl
,它必须绑定到 Service
。将以下内容添加到 Service
...
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
public MyMusicService getService() {
return MyMusicService.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
现在您需要在 Fragment
代码中添加绑定到 Service
的功能 -注意,我只使用Activity
但理论与 Fragment
相同。在您的 Fragment
代码中添加 ServiceConnection
...
MyMusicService mService = null;
boolean mBound;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
mBound = false;
}
};
您可以在 onResume()
中绑定到您的 Service
并在 Fragment
的 onPause()
中解除绑定,如果您将以下内容添加到您的 Fragment
您可以将 MediaController
设置为 Service
...
public void showMediaControllerHere() {
if (mBound){
controller.setMediaPlayer(mService);
controller.setEnabled(true);
controller.show();
}
}