Esta respuesta no destruye la identificación de la instancia, sino que puede obtener la actual. También almacena uno actualizado en las preferencias compartidas.
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 (cualquier clase en la que desee establecer / obtener preferencias)
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 (extiende 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);
....
}
El servicio de Android 2.0 y superior onCreate
no se invoca cuando se inicia automáticamente ( fuente ). En onStartCommand
su lugar, se anula y se utiliza. Pero en FirebaseInstanceIdService real, se declara como final y no se puede anular. Sin embargo, cuando iniciamos el servicio usando startService (), si el servicio ya se está ejecutando, se usa su instancia original (lo cual es bueno). ¡Nuestro onCreate () (definido arriba) también fue invocado !.
Use esto al comienzo de MainActivity o en cualquier punto en el que crea que necesita la identificación de la instancia.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
Y finalmente,
Utility.getFirebaseInstanceId(getApplicationContext())
Tenga en cuenta que puede mejorar aún más esto intentando mover el código startservice () al método getFirebaseInstanceId.