web-dev-qa-db-ja.com

GcmTaskServiceに関するいくつかの質問

バックグラウンド

Lollipopで提供された新しいJobSchedulerAPIを使用したかったのですが、残念ながら、Lollipop以前の公式ポートがありません。

ただし、非常によく似た機能を提供するGcmTaskServiceがあります。

問題

このAPIは非常に新しいため、使用方法の情報を探す場所はほとんどありません( here および- here たとえば)。

質問

この新しいAPIについていくつか質問があります。

  1. Google Play開発者サービス( here )を使用する必要があるようです(AndroidのLollipopバージョンを使用する場合を除く。通常のJobSchedulerを使用します)。 Google Play開発者サービスが利用できない場合はどうすればよいですか?

  2. 繰り返しタスクに「setPersisted(true)」を使用したのに、デバイスを再起動してもタスクが再度呼び出されないようです。どうして?編集:それは私がRECEIVE_BOOT_COMPLETEDの許可を逃したためです。

  3. 「setRequiredNetwork」を使用しない場合のタスクのデフォルトの動作は何ですか? 「NETWORK_STATE_ANY」ですか?

  4. docs onRunTaskから返されるものについて言うと、「RESULT_FAILURE」、「RESULT_RESCHEDULE」、「 RESULT_SUCCESS "(info here )。 FAILUREオプションとSUCCESSオプションの両方が同じことを行うようです-キューからタスクを削除します。それは本当ですか?もしそうなら、それらの違いは正確には何ですか?それらは異なって機能しますか?

  5. " TaskParams "はタスクのタグにのみ使用されますか? APIを使用して、どういうわけかバンドルをタスクに渡すことはできますか?そうでなければ、タスクに渡すべきものを格納するためのDBを設定する必要がありますよね?

  6. アプリがタスクのキューを取得することは可能ですか? adbを使用して可能であることは知っていますが、APIを使用しても可能ですか?

  7. 彼らは( here )各タスクには最大3分のウェイクロックがあると言います。タスクがそれ以上を必要とする場合はどうすればよいですか?それ自体のために別のウェイクロックを取得する必要がありますか? APIは、ウェイクロックが解放されたことを警告しますか?ドキュメントの内容は次のとおりです。

スケジューラーはサービスのPowerManager.WakeLockを保持しますが、3分間の実行後、タスクが返されない場合はタイムアウトしたと見なされ、ウェイクロックが解放されます。この時点でタスクを再スケジュールしても効果はありません。タスクがこれより長く実行されると思われる場合は、独自のサービスを明示的に開始するか、他のメカニズムを使用する必要があります。このAPIは、比較的迅速なネットワーク操作を目的としています。

  1. 彼らは( here )と言っています-アプリがアップグレード/交換されるたびにすべてのネットワークタスクが削除され、これが発生した場合は「onInitializeTasks」を呼び出し、それらを再度スケジュールできるようにします。タスクを再スケジュールするにはどうすればよいですか?タスクのリストすら入手できないと思います...

  2. 1日の特定の時間を優先するようにタスクに指示することは可能ですか?たとえば、14:00〜15:00の間ですか?

  3. タスクをスケジュールした後、アプリのデータを強制的に停止またはクリアしても、タスクは引き続き実行されることに気付きました。この動作を回避するにはどうすればよいですか?

21

ここで、ほとんどの質問に対する回答を見つけることができます。

https://github.com/jacktech24/gcmnetworkmanager-Android-example/blob/master/README.md

そこに答えられていない答えへ

7:wakelockが削除されても通知は届きません。ドキュメントに記載されているように、このAPIは短いタスク専用です。もっと長い場合は、独自の実装を作成してください。

9:いいえ、現時点ではできません。APIでは許可されていません。

10:それは、Google Play開発者サービスがそれを処理していて、それを回避する方法がないためです。アプリがセットアップされているかどうかをサービスで検出する必要があります(これが問題だと思います)。構成が作成されるなど、いずれかのタスクが呼び出されると、最終的にすべてのタスクがキャンセルされます。

3
filipproch

jacktech24は本当に良い仕事をしましたが、長引く質問がある場合に備えて私も試してみます。

  1. Google Play開発者サービス(ここ)を使用する必要があるようです(通常のJobSchedulerを使用するAndroidのLollipopバージョンを使用する場合を除く)。 Google Play開発者サービスが利用できない場合はどうすればよいですか?*

    Google Play開発者サービスが利用できない場合、このAPIを使用することはできません。むしろ、Google Play開発者サービスのクライアントライブラリは、Google Play開発者サービスが見つからないことを検出した場合、ユーザーにダウンロードしてインストールするように要求するように設計されていますが、GcmNetworkManagerがこれを行うとは思いません。

  2. 「setRequiredNetwork」を使用しない場合のタスクのデフォルトの動作は何ですか? 「NETWORK_STATE_ANY」ですか?*

    Javadocは、どちらがデフォルトであるかを記述します。

  3. ドキュメントには、onRunTaskから返されるものについて記載されていますが、「RESULT_FAILURE」、「RESULT_RESCHEDULE」、「RESULT_SUCCESS」のいずれかの値を返すことができます(情報はこちら)。 FAILUREオプションとSUCCESSオプションの両方が同じことを行うようです-キューからタスクを削除します。それは本当ですか?もしそうなら、それらの違いは正確には何ですか?それらは異なって機能しますか?*

    これら2つの違いは、adb Shell dumpsysで返されたものが表示されるため、これを使用して問題のトラブルシューティングを行うことができることです。もう1つの理由は、タスクが失敗した場合に、クライアントに「成功」​​を返すように要求するのは奇妙なことです。

  4. 「TaskParams」はタスクのタグにのみ使用されますか? APIを使用して、どういうわけかバンドルをタスクに渡すことはできますか?そうでなければ、タスクに渡すべきものを保存するためのDBを設定する必要がありますよね?*

    GmsCoreの次のバージョンでは、タスクにバンドルを追加する機能がサポートされるはずです。

  5. アプリがタスクのキューを取得することは可能ですか? adbを使用して可能であることは知っていますが、APIを使用しても可能ですか?

    いいえ、それは不可能です。代わりに、必要なときにキャンセルを実行する必要があります。タスクがない場合は、何も実行されません。同様に、タスクのリストを照会するコード内のポイントでタスクをスケジュールする必要があります。 setUpdateCurrent = falseを使用して、既存のタスクが更新されないようにします。 AlarmManagerは、アラームがすでに設定されているかどうかに関係なく、アラームを設定するという点で同様に機能します。APIはこれに従うように設計されています。

  6. 彼らは(ここで)各タスクには最大3分のウェイクロックがあると言います。タスクがそれ以上を必要とする場合はどうすればよいですか?それ自体のために別のウェイクロックを取得する必要がありますか? APIは、ウェイクロックが解放されたことを警告しますか?ドキュメントの内容は次のとおりです。*

    はい、アプリは独自のwakelockを取得する必要があり、すべてが正常になります。スケジューラーが3分後にウェイクロックを解放する理由は、実際には無制限のウェイクロックタイムアウトがあると、バッテリーの消耗のバグを追跡するのが非常に困難になるためです。 3分以上必要な場合は、PowerManager APIがどのように機能するかを掘り下げて、acquire()/ release()を自分で呼び出すことができる十分に洗練されたユースケースがあります(これは非常に簡単です。ネットワークマネージャーがそれを行うという事実です。あなたは何よりも礼儀正しいからです)。

  7. 彼らは(ここで)アプリがアップグレード/交換されるたびにすべてのネットワークタスクが削除され、これが発生すると「onInitializeTasks」の呼び出しがあり、それらを再度スケジュールできると言います。タスクを再スケジュールするにはどうすればよいですか?タスクのリストすら入手できないと思います... *

    最初にスケジュールしたのと同じ方法でタスクを再スケジュールします。それらをスケジュールするために使用した関数が何であれ、GcmTaskService#onInitializeTasksからその関数を呼び出します。これは、アプリのロジックが変更されてもタスクが長引くのを防ぐために行われました。開発者がタスクのタイムテーブルを変更し、別のタグの使用を開始する状況を考えてみます。アップグレードを検出した後、cancel(old_tag)を呼び出す必要があります(これを行うにはコードを追加する必要があります)。つまり、古い(未使用の)タグへの参照が必要になります。新しいコード。これは、タグがアプリのアップグレード間で変更されるべきではない安定した識別子であることを意味します。これは、このAPIの要件ではありません。

  8. 1日の特定の時間を優先するようにタスクに指示することは可能ですか?たとえば、14:00〜15:00の間?*

    いいえ、このタイプのバックグラウンドスケジューリングは、多数のデバイス間でのハーディングに関してあらゆる種類の問題を引き起こします。つまり1つのデバイスが15:00にジョブを実行する場合、それはおそらく問題ありません。しかし、1x10e6が突然発生した場合、サーバーは深刻な問題に直面しています。

  9. タスクをスケジュールした後、アプリのデータを強制的に停止またはクリアしても、タスクは引き続き実行されることに気付きました。この動作を回避するにはどうすればよいですか?*

    残念ながらできませんが、これは意図的なものではなく、変更する必要があります。ユーザーがアプリを明示的に停止した後にアプリを実行する方法はありません。

7
43matthew