Szukałem chyba wszędzie gdzie się dało i nie znalazłem rozwiązania swojego problemu, czyli servisu który będzie nasłuchiwał czy zostało coś dodane do Firebase i wyświetlający notyfikacje.
A, że jestem bardzo początkujący to zrobiłem to tak jak umiałem. I teraz pytanie: czy to ma sens?
Service nasłuchuje zmian w Firebase, wszystko działa ok ale przy uruchomieniu apka myślała, że coś zostało dodane i podobnie po "ubiciu" pokazywała powiadomienie jakby cos zostało dodane do Firebase.
Rozwiązałem to w taki sposób, że pobieram "key" ostatniego rekordu i porównuje go z "key" zapisanym do SharedPreferences. Jak są takie same, czyli nie dodano nowego postu nic się nie dzieje. Jak są różne (bo zostało coś dodane) to wyświetlam notyfikacje i nadpisuje w SharedPreferences nowy "key"
Wszystko działa jak należy ale nie wiem czy takie rozwiązanie jest optymalne i sensowne.
Kod:
public class MyFirebaseMessagingService extends Service{
private Query ref;
private String id;
private String idZero;
private Object object;
private Object objectZero = "1";
//sharedPrefernces
private SharedPreferences pref;
private String prefName = "myPref";
private String SID = "sId";
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
ref = FirebaseDatabase.getInstance().getReference("SM").limitToLast(1);
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
object = dataSnapshot.getRef().getKey();
id = object.toString();
pref = getSharedPreferences(prefName, MODE_PRIVATE);
idZero = pref.getString(SID, "");
if (id.equals(idZero)){
Toast.makeText(MyFirebaseMessagingService.this, "Brak nowych wiadomości", Toast.LENGTH_SHORT).show();
}
else{
utworzNotyfikacje();
objectZero = dataSnapshot.getRef().getKey();
idZero = objectZero.toString();
SharedPreferences.Editor editor = pref.edit();
editor.putString(SID, idZero);
editor.commit();
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
ref.addChildEventListener(childEventListener);
return START_STICKY;
}
@Override
public void onDestroy() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
Gdyby ktoś doświadczony mógł się wypowiedzieć na temat mojego rozwiązania byłbym bardzo wdzięczny 🙂