Serviceの戻り値 / 強制終了時の再起動

490 views
Skip to first unread message

佐藤佑樹

unread,
Sep 5, 2017, 1:22:27 AM9/5/17
to 日本Androidの会
Serviceが強制終了して再起動するときの条件分岐を行いたいのですがどうすれば実現できるでしょうか?


戻り値を【START_REDELIVER_INTENT;】にしてonStartCommand()で初回起動か再起動かをIntentを見比べて判断すればいいのかなと思ったのですが、
もしサービスが複数ある場合(別々のクラスで定義)だと混同してしまうのでしょうか?
onStartCommand(Intent intent, int flags, int startId) の戻り値を【START_STICKY;】、【START_REDELIVER_INTENT;】どちらが望ましいでしょうか・・

Hirokazu Fukami

unread,
Sep 5, 2017, 1:31:24 AM9/5/17
to 日本Androidの会
こんにちはfkmです。

> もしサービスが複数ある場合(別々のクラスで定義)だと混同してしまうのでしょうか?
これは、どのような状況なのでしょうか?
サービスを起動するためのIntentは、サービス名(クラス名)を指定して起動するものなので
サービスAに、サービスBを起動するためのIntentが渡されることはないはずです。


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

佐藤佑樹

unread,
Sep 5, 2017, 2:14:35 AM9/5/17
to 日本Androidの会
ご返信ありがとうございます。

「システムはサービスを新たにインスタンス化し、サービスの再起動を行います。
再起動時のonStartCommandには、強制終了前と同じ内容のIntentが渡されます。
再起動順序は強制終了前の起動順序と同じです。(A⇒Bで起動した場合、A⇒Bで再起動)
また、startServiceによりサービスを複数回起動していた場合は、起動した回数分
onStartCommandが呼ばれます。」
「startServiceによりサービスを複数回起動していた場合は・・・」とは、
service全般のことではなくて、startServiceで指定したserviceのことを言っているということでしょうか?

2017年9月5日火曜日 14時22分27秒 UTC+9 佐藤佑樹:

Hirokazu Fukami

unread,
Sep 5, 2017, 2:35:23 AM9/5/17
to 日本Androidの会
こんにちはfkmです。

> 「startServiceによりサービスを複数回起動していた場合は・・・」とは、
> service全般のことではなくて、startServiceで指定したserviceのことを言っているということでしょうか?
はい、startServiceで指定したサービスのことです。

試しにボタンをタップするとstartService()を呼ぶコードで3回インテントを投げてみました。
サービスではstopSelf()をあえて呼んでいないので、再起動後に再度インテントが飛んでくるのが確認できます。

V/Service ( 5719): start : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=0 startId=1
V/Service ( 5719): end : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=0 startId=1
V/Service ( 5719): start : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=0 startId=2
V/Service ( 5719): end : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=0 startId=2
V/Service ( 5719): start : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=0 startId=3
V/Service ( 5719): end : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=0 startId=3

// ここでサービスを強制停止

V/Service ( 5806): start : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=1 startId=1
V/Service ( 5806): end : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=1 startId=1
V/Service ( 5806): start : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=1 startId=2
V/Service ( 5806): end : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=1 startId=2
V/Service ( 5806): start : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=1 startId=3
V/Service ( 5806): end : intent=Intent { cmp=com.mokelab.demo.redeliver/.MyService } flags=1 startId=3


佐藤佑樹

unread,
Sep 5, 2017, 2:56:32 AM9/5/17
to 日本Androidの会
詳しくありがとうございます。
因みにこの時の戻り値は【START_REDELIVER_INTENT;】でしょうか?

2017年9月5日火曜日 14時22分27秒 UTC+9 佐藤佑樹:

Hiroshi OHNO

unread,
Sep 5, 2017, 5:01:33 AM9/5/17
to android-g...@googlegroups.com

2017/09/05 午後3:56 "佐藤佑樹" <satoy...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-group-japan@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages