web-dev-qa-db-ja.com

フォアグラウンドサービスにContext.startService(Intent)の代わりにContext.startForegroundService(Intent)を使用することに利点はありますか?

docs を読んだところ、Context.startForegroundService()には開始されたサービスがstartForeground()を呼び出すという暗黙の約束があります。ただし、Android Oはバックグラウンドサービスとフォアグラウンドサービスに変更が加えられているため、古いstartService()メソッドを使用した場合と比較してパフォーマンスが向上したものは他にありますか。今後のベストプラクティスですか?

13

これは、パフォーマンスの向上でも、メリットでも、ベストプラクティスでもありません。

API 26以降、システムはバックグラウンドアプリがバックグラウンドサービスを作成することを許可していません。

したがって、アプリがバックグラウンドにある場合(フォアグラウンドにある場合も同じことを歓迎します)、する必要があります以前のContext.startForegroundService(Intent)の代わりにstartService(Intent)を使用します。その後、サービスは開始後最初の5秒以内にstartForeground(int, Notification)を呼び出す必要があります。そうしないと、システムはサービスを停止します。

また、バックグラウンドアプリからstartService(Intent)を使用してサービスを開始する古い方法は、現在のリリースのAndroid Oreoでも機能するという情報がありますが、間もなく修正されます。

したがって、API 26以降、フォアグラウンドサービスを開始するときは常に、Context.startForegroundService(Intent)の代わりに新しいstartService(Intent)メソッドを使用する必要があります。

14

私が説明したように ここ 、startForegroundServiceには深刻な問題があり、必然的にANRの頻度が低くなります。この問題はアプリレベルでは修正できないため、startForegroundServiceは使用しないでください。同じ機能を実装するために JobSchedulerとJobService モデルに切り替えました。

後者のモデルはこれまでのところうまく機能しており、Playストアでアプリがクラッシュすることはもうありません。新しいモデルはまったく異なり、startForegroundServiceに基づいて既存のコードをリファクタリングするのに2日を費やしましたが、間違いなく成果を上げています。

0
Oleg Gryb