我正在尝试绑定到自定义服务但没有成功。
我的自定义服务
public class CustomService extends Service {
private CustomReceiver mReceiver;
private final CustomBinder mBinder = new CustomBinder();
public class CustomBinder extends Binder implements ICustomService {
// Implementation of the interface
}
public interface ICustomService {
// Public interface to comunicate to the service
}
@Override
public IBinder onBind(Intent intent) {
Log.d("customservice", "Service bound.");
mReceiver = intent.getParcelableExtra("receiver"); // ERROR HERE!
return mBinder;
}
// Other methods
我的自定义接收器
public class CustomReceiver extends ResultReceiver {
public interface IReceiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
private IReceiver mReceiver;
public CustomReceiver(Handler handler) {
super(handler);
}
public void setReceiver(IReceiver receiver) {
mReceiver = receiver;
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}
我的活动
public class MainActivity extends Activity implements CustomReceiver.IReceiver {
IRegressiveService mService;
CustomReceiver mReceiver;
boolean mBound = false;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mService = (ICustomService) service;
mBound = true;
}
public void onServiceDisconnected(ComponentName name) {
mBound = false;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
//...
mReceiver = new CustomReceiver(new Handler());
mReceiver.setReceiver(this);
Intent bindServiceIntent = new Intent(this, CustomService.class);
bindServiceIntent.putExtra("receiver", mReceiver);
bindService(bindServiceIntent, mConnection, Context.BIND_AUTO_CREATE);
}
public void onReceiveResult(int resultCode, Bundle resultData) {
//...
}
//...
}
Stacktrace(不完整)
04-29 20:23:55.851: E/AndroidRuntime(690): FATAL EXCEPTION: main
04-29 20:23:55.851: E/AndroidRuntime(690): java.lang.RuntimeException: Unable to bind to service [package].CustomService@44f38cd8 with Intent { cmp=[package].CustomService (has extras) }: java.lang.ClassCastException: android.os.ResultReceiver
04-29 20:23:55.851: E/AndroidRuntime(690): at android.app.ActivityThread.handleBindService(ActivityThread.java:2996)
[...]
04-29 20:23:55.851: E/AndroidRuntime(690): Caused by: java.lang.ClassCastException: android.os.ResultReceiver
04-29 20:23:55.851: E/AndroidRuntime(690): at [package].CustomService.onBind(CustomService.java:37)
04-29 20:23:55.851: E/AndroidRuntime(690): at android.app.ActivityThread.handleBindService(ActivityThread.java:2983)
[...]
简而言之
在Activity中,我使用" receiver"将CustomReceiver
(一个ResultReceiver
子类)的实例传递给服务。键。但是当我尝试恢复此对象时,在服务中,ClassCastException
被引发。为什么?我该如何解决这个问题?
我的目标是API级别8。
我在其他任何SO问题中都找不到这种行为。
答案 0 :(得分:2)
我刚检查了我的代码。尝试在mReceiver
作为基础Service
声明ResultReceiver
,如下所示......
public class CustomService extends Service {
private ResultReceiver mReceiver;
...
}
这就是我的工作,当我从ClassCastException
获取接收器时,Service
中没有Intent
(我的也是自定义ResultReceiver
)
答案 1 :(得分:0)
BroadcastReceiver
(默认情况下)不是Parcelable
。所以你期望得到一个ClassCastException。如果需要传递特定实例,请向服务添加setter方法,然后使用该对象从ServiceConnection实现中调用该方法。
答案 2 :(得分:0)
我与ClassCastException
有完全相同的问题,这对我没有任何意义。我在这里看到了关于将mReceiver
设置为仅使用ResultReceiver
而不是服务中的CustomReceiver
的答案。我做到了但仍然遇到了同样的错误,但我注意到我的import
语句不一样。
在我的MainActivity中,我导入了声明:
import android.support.v4.os.ResultReceiver;
然而,在我的服务中,我导入了声明:
import android.os.ResultReceiver;
我确保在我的服务和我使用的MainActivity中使用了以下内容:
import android.support.v4.os.ResultReceiver;
它现在正常运作!希望这有助于某人!
我也迟到了几年..