Я использую наблюдателя, который создает уведомление при изменении данных:
private void setAndObserveNewBlogPosts() {
BlogPostsViewModelFactory factory = new BlogPostsViewModelFactory(getApplication());
ViewModelProvider vmp = new ViewModelProvider(this, factory);
BlogPostsViewModel blogPostsViewModel = vmp.get(BlogPostsViewModel.class);
blogPostsViewModel.getNewBlogPostsLive().observe(this, new Observer<ArrayList<BlogPost>>() {
@Override
public void onChanged(ArrayList<BlogPost> blogPosts) {
Log.d(TAG, "onChanged: in main: new BlogPosts: ");
if(action.equals("showNews")) {
return;
}
createNotificationChannel();
makeNotification(blogPosts);
Toast.makeText(getBaseContext(), "new data!", Toast.LENGTH_SHORT).show();
}
});
}
private void makeNotification(ArrayList<BlogPost> blogPosts) {
Intent intent = new Intent(this, MainActivity.class);
intent.setAction("showNews");
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
4,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "new");
builder.setSmallIcon(R.drawable.ic_notification_icon);
builder.setContentTitle("New Posts");
builder.setContentText(blogPosts.size() + " new posts");
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
notificationManagerCompat.notify(0, builder.build());
}
private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "Name";
String description = "Description";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel("new", name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
Уведомление работает нормально, но при нажатии на уведомление по какой-то причине наблюдатель снова запускается, даже если данные остаются прежними. Почему это происходит? Когда приложение запускается нормально, а не из уведомления, наблюдатель не срабатывает.