在 Listview onClicking Notification 中显示 FCM 通知消息
Display FCM notification message in Listview onClicking Notification
我已经使用我自己的服务器成功地将 Firebase 通知发送到 Android 应用程序,我想通过单击通知在新 activity 的 ListView 中列出消息。我应该如何处理通知消息显示在 ListView 中,我想帮助完成这项工作。
FirebaseMessageservice.java:
public class FcmMessagingService extends FirebaseMessagingService {
private Map<String, String> data;
private static final String TAG="MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
data=remoteMessage.getData();
String message=data.get("message");
String titledata=data.get("title");
ManualNotification(titledata , message);
Set<String> noti_set = PreferenceManager.getDefaultSharedPreferences(context).getStringSet("noti_set", new HashSet<String>());
Set<String> set = new HashSet<String>();
set.add(titledata+"---"+message);
set.addAll(noti_set);
PreferenceManager.getDefaultSharedPreferences(context).edit().putStringSet("noti_set", set).apply();
}
private void ManualNotification(String title , String messageBody){
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putString("message", messageBody);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
long[] vv = {500,1000};
Bitmap bmp = BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher);
Notification.BigPictureStyle bigpicture = new Notification.BigPictureStyle();
bigpicture.bigPicture(bmp);
NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(messageBody)
.setAutoCancel(true)
.setLargeIcon(bmp)
.setSound(defaultSoundUri)
.setVibrate(vv)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
}
FcmInstanceIdService.java:
public class FcmInstanceIdService extends FirebaseInstanceIdService {
private static final String REG_TOKEN = "REG_TOKEN";
@Override
public void onTokenRefresh() {
String recent_token= FirebaseInstanceId.getInstance().getToken();
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("FCM_TOKEN", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("FCM_TOKEN",recent_token);
editor.apply();
Log.d(REG_TOKEN,recent_token);
}
lst.java:
public class lst {
private String title;
private String message;
public lst() {
}
public lst(String title, String message) {
this.title = title;
this.message = message;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getmessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Messages.java:
public class Messages extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
Set<String> noti_set = PreferenceManager.getDefaultSharedPreferences(context).getStringSet("noti_set", new HashSet<String>());
for (String noti : noti_set){
String title = noti.splite("---")[0];
String message = noti.splite("---")[1];
list.add(new lst(title,message));
adapter.notifyDataSetChanged();
}
}
}
首先,
我建议您使用 RecyclerView 而不是 ListView 来显示通知列表。
有关如何开始的更多信息 here
其次,
onMessageRecieved(...) 仅当您的应用程序处于前台时triggered/fired 因此如果您的应用程序处于后台,将收到通知但它不会'不会附加到共享首选项。
最后
而不是 listing/storing 在客户端通知,在服务器端执行。如果您使用 Firebase,我建议您将所有通知放入实时数据库中,并在需要时从那里检索。
我已经使用我自己的服务器成功地将 Firebase 通知发送到 Android 应用程序,我想通过单击通知在新 activity 的 ListView 中列出消息。我应该如何处理通知消息显示在 ListView 中,我想帮助完成这项工作。
FirebaseMessageservice.java:
public class FcmMessagingService extends FirebaseMessagingService {
private Map<String, String> data;
private static final String TAG="MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
data=remoteMessage.getData();
String message=data.get("message");
String titledata=data.get("title");
ManualNotification(titledata , message);
Set<String> noti_set = PreferenceManager.getDefaultSharedPreferences(context).getStringSet("noti_set", new HashSet<String>());
Set<String> set = new HashSet<String>();
set.add(titledata+"---"+message);
set.addAll(noti_set);
PreferenceManager.getDefaultSharedPreferences(context).edit().putStringSet("noti_set", set).apply();
}
private void ManualNotification(String title , String messageBody){
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putString("message", messageBody);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
long[] vv = {500,1000};
Bitmap bmp = BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher);
Notification.BigPictureStyle bigpicture = new Notification.BigPictureStyle();
bigpicture.bigPicture(bmp);
NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(messageBody)
.setAutoCancel(true)
.setLargeIcon(bmp)
.setSound(defaultSoundUri)
.setVibrate(vv)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
}
FcmInstanceIdService.java:
public class FcmInstanceIdService extends FirebaseInstanceIdService {
private static final String REG_TOKEN = "REG_TOKEN";
@Override
public void onTokenRefresh() {
String recent_token= FirebaseInstanceId.getInstance().getToken();
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("FCM_TOKEN", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("FCM_TOKEN",recent_token);
editor.apply();
Log.d(REG_TOKEN,recent_token);
}
lst.java:
public class lst {
private String title;
private String message;
public lst() {
}
public lst(String title, String message) {
this.title = title;
this.message = message;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getmessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
} Messages.java:
public class Messages extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
Set<String> noti_set = PreferenceManager.getDefaultSharedPreferences(context).getStringSet("noti_set", new HashSet<String>());
for (String noti : noti_set){
String title = noti.splite("---")[0];
String message = noti.splite("---")[1];
list.add(new lst(title,message));
adapter.notifyDataSetChanged();
}
}
}
首先,
我建议您使用 RecyclerView 而不是 ListView 来显示通知列表。 有关如何开始的更多信息 here
其次,
onMessageRecieved(...) 仅当您的应用程序处于前台时triggered/fired 因此如果您的应用程序处于后台,将收到通知但它不会'不会附加到共享首选项。
最后
而不是 listing/storing 在客户端通知,在服务器端执行。如果您使用 Firebase,我建议您将所有通知放入实时数据库中,并在需要时从那里检索。