AlarmManager で Parcelable ではないオブジェクトを受け渡したいとき
- 2017年05月08日
- Android, Java
- AlarmManager, Parcelable, Serializable
AlarmManager では Serializable のオブジェクトは渡せない
Android の Activity 間では Intent には bundle.putSerializable
や bundle.getSerializable
を使ってシリアライズ可能なオブジェクトを受け渡しできます。
しかしこれと同じ感覚で AlarmManager に投げてもレシーバー側で受け取れません。
AlarmManager では Parcelable なオブジェクトでしか扱ってくれません。そこで Serializable なオブジェクトを byte[] に変換して受け渡します。
送り側
送信したいオブジェクトが data だとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = null; byte[] bytes = null; try { out = new ObjectOutputStream(bos); out.writeObject(data); out.flush(); bytes = bos.toByteArray(); intent.putExtra("data", bytes); } catch (IOException e) { e.printStackTrace(); } finally { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); |
受信側
受け取る BroadcastReceiver では以下のように取り出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
byte[] bytes = intent.getByteArrayExtra("data"); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInput in = null; try { in = new ObjectInputStream(bis); data = (Data) in.readObject(); //data が Data 型のクラスの場合 } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); data = null; } } |
Parcelable インターフェースを実装したくないときはこの方法で回避できるかもしれません。
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。