2012-10-02 99 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> 

我的Activity的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); 

我的Activity还具有以下私有类。

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