Ta odpowiedź nie niszczy identyfikatora instancji, zamiast tego może pobrać bieżący. Przechowuje również odświeżoną wersję w preferencjach wspólnych.
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 (dowolna klasa, w której chcesz ustawić / pobrać preferencje)
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 (rozszerza 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);
....
}
onCreate
Usługa Android 2.0 lub nowsza nie jest wywoływana podczas automatycznego uruchamiania ( źródło ). Zamiast tego onStartCommand
jest zastępowany i używany. Ale w rzeczywistej usłudze FirebaseInstanceIdService jest zadeklarowany jako ostateczny i nie można go zastąpić. Jednak gdy uruchamiamy usługę za pomocą startService (), jeśli usługa już działa, używana jest jej oryginalna instancja (co jest dobre). Nasza onCreate () (zdefiniowana powyżej) również została wywołana !.
Użyj tego na początku MainActivity lub w dowolnym momencie, gdy potrzebujesz identyfikatora instancji.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
I w końcu,
Utility.getFirebaseInstanceId(getApplicationContext())
Zauważ , że możesz to dodatkowo ulepszyć, próbując przenieść kod startedervice () do metody getFirebaseInstanceId.