私は自分の位置を追跡し、これを実行中にセンサーを読み取り、アクティビティを情報 (つまり、現在の速度) で更新する必要があるアプリケーションを持っています。アクティビティには、ユーザーがバックグラウンド ジョブをキャンセルできる「停止」ボタンもあります。ユーザーが別の場所に移動してもデータ収集は続行され、通知によってユーザーは情報を表示しているビューに戻ることができます。
これまでのところ、私は持っています:
- サービス
private static MyService instance
フィールドとゲッターを持っている- それは
instance = this
入りますonStartCommand(...)
- 現在のデータのゲッターもあります(オブジェクトにラップされています)
- 通知
goForeground()
を呼び出して表示するメソッドを提供します(逆を行います)startForeground(...)
goBackground()
- 活動
- で呼び出し
MyService.getInstance()
、onCreate(...)
null を返す場合は、サービスを作成しますstartService(someIntent)
updateViews()
サービスからデータを取得し、ハンドラーを使用してそれ自体への呼び出しをスケジュールし、500 ミリ秒ごとにビューを更新するメソッド
- で呼び出し
これは機能します。ただし、これが推奨される方法ではないことは確かです。それは地獄のように醜く、 の戻り値へのすべての呼び出しはgetInstance()
非 null チェックでラップされます。さらに、すべての作業は UI スレッドで行われます (サービスにさらに計算を追加すると、問題が発生することは間違いありません)。また、サービスのデータをポーリングするアクティビティを取り除きたいと思います。
これを行うための推奨される方法は何ですか?
Android のドキュメントは現時点ではあまり明確ではなく、Google で見つけたものはすべて時代遅れであるか、さまざまな問題を解決していました。注意してください:
- 私のバックグラウンドジョブは本質的に無限であり、ある時点で「終了」することはありません. これを決定できるのはユーザーだけです (これは AsyncTask を除外するかどうか?)
- バックグラウンドからフォアグラウンドに非プリミティブな日付を渡す必要があります
- アクティビティから背景を制御する必要があります
- アクティビティを閉じて再度開いた場合、アクティビティはバックグラウンドに「再接続」できるはずです