2012-10-02 2 views
1

안녕하세요. 커뮤니티 다음과 같은 문제가 있습니다.Android 서비스 바인드 문제

내 매니페스트 파일은 다음과 같습니다.

<?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> 

내 활동의 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