Questa risposta non distrugge l'ID istanza, ma è in grado di ottenerne uno corrente. Memorizza anche quello aggiornato nelle preferenze condivise.
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 (qualsiasi classe in cui desideri impostare / ottenere preferenze)
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 (estende 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);
....
}
Il servizio Android 2.0 e versioni successive onCreate
non viene richiamato all'avvio automatico ( sorgente ). Invece onStartCommand
è sovrascritto e utilizzato. Ma in FirebaseInstanceIdService effettivo è dichiarato come finale e non può essere sovrascritto. Tuttavia, quando avviamo il servizio utilizzando startService (), se il servizio è già in esecuzione, viene utilizzata la sua istanza originale (il che è positivo). Anche il nostro onCreate () (definito sopra) è stato invocato !.
Usalo all'inizio di MainActivity o in qualsiasi punto pensi di aver bisogno dell'ID istanza.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
E infine,
Utility.getFirebaseInstanceId(getApplicationContext())
Nota , puoi migliorare ulteriormente questo aspetto provando a spostare il codice StartService () nel metodo getFirebaseInstanceId.