Esta resposta não destrói o id da instância, em vez disso, é capaz de obter o atual. Ele também armazena um atualizado nas preferências compartilhadas.
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 (qualquer classe onde você deseja definir / obter preferências)
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);
....
}
O Android 2.0 e superior onCreate
do serviço não é invocado quando iniciado automaticamente ( fonte ). Em vez disso, onStartCommand
é substituído e usado. Mas no FirebaseInstanceIdService real, ele é declarado como final e não pode ser substituído. No entanto, quando iniciamos o serviço usando startService (), se o serviço já estiver em execução, sua instância original é usada (o que é bom). Nosso onCreate () (definido acima) também foi chamado !.
Use isso no início de MainActivity ou em qualquer ponto que você ache que precisa do id da instância.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
E finalmente,
Utility.getFirebaseInstanceId(getApplicationContext())
Observe que você pode aprimorar isso ainda mais tentando mover o código startservice () para o método getFirebaseInstanceId.