0

ResultReceiver を使用して、サービスがデータをアクティビティに渡すことができるようにしています。IPC 経由で送信されたインテントの比較で問題が発生しています。オブジェクトが変更されているように見えるため、標準のハッシュコード (.equals) 比較を使用して比較することはできません。シナリオを再現するサンプル コードをいくつか作成しました。

MyActivity.java:

public class MyActivity extends Activity {

    private final Handler mHandler = new Handler();
    private Intent serviceIntent;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MyReceiver receiver = new MyReceiver(mHandler);
        serviceIntent = new Intent(this, MyService.class);
        serviceIntent.putExtra("receiver", receiver);
        startService(serviceIntent);
    }

    public class MyReceiver extends ResultReceiver {

        public MyReceiver(Handler handler) {
            super(handler);
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            Intent intent = resultData.getParcelable("intent");
            if(intent.equals(serviceIntent)) {
                Log.d("TEST", "Same intent!");
            } else {
                Log.d("TEST", "Different intents!");
            }
        }

    }

}

MyService.java

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ResultReceiver receiver = intent.getExtras().getParcelable("receiver");
        Bundle b = new Bundle();
        b.putParcelable("intent", intent);
        receiver.send(100, b);
        stopSelf();
        return Service.START_NOT_STICKY;
    }

}

これを実行する場合は、サービスをマニフェストに登録することを忘れないでください。

したがって、意図は前後に送信され、プロセスに変更は加えられませんが、私の活動では、2 つの参照が異なると主張しています。何が起きてる?

4

1 に答える 1