Service で Message に Bundle をセットして handleMessage する
Service から Activity に、Bundle でデータを渡す。
Bundle をメッセージに詰める場合、取り出す時は、いったんParcelable にキャストしてから、Bundle にキャストする、という手順を踏まないと、とうまくいかない。理屈は調べておらずわかりません・・・。
receiveParcelインターフェイスを実装済みとする。
Bundle state = new Bundle(); state.putInt("hoge", 77); // メッセージ送信 handler.sendMessage(handler.obtainMessage(TRACKING_MESSAGE, state));
private Handler handler = new Handler() { // 送られてきたメッセージを順に処理する @Override public void handleMessage(Message handledMsg) { // 処理対象フィルタ if (handledMsg.what == MY_MESSAGE) { // コールバックコール準備 int numListeners = listeners.beginBroadcast(); for (int i = 0; i < numListeners; i++) { try { // サービスからコールバックでアクティビティにメッセージを送信する /* * このやり方だと getInt を書くと null になり動かない Bundle bundle = (Bundle)handledMsg.obj; Log.i(TAG, "lat:" + bundle.getInt("hoge")); */ // いったん Parcelable にキャスト Parcelable bundle = (Parcelable)handledMsg.obj; // Bundle にキャスト。これならうまくいく。 int myHoge = ((Bundle) bundle).getInt("hoge"); Hoge hoge = new Hoge(myHoge); listeners.getBroadcastItem(i).receiveParcel(myHoge); } catch (RemoteException e) { Log.e("CallbackService", e.getMessage(), e); } } // コールバックコール終了 listeners.finishBroadcast(); } else { super.dispatchMessage(handledMsg); } } };
※内容としては全然関係無いエントリーなのですけれど、こちら↓のソースを見ているときに上記デバッグ方法がわかりました。感謝。
http://d.hatena.ne.jp/Kazzz/20101112/p1