Come avviare il servizio FCM ID solo dopo che viene triggersta un'attività particolare?

Supponiamo di avere una LoginActivity where l'utente può registrare o accedere a credenziali esistenti. Non voglio che FirebaseInstanceIdService generi un token, a less che l'utente non sia connesso e che MainActivity la MainActivity dell'applicazione.

Grazie

  • Posizionare i pulsanti OK / Annulla in modo che possano simulare il layout nelle windows di dialogo
  • SurfaceHolder.lockCanvas () Tornando null
  • Voci di elenco persistenti in ListAdapter in configurationChanges con setRetainInstance
  • GridLayout vs TableLayout
  • Scaricamento asincrono di bitmap in un adattatore, con particolare attenzione a Bitmap.recycle ()
  • Come fare la dimensione personalizzata di FloatingActionButton
  • Il servizio è stato riavviato su Applicazione Close - START_STICKY
  • Spell check android studio / IntelliJ Idea
  • Autenticazione Digest in Android utilizzando HttpURLConnection
  • Android Test Module (Gradle Plugin 1.3) non funziona: "classi di debug non trovate"
  • Come submit email in background in Android?
  • ridurre l'animation in schermata schermata in android?
  • 3 Solutions collect form web for “Come avviare il servizio FCM ID solo dopo che viene triggersta un'attività particolare?”

    Non è ansible bloccare FirebaseInstanceIdService.onTokenRefresh() da call finché l'utente non è connesso.

    Quello che puoi fare nel tuo caso d'uso è:

    • In FirebaseInstanceIdService.onTokenRefresh() ignora l'evento se l'utente non è connesso
    • Quando l'utente accede a FirebaseInstanceId.getToken() e se != null Chiamata != null onTokenRefresh() (o direttamente la logica) manualmente.

    In questo modo è ansible elaborare il token quando l'utente è connesso e se il token non è disponibile (o viene ruotato) ricevenetworking l'evento onTokenRefresh() più tardi.

    Aggiornamento (3 luglio 2017) : nei commenti un lettore ha ricordato che FirebaseInstanceIdService.onTokenRefresh() potrebbe essere richiamato dopo l'accesso dell'utente.

    È giusto. Quando l'utente accede, getToken() potrebbe ancora restituire null se onTokenRefresh() non è stato chiamato in precedenza.

    Devi avere questo caso nella tua app. Molto probabilmente l'utente può utilizzare l'applicazione comunque, ma non puoi submit una notifica di spinta fino a quando non hai ricevuto il token.

    Quando onTokenRefresh() viene finalmente chiamato, se l'utente accede prima, è ansible associare il token all'utente.

    Mi dispiace ma questo non è ansible. FirebaseInstanceIdService automaticamente su avvio dell'applicazione e generare un Token . Tieni presente che è relativo all'istanza di applicazione. Non con l'unico utente. Se si sta tentando di salvare il Token con un determinato utente (cioè quando l'utente è connesso, allora si salverà quel token nel db del server per la notifica push di quel utente). Se si sta facendo questo un bug che si dovrà affrontare in futuro è che se due la condivisione di un'applicazione di Instance quindi la notifica di spinta potrebbe essere spinta a un utente sbagliato .. Spero che tu abbia il mio punto.

    Sto mantenendo una bandiera in pref condivisa che indica se il token gcm viene inviato al server o no. In schermo Splash each volta che chiamo un metodo sendDevicetokenToServer. Questo metodo verifica se l'ID utente non è vuoto e lo stato di trasmissione gcm invia il token al server.

      public static void sendRegistrationToServer(final Context context) { if(Common.getBooleanPerf(context,Constants.isTokenSentToServer,false) || Common.getStringPref(context,Constants.userId,"").isEmpty()){ return; } String token = FirebaseInstanceId.getInstance().getToken(); String userId = Common.getUserId(context); if(!userId.isEmpty()) { HashMap<String, Object> reqJson = new HashMap<>(); reqJson.put("deviceToken", token); ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call<JsonElement> call = apiService.updateDeviceToken(reqJson,Common.getUserId(context),Common.getAccessToken(context)); call.enqueue(new Callback<JsonElement>() { @Override public void onResponse(Call<JsonElement> call, Response<JsonElement> serverResponse) { try { JsonElement jsonElement = serverResponse.body(); JSONObject response = new JSONObject(jsonElement.toString()); if(context == null ){ return; } if(response.getString(Constants.statusCode).equalsIgnoreCase(Constants.responseStatusSuccess)) { Common.saveBooleanPref(context,Constants.isTokenSentToServer,true); } }catch (Exception e){ e.printStackTrace(); } } @Override public void onFailure(Call<JsonElement> call, Throwable throwable) { Log.d("", "RetroFit2.0 :getAppVersion: " + "eroorrrrrrrrrrrr"); Log.e("eroooooooorr", throwable.toString()); } }); } } 

    Nella class MyFirebaseInstanceIDService

      @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. Common.saveBooleanPref(this,Constants.isTokenSentToServer,false); Common.sendRegistrationToServer(this); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.