0

Meine App enthält eine Textansicht, die ich mit Push-Benachrichtigungen von Firebase aktualisieren möchte. Es funktioniert gut, wenn die App im Vordergrundzustand ist, aber wenn die App im Hintergrundzustand ist, erhalte ich nur eine Benachrichtigung und der Text wird nicht aktualisiert.Firebase-Push-Benachrichtigung aktualisiert Text nicht gleichzeitig

Mein Problem: -

Angenommen, wenn mein app auf dem Bildschirm ist, und eine Meldung von Feuerbasis geschoben, Textview ist ohne Benachrichtigung über Infobereich aktualisiert. Wenn sich die App im Hintergrund befindet, erhalte ich nur eine Benachrichtigung, Textansicht wird nicht aktualisiert.

Was ich will?

Ist es möglich, Textview zu aktualisieren sowie eine Benachrichtigung unabhängig vom Zustand der App zu erhalten?

MainActivity

public class MainActivity extends AppCompatActivity { 

private static final String TAG = MainActivity.class.getSimpleName(); 
private BroadcastReceiver mRegistrationBroadcastReceiver; 
private TextView txtRegId, txtMessage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    txtRegId = (TextView) findViewById(R.id.txt_reg_id); 
    txtMessage = (TextView) findViewById(R.id.txt_push_message); 

    mRegistrationBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      // checking for type intent filter 
      if (intent.getAction().equals(Config.REGISTRATION_COMPLETE)) { 
       // gcm successfully registered 
       // now subscribe to `global` topic to receive app wide notifications 
       FirebaseMessaging.getInstance().subscribeToTopic(Config.TOPIC_GLOBAL); 

       displayFirebaseRegId(); 

      } else if (intent.getAction().equals(Config.PUSH_NOTIFICATION)) { 
       // new push notification is received 

       String message = intent.getStringExtra("message"); 

       Toast.makeText(getApplicationContext(), "Push notification: " + message, Toast.LENGTH_LONG).show(); 
       if (!TextUtils.isEmpty(message)) 
        txtMessage.setText("New Message: " + message); 
       else 
        txtMessage.setText("No new Updates!"); 
      } 
     } 
    }; 

    displayFirebaseRegId(); 

} 

// Fetches reg id from shared preferences 
// and displays on the screen 
private void displayFirebaseRegId() { 
    SharedPreferences pref = getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0); 
    String regId = pref.getString("regId", null); 

    Log.e(TAG, "Firebase reg id: " + regId); 

    if (!TextUtils.isEmpty(regId)) 
     txtRegId.setText("Firebase Reg Id: " + regId); 
    else 
     txtRegId.setText("Firebase Reg Id is not received yet!"); 
} 



@Override 
protected void onResume() { 
    super.onResume(); 

    // register GCM registration complete receiver 
    LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, 
      new IntentFilter(Config.REGISTRATION_COMPLETE)); 

    // register new push message receiver 
    // by doing this, the activity will be notified each time a new message arrives 
    LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, 
      new IntentFilter(Config.PUSH_NOTIFICATION)); 

    // clear the notification area when the app is opened 
    NotificationUtils.clearNotifications(getApplicationContext()); 
} 

@Override 
protected void onPause() { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); 
    super.onPause(); 
} 
} 

FirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

private static final String TAG = MyFirebaseMessagingService.class.getSimpleName(); 

private NotificationUtils notificationUtils; 

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.e(TAG, "From: " + remoteMessage.getFrom()); 

    if (remoteMessage == null) 
     return; 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody()); 
     handleNotification(remoteMessage.getNotification().getBody()); 
    } 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString()); 

     try { 
      JSONObject json = new JSONObject(remoteMessage.getData().toString()); 
      handleDataMessage(json); 
     } catch (Exception e) { 
      Log.e(TAG, "Exception: " + e.getMessage()); 
     } 
    } 
} 

private void handleNotification(String message) { 
    if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) { 
     // app is in foreground, broadcast the push message 
     Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION); 
     pushNotification.putExtra("message", message); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification); 

     // play notification sound 
     NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext()); 
     notificationUtils.playNotificationSound(); 
    }else{ 
     // If the app is in background, firebase itself handles the notification 
    } 
} 

private void handleDataMessage(JSONObject json) { 
    Log.e(TAG, "push json: " + json.toString()); 

    try { 
     JSONObject data = json.getJSONObject("data"); 

     String title = data.getString("title"); 
     String message = data.getString("message"); 
     boolean isBackground = data.getBoolean("is_background"); 
     String imageUrl = data.getString("image"); 
     String timestamp = data.getString("timestamp"); 
     JSONObject payload = data.getJSONObject("payload"); 

     Log.e(TAG, "title: " + title); 
     Log.e(TAG, "message: " + message); 
     Log.e(TAG, "isBackground: " + isBackground); 
     Log.e(TAG, "payload: " + payload.toString()); 
     Log.e(TAG, "imageUrl: " + imageUrl); 
     Log.e(TAG, "timestamp: " + timestamp); 


     if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) { 
      // app is in foreground, broadcast the push message 
      Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION); 
      pushNotification.putExtra("message", message); 
      LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification); 

      // play notification sound 
      NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext()); 
      notificationUtils.playNotificationSound(); 
     } else { 
      // app is in background, show the notification in notification tray 
      Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class); 
      resultIntent.putExtra("message", message); 

      // check for image attachment 
      if (TextUtils.isEmpty(imageUrl)) { 
       showNotificationMessage(getApplicationContext(), title, message, timestamp, resultIntent); 
      } else { 
       // image is present, show notification with image 
       showNotificationMessageWithBigImage(getApplicationContext(), title, message, timestamp, resultIntent, imageUrl); 
      } 
     } 
    } catch (JSONException e) { 
     Log.e(TAG, "Json Exception: " + e.getMessage()); 
    } catch (Exception e) { 
     Log.e(TAG, "Exception: " + e.getMessage()); 
    } 
} 

/** 
* Showing notification with text only 
*/ 
private void showNotificationMessage(Context context, String title, String message, String timeStamp, Intent intent) { 
    notificationUtils = new NotificationUtils(context); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    notificationUtils.showNotificationMessage(title, message, timeStamp, intent); 
} 

/** 
* Showing notification with text and image 
*/ 
private void showNotificationMessageWithBigImage(Context context, String title, String message, String timeStamp, Intent intent, String imageUrl) { 
    notificationUtils = new NotificationUtils(context); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    notificationUtils.showNotificationMessage(title, message, timeStamp, intent, imageUrl); 
} 
} 

Antwort

0

Ihr Problem ist nicht mit Feuerbasis, aber mit dem LocalBroadcastManager. Sie zerstören Ihre Instanz onPause und das passiert, wenn die Aktivität im Hintergrund läuft. So ist die Nachricht von Feuerbasis erhalten nicht auf die Activity.Please Änderung:

@Override 
protected void onPause() { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); 
    super.onPause(); 
} 

Dies wird aufgerufen, wenn Aktivität zerstört wird, aber nicht, wenn die Aktivität im Hintergrund ist

@Override 
protected void onDestroy() { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); 
    super.onDestroy(); 
} 

hoffe, das hilft, Best!

+0

Noch immer das gleiche Ergebnis versucht :( –

Verwandte Themen