2012-04-30 8 views
1

カスタムサービスにバインドしようとしましたが、成功しませんでした。ResultReceiverサブクラスを正しくサービスに送信する方法は?

マイカスタムサービス

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) { 
     //... 
    } 

    //... 
} 

スタックトレース(不完全)

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][email protected] 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) 
[...] 

活性の

要するに、私が "受信機" キーを用いてサービスにCustomReceiverResultReceiverサブクラス)のインスタンスを渡します。しかし、このオブジェクトを回復しようとすると、サービスでClassCastExceptionが発生します。どうして?これをどうすれば解決できますか?

私は、APIレベル8

をターゲットにしていると私は他のSOの質問のいずれかで、この動作を見つけることができません。

答えて

2

私は自分のコードをチェックしました。この私が何をすべきかであるとIntentから受信機を取得する場合、私は(私のServiceClassCastExceptionを得ることはありません鉱山でもある

public class CustomService extends Service { 
    private ResultReceiver mReceiver; 
    ... 
} 

...次のようにベースResultReceiverとしてあなたServicemReceiverを宣言してみてくださいカスタムResultReceiver)。

+0

ありがとう!それは完璧に働いた。 – borges

+0

@borges - どのようにコールバックを送信しますか? onReceiveResult()メソッドは保護されており、CustomReceiverクラスから直接呼び出すことはできません。 – Borys

+0

これを行うと、実際のCustomRecieverオブジェクトが失われてしまいますが、現在はResulRecieverベースを使用していますか? – jonney

0

BroadcastReceiverは、デフォルトではParcelableではありません。したがって、ClassCastExceptionを取得すると予想されます。特定のインスタンスを渡す必要がある場合は、SetterメソッドをServiceに追加してから、そのメソッドをそのServiceConnection実装から呼び出す必要があります。

+0

あなたのソリューションが動作しているようにも思います。しかし、私は 'ResultReceiver'を継承しています(これは[documentation](http://developer.android.com/reference/android/os/ResultReceiver.html)によるとParcelableです)であり、' BroadcastReceiver'ではありません。 – borges

+0

@borges:ちょうど確認する - はい、あなたは 'Intent'でパーサブルな余分なものとして' ResultReceiver'を渡すことができます - 私はそれを自分で行います。あなたの質問に対する答えが何であるか分かりません。 – Squonk

0

私はClassCastExceptionとまったく同じ問題を抱えていましたが、私には分かりませんでした。 mReceiverCustomReceiverの代わりにResultReceiverを使用するように設定したところ、私はこの回答を見ました。私はそれをして、同じエラーをまだ持っていましたが、私はimportステートメントが同じではなかったことに気付きました。私のMainActivityで

私は文をインポート:

私は文を輸入していた私のサービスでしかし
import android.support.v4.os.ResultReceiver; 

import android.os.ResultReceiver; 

私は私のサービスと私のMainActivityに、私は次のように使用を確認しました:

import android.support.v4.os.ResultReceiver; 

これで正常に動作します。これが誰かを助けることを願って!

は、私は(私はまだテストができませんでしたが)数年後半..

関連する問題