【手順を丁寧に解説】Androidアプリ開発でバックグラウンド処理がでネットワークエラーになるとき解決方法

Featured image of the post

はじめに

Androidアプリ開発をしていて、バックグラウンド処理の一部が動かないことがあった💦

しかも調べても原因がなかなかヒットせずに困った…😰

色々試して無事に原因を特定できたので解決方法をまとめる💡

結論

✅現象  :バックグラウンド処理が一部動かない💦

✅原因  :バッテリーセーバーの影響で、勝手にオフライン扱いされてしまっていた。

✅解決方法:ユーザーに「モバイルデータの無制限利用」を許可してもらう。

問題点

やりたいこと

バックグラウンドで15分に1回APIを叩いて最新のデータを取得したい。

💡
具体的には…

ウィジェットノートというアプリを開発していて、ウィジェットに表示するデータを15分に1回更新したかった。

Image in a image block

発生した問題

✅バックグラウンド処理(最新データの取得)でネットワークエラーが発生する。

現象が出る条件

この条件を特定するのに時間がかかった…💦

Wi-Fiを切っている

✅これは機種によるかもしれないが、Wi-Fiに繋ぐと正常に動作した。

スマホの設定でバッテリーセーバーをONにしている

バッテリーセーバーをOFFにすると正常に動作した。

【注意】一見OFFに見えても実はONになっていることも…

「自動調整バッテリー」がONになっていると現象が出るので注意💦

Image in a image block

原因

バッテリーセーバーをONにしていることが原因。

【補足】バッテリーセーバーの影響

バッテリーセーバーは、バックグラウンド通信を制限することがある。

特に「利用頻度が少ないアプリ」や「インストール直後のアプリ」は制限を受けやすいみたい。

解決方法

バッテリーセーバーを無効化すれば解決できる。

【パターン1】バッテリーセーバーをOFFにしてもらう

そもそもの原因「バッテリーセーバー」をOFFにするという安直な方法。

Image in a image block

おすすめ度

★☆☆☆☆

(あまりおすすめできない…💦)

問題点

ユーザーの意思を尊重していない💦

💡
【理由】

ユーザーはスマホのバッテリー消費を抑えたくて、意図的にバッテリーセーバーを使っている可能性が高い。

そのため、バッテリーセーバーをOFFにさせるのはあまりよくなさそう💦

この方法を採用するシチュエーション
  • リリースしないアプリ(自分用)の場合

(ユーザーにバッテリーセーバーをOFFに強制させなければ問題ない)

【パターン2】該当アプリのモバイルデータの無制限利用をONにしてもらう

該当アプリだけモバイルデータの無制限利用をONにしてもらう方法。

(該当アプリだけバッテリーセーバーが無効になる)

Image in a image block

【注意】機種によって設定の表記が異なる

「モバイルデータの無制限利用」はGoogle Pixelの場合の表記。

他の機種だと表記が異なる可能性がある。

おすすめ度

★★★★☆

(該当アプリだけバッテリーセーバーを無効にしてもらう!妥当な対処方法!)

問題点

ユーザーに設定を変更してもらえない可能性がある💦

💡
【理由】

対処方法としては妥当だが、設定を変更してくれるかどうかはユーザー次第。

例えばアプリを初回起動したときにいきなり設定の変更を求めても、許可してくれるユーザーは少ない💦

なるべく設定変更の必要性を訴えやすいタイミングで促すといい。

この方法を採用するシチュエーション
  • リリースするアプリの場合

仕様を見直すことも重要

理由
  • ユーザーに設定の変更を促しても、結局変更してくれるかどうかはユーザー次第💦
  • そもそもユーザーの意思を尊重するなら、設定変更を強制するのはよくない💦

見直すポイント
そもそもバックグラウンド処理は必要?

「アプリを開いているときに処理できないか?」を考えてみる✨

まとめてデータを取得できない?

「バックグラウンド通信に成功したときにまとめてデータを取得できないか?」を考えてみる✨

失敗したら素直にエラーを表示してはダメ?

「バックグラウンド処理に失敗したらエラーを表示してはダメか?」を考えてみる✨

まとめ

原因
  • スマホの設定「バッテリーセーバー」がONになっていると、バックグラウンドで通信が失敗することがある💦

解決方法
  • ユーザーに「モバイルデータの無制限利用」をONにしてもらえば、バックグラウンドでも通信が安定する✅

その設定は本当に必要?
  • しかしユーザーが「バッテリー消費や、データ通信を抑えたい」と考えている可能性もある💦
  • そのため本当にバックグラウンドで通信に失敗してはいけないのか、仕様を検討することも大切✅