AndroidクライアントでのGCMサポートの実装の詳細。

GCMについてはすでに書かれています。 この記事の目的は何ですか?


そうです、彼らは書きました。 文字通り今週、Habréで記事GCMが公開されました-Google からのプッシュ通知の新しいサービス (Android向けのGoogle Cloud Messagingに慣れていない場合は、特に私の記事ではプロジェクトの作成プロセスについて説明していないため、この記事を読む前に読むことをお勧めします) GCMを使用)。 著者GCMが実際のアプリケーションで使用したかどうかはわかりませんが、私はしなければなりませんでした。 それが、前の記事で場所を見つけられなかったか、説明されなかった何かを説明したい理由です。 前の記事にコメント付きでこれらすべてを追加するために、私は不可能な仕事を恐れています。


必要な許可




登録コード(registationId)は変更されていますか?


サンプルアプリケーションのコードを考えてみましょう。
 final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { // Automatically registers application on startup. GCMRegistrar.register(this, SENDER_ID); } 


他の条件はないようです。 だから、変わらない? このリンクhttp://developer.android.com/intl/en/guide/google/gcm/adv.html#reg-stateをクリックすると、何が変更される可能性があるかがわかります。 次の2つのケースがあります。
  1. プログラム更新
  2. バックアップを作成してそこから復元する


プログラムの更新を確認するために、小さなヘルパークラスを作成しました。 誰かが役に立つかもしれません:
 import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.preference.PreferenceManager; public final class ApplicationVersionHelper { public static final String APP_VERSION_PREFS = "application_version"; public static boolean isApplicationVersionCodeEqualsSavedApplicationVersionCode(Context context) { return getApplicationVersionCode(context) == getApplicationVersionCodeFromPreferences(context); } public static int getApplicationVersionCode(Context context) { PackageManager pm = context.getPackageManager(); PackageInfo packageInfo; int applicationVersion = 1; try { packageInfo = pm.getPackageInfo(context.getPackageName(), 0); applicationVersion = packageInfo.versionCode; } catch (NameNotFoundException ignored) { } return applicationVersion; } public static int getApplicationVersionCodeFromPreferences(Context context) { return context.getSharedPreferences(APP_VERSION_PREFS, Context.MODE_PRIVATE).getInt("application_version_code", 0); } public static void putCurrentPackageVersionInPreferences(Context context) { context.getSharedPreferences(APP_VERSION_PREFS, Context.MODE_PRIVATE).edit().putInt("application_version_code", getApplicationVersionCode(context)).commit(); } } 


設定はPreferenceManager.getDefaultSharedPreferencesからではなく、指定された設定ファイルから取得されることに注意してください。 これが行われる理由は、後で説明します。
ここで、GCMおよびサービスでの登録が成功した後、 putCurrentPackageVersionInPreferencesを呼び出す必要があり、登録確認コードは次のようになります。

 final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("") || !isApplicationVersionCodeEqualsSavedApplicationVersionCode(this)) { // Automatically registers application on startup. GCMRegistrar.register(this, SENDER_ID); } 


バックアップの作成を処理するため(誰もがこの機能についてまったく知っているわけではありません。おもしろくなった場合は、 http://developer.android.com/intl/en/guide/topics/data/backup.htmlを読んでください)次の解決策を提案します:バックアップ時に定数ApplicationVersionHelper.APP_VERSION_PREFS名前で設定を保存しないでください。 そのため、名前付き設定ファイルが便利になりました:)その後、 isApplicationVersionCodeEqualsSavedApplicationVersionCodeはデータを復元するときにfalseを返し、登録要求を送信します。

GCMIntentServiceのハンドラー


GCMIntentServiceGCMIntentServiceから継承されたGCMBaseIntentService
いくつかのメソッドを再定義する必要があります。 簡単に言うと:


自分で掃除します!


登録プロセスを実行している場合は、忘れずにキャンセルし、メインアクティビティのonDestroyメソッドでGCMRegistrar.onDestroyを呼び出します。 以下がその方法です。
 @Override protected void onDestroy() { if (registerTask != null) { registerTask.cancel(true); } try { CMRegistrar.onDestroy(this); } catch(Exception ignored) { } super.onDestroy(); } 
ここでのregisterTaskは、非同期ジョブ( AsyncTask )です。

おわりに


アプリケーションでGCMを使用する前にhttp://developer.android.com/intl/en/guide/google/gcm/index.htmlを読んで(5つのポイントがあります)、質問がある場合(WAKE_LOCK許可について)、ソースコードに入ることを恐れないでください。

Source: https://habr.com/ru/post/J147739/


All Articles