Этот ответ не уничтожает идентификатор экземпляра, вместо этого он может получить текущий. Он также сохраняет обновленный вариант в общих настройках.
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 (любой класс, в котором вы хотите установить / получить настройки)
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 (расширяет 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
Служба Android 2.0 и выше не запускается при автоматическом запуске ( источник ). Вместо этого onStartCommand
переопределяется и используется. Но в реальной FirebaseInstanceIdService он объявлен как final и не может быть отменен. Однако, когда мы запускаем службу с помощью startService (), если служба уже запущена, используется ее исходный экземпляр. (что хорошо). Наш onCreate () (определенный выше) также был вызван !.
Используйте это в начале MainActivity или в любой другой момент, когда вам нужен идентификатор экземпляра.
MyFirebaseInstanceIdService myFirebaseInstanceIdService = new MyFirebaseInstanceIdService();
Intent intent= new Intent(getApplicationContext(),myFirebaseInstanceIdService.getClass());
//Log.d(this.getClass().getSimpleName(),"Starting MyFirebaseInstanceIdService");
startService(intent); //invoke onCreate
И наконец,
Utility.getFirebaseInstanceId(getApplicationContext())
Обратите внимание : вы можете еще больше улучшить это, пытаясь переместить код startservice () в метод getFirebaseInstanceId.