Cette réponse ne détruit pas l'identifiant de l'instance, elle est capable de récupérer l'identifiant actuel. Elle stocke également le nouveau dans les préférences partagées.
Strings.xml
<string name="pref_firebase_instance_id_key">pref_firebase_instance_id</string>
<string name="pref_firebase_instance_id_default_key">default</string>
Utility.java (toute classe où vous voulez définir/obtenir des préférences)
public static void setFirebaseInstanceId(Context context, String InstanceId) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor;
editor = sharedPreferences.edit();
editor.putString(context.getString(R.string.pref_firebase_instance_id_key),InstanceId);
editor.apply();
}
public static String getFirebaseInstanceId(Context context) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
String key = context.getString(R.string.pref_firebase_instance_id_key);
String default_value = context.getString(R.string.pref_firebase_instance_id_default_key);
return sharedPreferences.getString(key, default_value);
}
MyFirebaseInstanceIdService.java (étend FirebaseInstanceIdService)
@Override
public void onCreate()
{
String CurrentToken = FirebaseInstanceId.getInstance().getToken();
//Log.d(this.getClass().getSimpleName(),"Inside Instance on onCreate");
String savedToken = Utility.getFirebaseInstanceId(getApplicationContext());
String defaultToken = getApplication().getString(R.string.pref_firebase_instance_id_default_key);
if(CurrentToken != null && !savedToken.equalsIgnoreCase(defaultToken))
//currentToken is null when app is first installed and token is not available
//also skip if token is already saved in preferences...
{
Utility.setFirebaseInstanceId(getApplicationContext(),CurrentToken);
}
super.onCreate();
}
@Override
public void onTokenRefresh() {
.... prev code
Utility.setFirebaseInstanceId(getApplicationContext(),refreshedToken);
....
}
Android 2.0 et plus onCreate
de service n'est pas invoqué lorsqu'il est lancé automatiquement ( source ). Au lieu de cela, onStartCommand
est surchargée et utilisée. Mais dans le FirebaseInstanceIdService actuel, il est déclaré comme final et ne peut pas être surchargé. Cependant, lorsque nous démarrons le service en utilisant startService(), si le service est déjà en cours d'exécution, sa fonction l'instance originale est utilisée (ce qui est bien). Notre onCreate() (défini plus haut) a également été invoqué !
Utilisez-le au début de MainActivity ou à n'importe quel moment où vous pensez avoir besoin de l'identifiant d'instance.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
Et enfin,
Utility.getFirebaseInstanceId(getApplicationContext())
Note Vous pouvez encore améliorer ce système en essayant de déplacer le code startservice() vers la méthode getFirebaseInstanceId.
2 votes
Une question très similaire a déjà été posée dans le lien suivant. Vérifiez si la réponse vous est utile : stackoverflow.com/questions/37517254/