0

私は自分の位置を追跡し、これを実行中にセンサーを読み取り、アクティビティを情報 (つまり、現在の速度) で更新する必要があるアプリケーションを持っています。アクティビティには、ユーザーがバックグラウンド ジョブをキャンセルできる「停止」ボタンもあります。ユーザーが別の場所に移動してもデータ収集は続行され、通知によってユーザーは情報を表示しているビューに戻ることができます。

これまでのところ、私は持っています:

  • サービス
    • private static MyService instanceフィールドとゲッターを持っている
    • それはinstance = this入りますonStartCommand(...)
    • 現在のデータのゲッターもあります(オブジェクトにラップされています)
    • 通知goForeground()を呼び出して表示するメソッドを提供します(逆を行います)startForeground(...)goBackground()
  • 活動
    • で呼び出しMyService.getInstance()onCreate(...)null を返す場合は、サービスを作成しますstartService(someIntent)
    • updateViews()サービスからデータを取得し、ハンドラーを使用してそれ自体への呼び出しをスケジュールし、500 ミリ秒ごとにビューを更新するメソッド

これは機能します。ただし、これが推奨される方法ではないことは確かです。それは地獄のように醜く、 の戻り値へのすべての呼び出しはgetInstance()非 null チェックでラップされます。さらに、すべての作業は UI スレッドで行われます (サービスにさらに計算を追加すると、問題が発生することは間違いありません)。また、サービスのデータをポーリングするアクティビティを取り除きたいと思います。

これを行うための推奨される方法は何ですか?

Android のドキュメントは現時点ではあまり明確ではなく、Google で見つけたものはすべて時代遅れであるか、さまざまな問題を解決していました。注意してください:

  • 私のバックグラウンドジョブは本質的に無限であり、ある時点で「終了」することはありません. これを決定できるのはユーザーだけです (これは AsyncTask を除外するかどうか?)
  • バックグラウンドからフォアグラウンドに非プリミティブな日付を渡す必要があります
  • アクティビティから背景を制御する必要があります
  • アクティビティを閉じて再度開いた場合、アクティビティはバックグラウンドに「再接続」できるはずです
4

1 に答える 1

0

あなたが言ったように、サービスからデータをプルすることはベストプラクティスではありません.幸いなことにBroadcastReceiverと呼ばれるものがあり、インテントが送信され、レシーバーがそれを受信するように構成されているときにこのクラスがウェイクアップします(マニフェストで)。

これにより、サービスが準備が整ったときにデータを送信できます。または、別の方法で、アクティビティが新しいデータのリクエストを送信できます。

インテントはデータを保持できるため、サービスに静的インスタンスを保持する必要はなく、データをインテントに渡すだけであることに注意してください

于 2013-02-06T19:29:09.553 に答える