IntentServiceの数値を途中から引っ張ってくる場合

339 views
Skip to first unread message

龍一

unread,
Feb 25, 2014, 1:01:34 AM2/25/14
to android-g...@googlegroups.com
IntentServiceを利用して、メインのアクティビティとは別に処理をさせています。

そのIntentServiceを継承したクラスには、intent.putExtra などで値を渡していますが、

そのIntentServiceから別のアクティビティが値を受け取る場合にはどうするのが一番最適でしょうか?

また別のアクティビティから、IntentServiceの処理の途中で値を渡す場合にはどうすればいいでしょうか?

kenji matsuoka

unread,
Feb 25, 2014, 1:21:46 AM2/25/14
to android-g...@googlegroups.com
いくつかの方法がありますが、呼び出し元の数や頻度等によって異なってきます。
手っ取り早いのはIntentでのやりとりです。

Activity側でBroadcastReceiverを登録しておいてそこにIntentを投げてやれば情報が送信できます。
送信元が多く頻度が少ない場合はこちらオススメ

あとはServiceクラスにしてActivity側からServiceをBindして上げるとか有りますが少々ロジックが複雑になりがちです。
送信元が少なく頻度が多い場合はこちらオススメ

2014年2月25日火曜日 15時01分34秒 UTC+9 龍一:

龍一

unread,
Feb 25, 2014, 1:34:03 AM2/25/14
to android-g...@googlegroups.com
intent でやりとりをする場合は、Service の途中でもやりとりは可能なのでしょうか?

kenji matsuoka

unread,
Feb 25, 2014, 1:53:27 AM2/25/14
to android-g...@googlegroups.com
大丈夫ですよー new Intent(<アクション名>)で作ったIntentを
StartActivityではなくsendBroadcastでIntentを送出してActivityはBroadcastReceiverで受信して下さい

BroadcastReceiverを使わないとスレッドが変わった場合に呼び出せなくなるので注意して下さい。

2014年2月25日火曜日 15時34分03秒 UTC+9 龍一:
intent でやりとりをする場合は、Service の途中でもやりとりは可能なのでしょうか?

龍一

unread,
Feb 25, 2014, 2:37:39 AM2/25/14
to android-g...@googlegroups.com
たとえば、

Activity1 → Activity2 で遷移するとして、

Activity1で startService させた IntentServiceクラス を、

Activity2 で利用するにはどうしたらいいでしょう?

遷移するときにintentを利用して IntentService オブジェクトを渡すのでしょうか?

noxi

unread,
Feb 25, 2014, 2:57:42 AM2/25/14
to android-g...@googlegroups.com
noxiです。

kenji matsuokaさんの案をベースにするならば

1.Activity1でstartService
2.Activity2でBroadcastReceiverをregirsterReceiver
3.IntentServiceからBroadcast Intentを発行しActivity2に通知

となります。Serviceオブジェクトを渡す、という発想自体が誤りです。

ただしこれでも考えなければならないことがあり
例えばActivity2でReceiver登録するよりも前にIntentServiceの処理が終わってしまった場合
IntentServiceから通知を発行しても、Activity2にはReceiverが存在しないため
通知を受け取ることが出来ません。


2014年2月25日 16:37 龍一 <kirin...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

龍一

unread,
Feb 25, 2014, 3:26:07 AM2/25/14
to android-g...@googlegroups.com, android.w...@gmail.com
イメージ的には、こういう事でしょうか?

Activity1 (←独立している)
Activity2 (←独立している)
IntentService (←Activity1から起動されたが独立している)
BroadcastReceiverを実装したクラス (←独立している)

IntentServiceさんは、何かの作業がおわったらBroadcastReceiver君になんか渡す

BroadcastReceiver君は、受けっとった時の指示を与えられていて、それにしたがってActivity2さんとかと仲良くしたりする。

kenji matsuoka

unread,
Feb 25, 2014, 11:42:40 PM2/25/14
to android-g...@googlegroups.com, android.w...@gmail.com
Activity1 (←独立している)
Activity2 (←独立している)
Service (←Activity1から起動されたが独立している)
BroadcastReceiverを実装したクラスのインスタンス1 (←Activity1が保持する)
BroadcastReceiverを実装したクラスのインスタンス2 (←Activity2が保持する)
こんな感じです。
ServiceがIntentをBroadcastしたらBroadcastReceiverのいずれかが受け取ってそれぞれを保持するActivityに処理を渡す感じです
Serviceが終了した場合Activityでは情報を受け取れないという問題は残ります。
その場合の解決策としては、サービスがいない場合、再起動するようにするとか、サービスが終了時にデータを永続化するとかの方法があります。

2014年2月25日火曜日 17時26分07秒 UTC+9 龍一:

龍一

unread,
Feb 26, 2014, 12:47:13 AM2/26/14
to android-g...@googlegroups.com, android.w...@gmail.com
基本的なことですいません、

ServiceがIntentをBroadcastしたら

とありますが、Broadcast とは大雑把にいうと 「Aという行動があったら俺に任せろ、Aという行動に合わせたBという行動を起こすぜ」 という理解でいいのでしょうか?

それとも 「Service とやりとりしたいんなら俺を通しな」 という理解でしょうか?

kenji matsuoka

unread,
Feb 26, 2014, 4:34:17 AM2/26/14
to android-g...@googlegroups.com, android.w...@gmail.com
Broadcast=放送
という名の通り、送信側が受信側を特定せずに、誰かこのIntentを処理して−と広く問いかけ
BroadcastReceiver(放送受信者)がそのIntentを受け取って処理を行う感じです。

2014年2月26日水曜日 14時47分13秒 UTC+9 龍一:

Makoto Yamazaki

unread,
Feb 26, 2014, 4:48:38 AM2/26/14
to android-g...@googlegroups.com, android.w...@gmail.com
zaki です。

BroadcastReceiver の onReceive は必ず UI スレッド(Main Looper)から呼ばれるので、
IntentService の worker になにか渡したいのであれば結局スレッド間でどう連携するかは
考える必要があります。

このような処理が必要になるのは IntentService の守備範囲を超えているように思うので
素直にService を継承したクラスで頑張って実装したほうがいいように思います。


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
YAMAZAKI Makoto

Makoto Yamazaki

unread,
Feb 26, 2014, 4:57:21 AM2/26/14
to android-g...@googlegroups.com, android.w...@gmail.com
zaki です。

あ、念のため

松岡さんが説明してくれているのは
そのIntentServiceから別のアクティビティが値を受け取る場合にはどうするのが一番最適でしょうか?
の方で、

私の話は
「また別のアクティビティから、IntentServiceの処理の途中で値を渡す場合にはどうすればいいでしょうか?」
のほうです。
--
YAMAZAKI Makoto

kenji matsuoka

unread,
Feb 26, 2014, 5:40:47 AM2/26/14
to android-g...@googlegroups.com, android.w...@gmail.com
すいません、私も途中で話がずれていました。
複数のActivityで共有する場合はIntentServiceではなくServiceで実装した方がいいと思います。
Service実装の前提で書いていました。

2014年2月26日水曜日 18時57分21秒 UTC+9 zaki:
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
YAMAZAKI Makoto



--
YAMAZAKI Makoto

龍一

unread,
Feb 28, 2014, 1:37:56 AM2/28/14
to android-g...@googlegroups.com, android.w...@gmail.com
ありがとうございます、Serviceに切り替えて、もう一度プログラムを組んでみようと思います。
Reply all
Reply to author
Forward
0 new messages