以下のコードを使用してアプリ トークンを登録しています。
public class RegistrationIntentService extends IntentService {
private static final String TAG = "RegIntentService";
private static final String[] TOPICS = {"global"};
public static final String TOKEN_ID = "registration_id";
private final static int MAX_ATTEMPTS = 5;
private final static int BACKOFF_MILLI_SECONDS = 2000;
private String token = null;
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
try {
synchronized (TAG) {
Random random = new Random();
InstanceID instanceID = InstanceID.getInstance(this);
long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000);
for (int i = 1; i <= MAX_ATTEMPTS; i++) {
try {
token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply();
} catch (IOException e) {
if (i == MAX_ATTEMPTS) {
break;
}
try {
Thread.sleep(backoff);
} catch (InterruptedException e1) {
break;
}
}
// increase backoff exponentially
backoff *= 2;
}
// further processing for token goes here
}
sendRegistrationToServer(token);
subscribeTopics(token);
} catch (Exception e) {
Log.d(TAG, "Failed to complete token refresh", e);
// sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply();
}
Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE);
LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete);
}
}
ただし、デバイスがオフラインの場合、トークンはアプリ サーバーに登録されません。デバイスが接続すると、アプリ サーバー DB にトークンが登録されておらず、プッシュ通知を送信できません。
接続時にトークンをアプリサーバーに送信するようにアプリを管理するにはどうすればよいですか?
私は次のようなものを追加しようとしました:
try {
token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
RegisterTOServer(token);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
メインアクティビティの onResume() メソッドに追加しますが、アプリの速度が大幅に低下します。