2016-04-04 6 views
0

Ich habe eine Gruppen-Chat-Funktion. Jeder Person in der Gruppe wird der Push (auch der Absender der Nachricht) erhalten. Wenn die Person die Gruppe geöffnet hat, d. H. Der Chatbereich sichtbar ist, möchte ich, dass der Push nicht in der Benachrichtigungsleiste erscheint und den Chat direkt aktualisiert (den ich in einer Listenansicht zeige).dynamicly update listview, wenn eine gcm Push-Benachrichtigung empfangen wird, ohne es in der Benachrichtigungsleiste anzuzeigen

Zunächst wird der Chat-Verlauf i von Web-Service erhalten (wenn öffnet der Benutzer den Chat-Bereich)

Hoffnung ich in der Lage bin zu euch klar mit dem machen, was ich will .thanks im Voraus

Antwort

4

Vor allem, wenn Sie Nachricht in onMessage() von GCMIntentService bekommen, brodcast senden. Wie,

Intent i = new Intent(); 
          i.setAction("appendChatScreenMsg"); 
          i.putExtra("sender_id", b.getString("sender_id")); 
          i.putExtra("message", b.getString("message")); 
          i.putExtra("time", getCurrentTime()); 
          i.putExtra("date", getCurrentDate()); 
          this.sendBroadcast(i); 

Als nächstes stellen BroadcastReceiver in Ihrem Chat-Aktivität oder Fragment Chat. Wie,

BroadcastReceiver appendChatScreenMsgReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle b = intent.getExtras(); 
     if (b != null) { 
      int totalItems = adapter.getCount() - 1; 


       ChatModel model = new ChatModel("" + sharedPreferences.getString(VariableBag.USERID, ""), ""+ b.getString("sender_id"), "" + b.getString("message"), b.getString("date"), b.getString("time")); 
       arrChat.add(model); 


      if (adapter != null) { 

       if (lstChat.getLastVisiblePosition() == totalItems) { 
        adapter.notifyDataSetChanged(); 
        lstChat.setSelection(adapter.getCount()); 
       } else { 
        adapter.notifyDataSetChanged(); 
       } 
      } else { 
       adapter = new ChatAdapter(getActivity()); 
       lstChat.setAdapter(adapter); 
       adapter.notifyDataSetChanged(); 
       lstChat.setSelection(adapter.getCount()); 
      } 
     } 
    } 
}; 

Als nächstes registrieren BroadcastReceiver in onCreate(). Wie

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().registerReceiver(this.appendChatScreenMsgReceiver, new IntentFilter("appendChatScreenMsg")); 
} 

nächste unregisterReceiver in onDestroy(). Wie,

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    getActivity().unregisterReceiver(appendChatScreenMsgReceiver); 
} 

Erläuterung:

1.) Wenn die Meldung in GCMIntentService() empfangen wird, in erster Linie, Wetter überprüfen Sie im Chat-Bildschirm sind oder nicht.

2.) Wenn Sie im Chat-Bildschirm sind, senden Sie Ihre Nachricht mit Intent und Broadcast.

3.) Erstellen Sie jetzt Ihren BroadcastReceiver() im Chat-Bildschirm.

4.) Registrieren Sie Ihren BroadcastReceiver() in onCreate() und entfernen Sie die Registrierung in onDestroy().

5.) Wenn die Nachricht gesendet wird und Sie sich im Chat-Bildschirm befinden, erhalten Sie diesen Broadcast-Empfänger.

6.) Jetzt Was auch immer Sie tun möchten.

7.) Wenn Sie nicht im Chat-Bildschirm sind, zeigen Sie die entsprechende Nachricht in der Benachrichtigung an. Sende nicht.

Hinweis: Vergewissern Sie sich, in welchem ​​Bildschirm Sie sich gerade befinden.

0

ich erreichen denke du solltest Observer Design Pattern verwenden. Setzen Sie einen Listener, wo Sie Nachrichten anzeigen und in Ihrem Dienst, wo Sie Ihre Nachrichten vom Server für Listener zu überprüfen, wenn Listener nicht Nnt, rufen Sie eine Update-Methode von Listener und aktualisieren Sie Ihre Liste sonst Show-Benachrichtigung.
Beispiel dieser Pater:
http://www.vogella.com/tutorials/DesignPatternObserver/article.html