質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

4792閲覧

常駐処理が落ちてしまう原因がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

3クリップ

投稿2018/01/26 02:10

定期的(1分間隔くらい)にバックグラウンドで動作し続けるアプリを作っています。
イメージとしては、
スタートボタンを押すと定期処理が開始され、
ストップボタンを押すと終了します。
理想としては、永続的に動作し続けるアプリです。

しかし、現状では放置して5~6時間ほどで落ちてしまいます。

・落ちた後にlogcatを見ていますが例外等のエラー系メッセージは出ていません。例外もUncaughtExceptionHandlerを拡張しているので、キャッチ漏れはないはずです。
・定期処理は、AlarmManagerとBroadcast+Serviceで回しています。
・上記のようなアプリは推奨されていないのはわかっていますが、今回は個人向けの開発ではないため、バッテリー等を考える必要はありません。
・テストしている環境は、Android4.3の実機です。そのため、Android8あたりからあるバックグラウンド制限などはないはずです。
・メモリーは50%ほどフリーなので大丈夫だと思っていますし、メモリリークは起こっていないと思われます。
・落ちるのは毎回同じような時間です。例えば、18時に放置して、23時くらいに毎回落ちています。
・以下のようなGCログが1分ごとくらいに出ているのですが、落ちている時はちょうどこのGCログが出るようなタイミングでした。
D/dalvikvm: GC_FOR_ALLOC freed 1990K, 40% free 4284K/7092K, paused 81ms, total 99ms
・端末をPCから接続せずにテストする必要もあるので、現状は大部分のログをDBに書き出しています。そのためDB負荷は高いです。これによるエラー落ちは結構ありますが、DB関連はすべて例外対応をしています。5時間で3万強の行数が保存されます。

以上のような状況から、落ちてしまう可能性として考えられるのは何でしょうか?
これはOSから落とされていると考えて良いのでしょうか?
また、今後の対策などがあれば教えてください。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

曖昧な回答で恐縮です。

恐らくですが、OS側の判断でサービスがkillされているのではないでしょうか。

過去に私が担当した案件では、どこかで読んだ記事を参考に
以下の様にServiceにNotificationをForegroundで実行させることで、
複数日数経過してもOSからkillされなくなりました。

Java

1 Notification notification = new Notification.Builder(this) 2 .setSmallIcon(R.drawable.ic_stat_notice) 3 .setContentTitle(getString(R.string.app_name)) 4 .setContentText(getString(R.string.msg_service_working)) 5 .setContentIntent(pendingIntent) 6 .build(); 7 startForeground(startId, notification);

お役に立てれば幸いです。。。

投稿2018/01/26 03:40

monagano

総合スコア246

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/26 04:43

ご回答ありがとうございます。 やはりOSっぽいですよね。 startForegroundはまだ試していませんでしたので、 さっそく、ServiceのonStartCommandに組み込んで様子を見てみます。
退会済みユーザー

退会済みユーザー

2018/01/30 01:21

試してみましたが、残念ながら途中で落ちていました。 ただ、いつもより長持ちしたのは確かです。 現状は古いメモリの少ない機種で、高負荷状態でやっていたので、少し条件を緩めてやってみようと思います。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/01/31 00:12

追記。無事1日以上稼働させることができました。 テスト端末は、メモリ1GBの古い機種で、 ログをほぼすべてDBに書き出すという過酷な状況で動かしていたので、 Foregroundでも落とされていたっぽいです。 ログをDBに出す処理をなくしたら動いていたのと、メモリが多い機種では大丈夫でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問