我有Service
我试图绑定到我的主Activity
,但我收到了
java.lang.ClassCastException:无法将android.os.BinderProxy强制转换为com.walintukai.rubix.ConnectionService $ LocalBinder 。
我已在我的清单中声明了该服务。为什么会这样?
明确宣言
<service android:name=".ConnectionService" />
服务(简化代码)
public class ConnectionService extends Service {
static final String TAG = ConnectionService.class.getName();
private BluetoothAdapter mBtAdapter = null;
public BluetoothGatt mBluetoothGatt = null;
private ConnectionServiceEventListener mIRedBearServiceEventListener;
HashMap<String, BluetoothDevice> mDevices = null;
private BluetoothGattCharacteristic txCharc = null;
private final IBinder mBinder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
public ConnectionService getService() {
return ConnectionService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBtAdapter = bluetoothManager.getAdapter();
if (mBtAdapter == null)
return;
if (mDevices == null)
mDevices = new HashMap<String, BluetoothDevice>();
}
@Override
public void onDestroy() {
if (mBluetoothGatt == null)
return;
mBluetoothGatt.close();
mBluetoothGatt = null;
super.onDestroy();
}
}
主要活动
public class MainActivity extends ActionBarActivity {
private ConnectionService service;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("ConnectionService", "Disconnected");
service = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalBinder binder = (LocalBinder) service;
service = (IBinder) binder.getService();
if (service != null) {
Log.i("RedBearService", "Connected");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, ViewPagerFragment.newInstance()).commit();
}
}
@Override
public void onStart() {
super.onStart();
startService();
}
@Override
public void onStop() {
super.onStop();
stopService();
}
private void startService() {
Intent service = new Intent(this, ConnectionService.class);
bindService(service, connection, Context.BIND_AUTO_CREATE);
}
private void stopService() {
unbindService(connection);
}
}
堆栈跟踪
07-30 17:19:39.065: E/AndroidRuntime(20891): java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.walintukai.rubix.ConnectionService$LocalBinder
07-30 17:19:39.065: E/AndroidRuntime(20891): at com.walintukai.rubix.MainActivity$1.onServiceConnected(MainActivity.java:58)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1110)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1127)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.os.Handler.handleCallback(Handler.java:733)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.os.Handler.dispatchMessage(Handler.java:95)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.os.Looper.loop(Looper.java:136)
07-30 17:19:39.065: E/AndroidRuntime(20891): at android.app.ActivityThread.main(ActivityThread.java:5050)
07-30 17:19:39.065: E/AndroidRuntime(20891): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 17:19:39.065: E/AndroidRuntime(20891): at java.lang.reflect.Method.invoke(Method.java:515)
07-30 17:19:39.065: E/AndroidRuntime(20891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
07-30 17:19:39.065: E/AndroidRuntime(20891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
07-30 17:19:39.065: E/AndroidRuntime(20891): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:8)
这个问题已经有几年了,接受的答案对我来说并不适用。自从提出并回答问题以来,Android环境中的某些内容可能已经发生了变化。
但我偶然发现了一个有效的简单解决方案。我在SO上看到了另一个试图启动2个服务的问题,他们遇到了类似的错误(Getting java.lang.ClassCastException: android.os.BinderProxy every time i declare and run two services)。其中一个答案(@Coeffect)提到2个服务不一定在同一个过程中运行。
我认为可能(可能?)在我的情况下,活动和服务是在不同的进程中运行的。所以我将android:process
元素添加到我的活动和服务器中,并修复了它。
以下是 AndroidManifest.xml 的示例。请注意,<activity>
和<service>
标记都包含android:process=":location"
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.byteslinger.locationservice">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:process=":location"
android:allowBackup="true"
android:icon="@mipmap/icon"
android:label="@string/app_name"
android:roundIcon="@mipmap/icon"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:process=":location"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:process=":location"
android:name=".LocationService"
android:enabled="true" />
</application>
</manifest>
答案 1 :(得分:7)
你已经翻了一遍:
public void onServiceConnected(ComponentName name, IBinder service) {
LocalBinder binder = (LocalBinder) service;
service = (IBinder) binder.getService();
...
}
应该是:
public void onServiceConnected(ComponentName name, IBinder service) {
LocalBinder binder = (LocalBinder) service;
MainActivity.this.service = (ConnectionService) binder.getService();
...
}
答案 2 :(得分:0)
我也遇到了这个问题。我的情况就是这样。
我的活动和服务不在同一过程中。
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService"
android:process=":remoute"/>
我想将服务与活动绑定。然后我遇到了同样的问题。我用这种方法解决了。
@Override
public IBinder onBind(Intent arg0) {
int numb = arg0.getIntExtra("numb", 0);
Log.e("WillWolf", "numb-->" + numb);
if(numb == 1) {
Log.e("WillWolf", "local binder");
return new LocalBinder();
} else {
Log.e("WillWolf", "remote binder");
return remoteBinder;
}
}
请注意这一点。多次调用bindService()方法时,默认情况下仅对onBind()调用一次。如果要多次执行onBind(),则应执行此操作。
Intent intent = new Intent(context, MyService.class);
intent.setType("remote");// should be different
context.bindService(intent, coon, Context.BIND_AUTO_CREATE);
希望它能对您有所帮助。