2016-09-17 5 views
0

私は、ActivityRecognition APIを使用してバックグラウンドでユーザのアクティビティを追跡するアプリケーションを作成しています。ユーザーが指定された時間(たとえば1時間)同じ場所にいれば、散歩をする。私はアクティビティの認識を実装していますが、アプリが開かれている場合のみです。明らかに、アクティビティの更新を送信するには、Google APIクライアントを接続しておく必要があります。私の質問は、バックグラウンドでの行動追跡のために、よりよい解決策は何でしょうか:バックグラウンドでのアクティビティの認識

012)1)30秒後にアクティビティを目覚めさせる主アクティビティ(または別のアクティビティ)にAlarmManagerを実装するには、Google APIクライアントをPlayに接続します次に、アクティビティ分析のためにPendingIntentをIntentServiceに送信します。

2)バックグラウンド(別のスレッド)で継続的に実行され、APIクライアントが接続されたままになるように別のサービス(IntentServiceではなく)を作成し、IntentServiceにアクティビティの更新を送信します。したがって、システムには次の2つのサービスがあります。1)APIクライアントをPlayサービスに接続し、分析のためにIntentServiceに定期的なアクティビティアップデートを送信するサービス。 2)IntentServiceは、ServiceからActivity更新を受信し、そのデータを分析する。

3)君たちが提供するいくつかの他のソリューション()

コメント:私の教師は私がAlarmManagerを使用することを示唆していますが、通常はネットワークの更新のようなもののためにそれを使用するには、それゆえの間隔は、一般的に10分以上のに対しです私は30秒〜1分必要です。だから私はそれを使用することを躊躇しています。

これまでも多くの類似の質問がありましたが、明確な答えは見つかりませんでした。 アクティビティ更新を受信するように接続されたGoogleApiClientを必要としない -

+0

加速度センサーを使用したり、 – Veener

+0

類似した質問http://stackoverflow.com/questions/28380527/detect-phone-movement-when-screen-is-off – Veener

答えて

3

実際には、接続GoogleApiClientのみを要求し、活動の更新を除去するために必要とされます。

requestActivityUpdates() documentation実際具体的バックグラウンドで作業言及:

一般的な使用例は、アプリケーションがバックグラウンドでの活動を監視し、比活性が検出されたときにアクションを実行したいことがあります。バックグラウンドを消費するリソースに常にオンになっているサービスを必要とせずにこれを行うには、検出されたアクティビティがインテントで配信されます。アプリケーションは、アクティビティが検出されたときにインテントとともに呼び出されるPendingIntentコールバック(通常はIntentService)を指定します。インテントの受信者は、extractResult(android.content.Intent)を使用してActivityRecognitionResultを抽出できます。詳細については、PendingIntentのドキュメントを参照してください。

+0

メインのアクティビティにGoogleクライアントを接続し、そこからPendingIntentsを継続的に送信する方法を実装するとIntentServiceにアクティビティデータを送信すると、メインアクティビティ自体が破棄された後でも、インテントサービスにデータを送信し続けることになりますか?また、受信者はどのようにデータを実装する必要がありますか:一部のブロードキャスト受信者の通常のアクティビティとして、またはIntentService自体に結果を抽出する必要がありますか?申し訳ありませんが、同様の問題に関するスタックオーバーフローに関する記事をあまりにも多く読んでいます。 – Gideon

+0

@Gideon - 主な活動が壊れた後でも、活動の更新を引き続き受け取ります。ドキュメントからアドバイスを受け、 'IntentService'で' extractResult'を使用することは大部分の時間の大部分を選択することになります。 – ianhanniballake

+0

さらにもう1つの質問は、クライアントオブジェクトを作成してアクティビティの更新を要求した後、アプリケーションを終了してクライアントオブジェクトを破棄し、再びアクティビティの更新を削除すると、作成してシステムに供給する新しいクライアントオブジェクトremoveアクティビティの更新メソッドは、更新を要求するために作成したのと同じオブジェクトである必要があります。つまり、クライアントオブジェクトは特定のIDを持つ必要があるため、システムは特定のクライアントオブジェクトの更新を削除します。クライアントオブジェクトを提供している限り、システムには関係ありませんか? – Gideon

0

私は別の方法をお勧めします。 Googleアクティビティ認定APIの問題は、信頼水準が> 75になるまで、特定のイベントを報告することができないということです。信頼水準が75を超えるためには、検出レベルを上げる必要があり、その結果、多くのバッテリを消費する可能性があります。私はAtooma、tranql、Neuraのような無料のSDKを試してみることをお勧めします(オンラインで見つけることができます)。これらは、ユーザーについてのより詳細な情報を提供し、場合によっては電池寿命の約1%しか消費しません。