2012-10-02 4 views
1

Привет, у меня есть следующая проблема.Android service bind problem

Файл манифеста выглядит следующим образом.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.someCo.test" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <uses-feature android:name="android.hardware.location.network" /> 
    <uses-feature android:name="android.hardware.location.gps" /> 
    <uses-feature android:name="android.hardware.wifi" /> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > 
     <service android:name = ".BackgroundService" android:exported="true" /> 
    </application> 

</manifest> 

У моей Activity's onCreate есть следующая строка кода.

this.context.startService(new Intent(this.context, com.someCo.test.BackgroundService.class)); 
     this.context.bindService(new Intent(this.context, com.someCo.test.BackgroundService.class), serviceConnection, Context.BIND_AUTO_CREATE); 

У моей деятельности также есть следующий частный класс.

private ServiceConnection serviceConnection = new ServiceConnection() { 

     public static final String TAG = "Service Connection Class"; 

      public void onServiceConnected(ComponentName className, IBinder service) { 

       try { 
       com.someCo.test.BackgroundService.MyBinder binder = (com.someCo.test.BackgroundService.MyBinder)service; 
       backgroundService = binder.getService(); 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


      //backgroundService = ((BackgroundService.MyBinder) service).getService(); 

      //Toast.makeText(context,"service connected", Toast.LENGTH_LONG); 
      Log.i(TAG, "onServiceConnected"); 


      } 


      //@Override 
      public void onServiceDisconnected(ComponentName className) { 
      backgroundService = null; 
      } 
     }; 

У меня есть следующее.

private final IBinder binder = new MyBinder(); 

public class MyBinder extends Binder{ 

    private static final String TAG = "MyBinder"; 


    BackgroundService getService(){ 
     Log.i(TAG, "get service"); 
     return BackgroundService.this; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    Log.i(TAG, "onBind destroyed"); 
    return binder; 

} 

@Override 
public boolean onUnbind(Intent intent) { 
    Log.i(TAG, "onUnbind destroyed"); 
    return super.onUnbind(intent); 
} 

В этой строке я получаю исключение под кодом.

(com.someCo.test.BackgroundService.MyBinder)service; 
        backgroundService = binder.getService(); 

java.lang.classCastException: android.os.BinderProxy.

Может кто-то любезно указать мне на мою ошибку, я не могу понять это. Пожалуйста, простите очень подробный код, поскольку я пытался как можно более явным образом отладить эту проблему.

Спасибо,

ответ

1

Я не знаю, почему вы написали код для запуска службы с использованием как путь (StartService и BindService)?

Адрес example for the Bind Service. вы можете ссылаться на этот блог.

0

Я несколько раз пробовал эту штуку самостоятельно. Но по моему опыту, если вам просто нужно связать службу, чтобы получить некоторые данные из службы, нет необходимости делать это.

Просто используйте localbroadcastmanager. Достаточно отправить данные из службы в приложение. Это довольно легко, безопасно, менее подвержено утечке памяти.

+0

Благодарим вас за ответ. Однако мне нужно выставить некоторые методы из службы. Благодарю вас. – DoubleDunk