次の条件を満たす必要があるサービスがあります
1) アプリがフォアグラウンドにある間、サービスを実行する必要があります。
2) アクティビティが回転するときは、サービスを停止しないでください
3) 特定のフラグメントが開いているときにアプリを最小化しても、サービスはアクティブなままでなければなりません。
4) アクティビティが (ローテーションではなく) 停止され、それが特定のフラグメントではない場合、サービスを停止します。
onstart/onstop でサービスを開始/停止しています。画面が回転しているかどうかを追跡するためにブール値を使用することになりました。
このようにサービスを開始/停止しています
context.getApplicationContext().startService(インテント)
context.getApplicationContext().stopService(インテント)
1つの状況を除いて、完全に機能しました。
ランドスケープで画面をオフにすると、Android は何らかの理由でアクティビティ全体を再作成する必要があると判断し、ライフサイクル全体で呼び出します。4.4 と 5.0.1 の基本的なアプリでこれを再現しました。これは、このような他のスレッドで示されています。
画面がオフになったりオンになったりするときのライフサイクルを理解する問題
これを行うと、回転する/回転しないに依存することはできません。物事が非常に迅速に発生したため (複数の onStop/onStarts)、競合状態が発生していたと推測しています。アプリに戻ると、機能することもあれば、ハングすることもあり (エラーなし)、2 つのサービスが実行されていることもありました。
onStartに入ったときに画面がオフだったので、次にonStartが呼び出されたときに、回転としてフラグが立てられていた画面オフのレクリエーションから戻ってきていることがわかりました( Android は、縦向きのロック画面から横向きに戻していました)。それはばかげていて、うまく機能していませんでした。
あるスレッドは、ローテーションに耐えるためにヘッドレスフラグメントを使用することを提案しましたが、アプリを閉じたときに停止する必要があるため、同じ問題で立ち往生してしまいます。
これを解決するための推奨される方法はありますか? アプリが閉じている場合 (1 つのフラグメントを除く)、サービスをアクティブのままにしておくことはできません。これはバッテリーを大量に消費するだけであり、ローテーションを乗り切る必要があります。そうしないと、処理が中断されます。