4

私は自分のアプリに GCM を実装しており、ここで提案されているようにGSMRegistrarを使用しています。いいえ、logcat でエラーが発生しています

7-02 23:35:15.830: E/ActivityThread(10442): Activity com.abc.xyz.mnp has leaked IntentReceiver com.google.android.gcm.GCMBroadcastReceiver@44f8fb68 that was originally registered here. Are you missing a call to unregisterReceiver()?

これから理解できることとコードを見ると、GSMRegistrar呼び出す必要がありますGSMRegistrar.onDestroy(this)が、これをどこで呼び出すべきか理解できませんでしたか? アクティビティを呼び出すとonDestroy()、アクティビティのmnp再試行が停止しますGSM Registartion

4

3 に答える 3

12

アクティビティ コンテキストの代わりに、アプリケーション コンテキストを使用できます。そうすれば、バックオフ メカニズムはアクティビティのライフ サイクルによって制限されません。

于 2012-07-13T15:08:36.737 に答える
8

GCM 登録を開始したアクティビティの onDestory() メソッド内で呼び出す必要があります。

別のアクティビティがその上で起動されたとしても、アクティビティが破棄されない場合があることに注意してください。したがって、登録はバックグラウンドで再試行される可能性があります。登録アクティビティが破棄されると、応答を処理する GCMBroadcastReceiver クラスが存在しなくなります。

更新: GCM ライブラリのソース コードをより注意深く調べた結果、次のことがわかりました。

  1. GCM ライブラリは、アクティビティ コンテキストを使用して受信者を登録します。失敗した場合に登録を再試行する目的で、バックオフ メカニズムを使用して再試行します。
  2. アクティビティの onDestroy() メソッドで GCMRegistrar.onDestroy() を呼び出す必要があります。Android では、アクティビティが破棄される前にレシーバーを登録解除することをお勧めします。
  3. #2 のため、GCMRegistrar.register を呼び出すアクティビティが破棄された場合、アプリは再登録を試みません。登録プロセスを再開するには、ユーザーはこのアクティビティに戻る必要があります。
  4. 動作 #3 が必要ない場合は、独自の GCM 登録および再試行メカニズムを実装する必要がある場合があります。たとえば、再試行メカニズムが別のバックグラウンド スレッドで実行される場合、アプリケーションが実行されている限り、アクティビティが破棄されても試行を続けることができます。

GCMサーバーが「SERVICE_NOT_AVAILABLE」エラーで登録を拒否することは非常にまれであるため、#3は受け入れられると思います。ユーザーがアプリを数回実行している限り、遅かれ早かれデバイスは正常に登録されます。

于 2012-07-02T20:46:41.077 に答える
2

Activty クラスの onDestroy メソッドで GCMRegistrar を破棄する必要があります

        unregisterReceiver(receiver);
        GCMRegistrar.onDestroy(this);
于 2012-07-03T10:06:35.053 に答える