我正在编写一个简单的音乐播放器,并创建了一个播放服务,它实现了一个 AIDL 接口以与客户端绑定,一个是简单的曲目浏览器,另一个是更简单的播放器活动。服务控制 MediaPlayer 对象,而这两个活动使用 ServiceConnections 来获取到服务的连接。
这包含在两个活动的 onStart() 方法中:
@Override
public void onStart()
{
super.onStart();
Intent i = new Intent(this, PureService.class);
startService(i);
bindService(i, mConnection, 0);
}
我这样做是为了使服务在解除绑定后不会立即停止。当然,这实际上并不是问题,因为我的活动根本拒绝与服务解除绑定。每当我的应用程序在这些活动中的任何一个中到达 unbindService 时,unbindService 每次都会抛出 IllegalArgumentException,无一例外(呵呵)。
在 onStop 方法中:
@Override
public void onStop()
{
super.onStop();
if (mBound) {
try {
unbindService(mConnection);
} catch (java.lang.IllegalArgumentException e)
{
//Print to log or make toast that it failed
}
}
mBound = false;
}
我想知道的是:
- 我应该在 onStop() 方法中调用 unbindService() 吗?还是根本没有?
- 我正确地调用它吗?
- 我应该知道的启动/绑定服务的方式有什么特别之处吗?
- 我在做一些完全、完全错误的事情吗?我是 android 编程的新手,所以这当然不是不可能的。
提前致谢。
编辑:这里是 ServiceConnection 覆盖
public void onServiceConnected(ComponentName className, IBinder service) {
mBound = true;
mService = IPureService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
玩家活动中有一些额外的代码,但它与绑定本身无关。