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 つの参照が異なると主張しています。何が起きてる?