Diese Antwort zerstört nicht die Instanz-ID, sondern kann die aktuelle ID abrufen. Es wird auch eine aktualisierte Datei in den freigegebenen Einstellungen gespeichert.
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 (jede Klasse, in der Sie Einstellungen festlegen / abrufen möchten)
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 (erweitert 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);
....
}}
Der Dienst für Android 2.0 und höher onCreate
wird beim automatischen Start nicht aufgerufen ( Quelle ). Stattdessen onStartCommand
wird überschrieben und verwendet. Im tatsächlichen FirebaseInstanceIdService wird es jedoch als endgültig deklariert und kann nicht überschrieben werden. Wenn wir den Dienst jedoch mit startService () starten und der Dienst bereits ausgeführt wird, wird seine ursprüngliche Instanz verwendet (was gut ist). Unser onCreate () (oben definiert) wurde ebenfalls aufgerufen!.
Verwenden Sie dies zu Beginn von MainActivity oder an dem Punkt, an dem Sie glauben, dass Sie eine Instanz-ID benötigen.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
Und schlussendlich,
Utility.getFirebaseInstanceId(getApplicationContext())
Beachten Sie, dass Sie dies weiter verbessern können, indem Sie versuchen, den Code von serviceservice () in die Methode getFirebaseInstanceId zu verschieben.