Opis apki:
1 aktywność- 1 button który otwiera drugą aktywność
2 aktywność- RecyclerView wyświetlający w CardView dane z Firebase (tytuł wiadomości, treść wiadomości i datę dodania)
Dane do Firebase dodaje za pomocą aplikacji webowej, androidowa apka tylko wyświetla dane.
Po każdym dodaniu danych do Firebase użytkownicy dostają powiadomienie (push notifications)
Tak wygląda kod 1 aktywności:
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.NotificationCompat;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView mText;
private DatabaseReference ref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText = (TextView) findViewById(R.id.testTV);
ref = FirebaseDatabase.getInstance().getReference().child("SM");
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
utworzNotyfikacje();
}
@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);
button = (Button) findViewById(R.id.openActivity2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
}
private void utworzNotyfikacje() {
Intent intent = new Intent(this, Main2Activity.class);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification noti = new NotificationCompat.Builder(this)
.setContentTitle("Nowa wiadomość")
.setSmallIcon(R.mipmap.ic_launcher)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setContentIntent(pIntent)
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0, noti);
}
}
Kiedy wysyłam dane do Firebase z webowej aplikacji przychodzi powiadomienie po kliknięciu którego otwiera się druga aktywność czyli lista wiadomości. Idealnie 😉
Problem pojawia się gdy uruchamiam aplikacje. Wtedy też przychodzą powiadomienia w dodatku nie jest to jedno powiadomienie tylko tyle ile jest rekordów w Firebase (100 rekordów, sto razy zostaje odtworzony dzwięk powiadomienia)
Wiem gdzie jest błąd (przynajmniej tak mi się wydaje) ChildEventListener jest w onCreate więc oczywiste (przynajmniej tak mi się wydaje 😉 ), że onChildAdded sprawdza, że coś jest dodane i uruchamia metodę utworzNotyfikacje.
Gdy próbuję wyrzucić ChildEventListener poza onCreate to pojawiają się błędy. Pewnie dlatego, że źle to robię, wstawiam w złe miejsce itd itp.
Nie mam pojecia jak rozwiązać ten problem. Jakieś pomysły? Dodam tylko, że jestem bardzo początkujący 😉
EDIT:
Zmieniłem ChildEventListener na ValueEventListener. róznica polega na tym, że bez względu na ilość rekordów w Firebase podczas urucamiania apki powiadomienie przychodzi tylko raz 🙂