Serviceを使ったバックグラウンド処理が強制終了する

774 views
Skip to first unread message

高橋士郎

unread,
Apr 30, 2014, 1:01:00 PM4/30/14
to android-g...@googlegroups.com
現在、Serviceを使って、時間のかかる処理をバックグラウンドで行うことを考えています。
しかし、ある程度の時間が経過するとプロセスがキルされる状況に悩んでいます。

いろいろ調べてみて、startForegroundでキルされないように設定しましたが、
それでもやはりキルされます。
以下、Service内のonStartCommand部分の抜き出しです。
bindはしていません。
どなたかご存じの方、お願いいたします。

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
          //時間のかかる処理
      Message msg = mServiceHandler.obtainMessage();
      msg.arg1 = startId;
      mServiceHandler.sendMessage(msg); 
     
              //フォアグラウンド処理
       Notification notification = new Notification(R.drawable.icon, 
     getString(R.string.app_name), 
     System.currentTimeMillis());

     Intent t_intent = new Intent(this, Target.class);

     t_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
     PendingIntent intents = PendingIntent.getActivity(this, 0,
     t_intent,0);
     notification.setLatestEventInfo(this, 
     getString(R.string.app_name), 
     getString(R.string.app_name), intents);
     notification.flags = Notification.FLAG_ONGOING_EVENT;

     startForeground(1, notification);
     // If we get killed, after returning from here, restart
     return START_STICKY;
 }

安藤玲生

unread,
Apr 30, 2014, 8:47:49 PM4/30/14
to android-g...@googlegroups.com
レオです。
時間のかかる処理は IntentServiceというクラスの onHandleIntent内で処理したほうがいいです。
onHandleIntent内は別スレッドで動きます。
--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。


-- 
-- 
.                 \\\///
.               /        \
.               | \\   // |
.             ( | (.) (.) |)
----------o00o--(_)--o00o-----------------

Mail: android....@gmail.com

-----------ooo0-------------------------------
.           (   )   0ooo
.            \ (      (   )
.             \_)     ) /
.                    (_/
-- 

Hiroaki GOTO as GORRY

unread,
Apr 30, 2014, 9:49:06 PM4/30/14
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

Serviceがkillさせられるということそのものについて、
いくつかの情報提供があると、より原因を掴みやすくなります。

・「時間のかかる処理」「killされるまでの時間」が具体的にどのくらいか
・Serviceがkillさせられるときのlogcat
・Serviceがkillさせられるときのプロセスやメモリの状況
・動作させている機種(OSバージョンとメモリ容量が特に重要)

基本的に、メモリが逼迫したときに「ユーザーやOSとの関わりが
少なくなっているプロセス」から順にkillさせられます。
Serviceが動いているプロセスはこのときに比較的killされにくいように
調整されるものの、やはりkillの対象となります。

対処療法ですが、たとえばAlarmManagerで一定期間ごとにServiceを
つついてやることで、「ユーザーやOSとの関わりが少なくなる」ことを
ある程度防ぐことができます。



In message <fb5307f7-560d-477d...@googlegroups.com>
"[android-group-japan: 26968] Serviceを使ったバックグラウンド処理が強制終了する"
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

Michiteru Kodama

unread,
May 1, 2014, 2:29:35 AM5/1/14
to android-g...@googlegroups.com
やった事は無いのですが。bindしておけば良いのではないでしょうか。
実は私も、Notifyをスライドして外すとTimerが止まる奇妙な現象に悩んでいるのでやってみようかと。

ソフトウェア技術ドキュメントを勝手に翻訳

安藤玲生

unread,
May 1, 2014, 2:38:59 AM5/1/14
to android-g...@googlegroups.com
レオです。
???

intentService使えば問題解決するんじゃないですか?
--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。

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


-- 
-- 
.                 \\\///
.               /        \
.               | \\   // |
.             ( | (.) (.) |)
----------o00o--(_)--o00o-----------------

Mail: android....@gmail.com

高橋士郎

unread,
May 1, 2014, 2:42:18 AM5/1/14
to android-g...@googlegroups.com

皆さん、ご返信頂きありがとうございます。

確かに
今、調べてみましたところ、intentserviceを使えば、bindもしてくれるようですね。
ありがとうございます。
ちなみに、これにはstartforegroundは必要ないという理解でよろしいでしょうか?

是非、試してみたいと思います。

2014/05/01 15:39 "安藤玲生" <android....@gmail.com>:

Michiteru Kodama

unread,
May 1, 2014, 2:43:03 AM5/1/14
to android-g...@googlegroups.com
ありがとうございます。やってみます。

Shigeo Mutoh

unread,
May 1, 2014, 5:14:15 AM5/1/14
to android-g...@googlegroups.com
武藤です。

そもそも、強制終了(例外が捕獲されなくてプロセスが死んだ)した原因
を知る必要があります。

IntentServiceを使うべきか、startForeground()により常駐すべきか否かは
処理したいことの性質や要件により決定されるべきですから、それに
ついては高橋さんがデザインするものであって、私たちは知りません。

では。

Shigeo Mutoh

unread,
May 1, 2014, 5:22:12 AM5/1/14
to android-g...@googlegroups.com
武藤です。

間違えました。

(14/5/1 18:14), Shigeo Mutoh wrote:
> そもそも、強制終了(例外が捕獲されなくてプロセスが死んだ)した原因

プロセス内部から上がった例外が捕獲されなくて死ぬケースと、
ServiceがOSから邪魔だといって殺されるケースがあるので、少なくとも
そのどちらのケースで死んだかは知る必要があります。

ようするにlogcatをよく見るってことです。

では。

高橋士郎

unread,
May 1, 2014, 5:22:02 AM5/1/14
to android-g...@googlegroups.com

武藤さま

言葉足らずで申し訳ありません。

startforegroundが必要かどうかについて、伺っていましたが、
意図としてはintentserviceがserviceを拡張したものとのこと、また検索したところstartforegroundの設定する記載が見つからなかったことから、
既にstartforegroundがintentserviceに実装されているのでしょうか?という思いで伺いました。

処理上、必要かどうかについては、当然、私が判断すべきと考えていますので、頂いたご意見を踏まえて、実装したいと思います。

ありがとうございました。

2014/05/01 18:14 "Shigeo Mutoh" <tmh...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
Reply all
Reply to author
Forward
0 new messages