java - 绑定到已经运行的服务
问题描述
这是我的问题:我正在实现一个音乐播放器(PlayerActivity.java / xml),它绑定到一个服务(PlayerService.java),该服务基本上只是一个音乐播放器的实例,因此它可以在后台运行。当离开应用程序或更改活动并重新启动活动时,我想绑定到仍在运行的服务而不停止或重新启动它。我曾尝试仅使用 bindService() 但这让我遇到了问题:在 bindService 之前不调用 startService() ,服务不会被初始化或需要几毫秒,因此在访问服务函数时函数只会为空。这是我的服务类:
public class playerService extends Service {
public boolean running = false;
public MediaPlayer mediaPlayer;
public boolean isPrepared = false;
private String url;
public class serviceBinder extends Binder {
public playerService getService() {
return playerService.this;
}
}
public boolean isRunning(){
return running;
}
private IBinder mBinder = new serviceBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.w("Service", "started");
mediaPlayer = new MediaPlayer();
running = true;
Log.e("!!!", running + "");
return START_STICKY;
}
public void pause() {
mediaPlayer.pause();
}
public void resume() {
mediaPlayer.start();
}
public void setupPlayer() {
try {
if (mediaPlayer != null) {
mediaPlayer.reset();
}
} catch (Exception e) {
Log.e("MediaPlayer", e.getMessage());
}
try {
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
} catch (Exception e) {
Log.e("MediaPlayerToo", e.getMessage());
}
}
public void reset(){
mediaPlayer.reset();
}
public void updateUrl(String url){
this.url = url;
}
public void start(){
mediaPlayer.start();
}
public int getCurrentPosition(){
return mediaPlayer.getCurrentPosition();
}
public int getDuration(){
return mediaPlayer.getDuration();
}
@Override
public void onDestroy() {
super.onDestroy();
mediaPlayer.stop();
mediaPlayer.reset();
}
}
我尝试等待服务以布尔值启动。但是当我在之后添加任何类型的代码时
mService = binder.getService();
startService(intent);
它似乎根本没有被创建。
这也是我的 onServiceConnected 类
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
playerService.serviceBinder binder = (playerService.serviceBinder) service;
Intent intent = new Intent(getApplicationContext(), playerService.class);
mService = binder.getService();
startService(intent);
//... <- adding code here will result in the Service not starting?!!
}
我知道我的问题很混乱,但这是我能想出的最好的解释。如果您有任何想法,我会非常高兴,因为这个问题阻止了我的部署。非常感谢!!