私の目標は、BLE のみのモードで Google Nearby Messages に登録することです。アプリが実行されていない間 (バックグラウンドで、または電話の再起動後に開始されないだけ)、低電力のバックグラウンド スキャンのみが必要です。私は、スクリーンオン イベントでのみスキャンを行うことができます。アプリがアクティブなときは、ビーコンの発見や紛失に対する迅速な反応と、主に距離の推定を使用して、フォアグラウンド スキャンを実行したいと考えています。
私が今していることは、「BOOT_COMPLETED」インテントに反応する BroadcastReceiver でバックグラウンドで (PendingIntent を使用して) サブスクライブすることです。アプリがバックグラウンドにあり、他のアプリケーションがスキャンを行っているときにインテントを受け取ります。したがって、この部分は機能します。
アクティビティが開始するとき (onResume)、フォアグラウンド モードで 2 回目のサブスクライブを行います (PendingIntent の代わりに MessageListener を使用)。そして、onPause で購読を解除します。距離の推定を含め、更新を非常に高速に取得します。したがって、これも機能します。
ただし、解決策にはいくつかの問題があります。
- ビーコンが見つかると、onFound が PendingIntent と MessageListener によって呼び出されるようになりました。したがって、パフォーマンス面でのソリューションはあまり良くありません。
- フォアグラウンドでサブスクライブすると、最初にバックグラウンド レシーバーによってすべてのメッセージの onLost が受信されます。バックグラウンド レシーバーとフォアグラウンド レシーバーの両方で onFound を受信した直後。登録解除の呼び出しでも同じことが起こります。醜いちらつきとパフォーマンスの低下につながります...
- バッテリーの消費がすごい。主に、多くの購読/購読解除サイクルの後。電話がまったく使用されていない夜(約10時間)、つまりバックグラウンドスキャンでバッテリーを完全に放電することができました. バッテリー消費画面では、Google Play Services が最大のバッテリー消費者 (25%) として表示されます。
質問:
- アプリが実行されていないときに低消費電力の結果を受け取り、アプリの実行中にアクティブなフォアグラウンド スキャンを行う方法はありますか?
- サブスクリプションはどのように機能していますか? それら (バックグラウンドとフォアグラウンドの両方) は、アプリの再起動間で持続しますか? それとも、アプリを起動するたびにサブスクライブしますか? 購読を解除せずに再度購読するとどうなりますか?
- アクティビティが非アクティブになることに対する Nearby の反応がログ ファイルに表示されます。アクティビティが非アクティブになると、フォアグラウンド サブスクリプションは自動的に無効になりますか? 再びアクティブになると自動的に有効になりますか? それとも、何の付加価値もなく、単に大量のバッテリーを使用しているだけですか?