我知道很久以前就有人问过这个问题,可能很多像我这样的用户也在这里搜索过,但我会以这种方式给出完整的通知代码。想象一个场景,您有一个聊天应用程序,并且您希望获得按每个用户分组的通知!每个用户的通知。因此,最好的方法是通过唯一的用户 ID 进行通知,因此您必须编写一个代码来通知,因为如果您的目标是低于 API 级别 23,那么您无法猜测此时存在多少通知,这几乎很多用户看不见。那么当你想对每个收到通知的用户进行分组并保持逻辑时,你应该怎么做?我这样做的最好方法是使用带有一些轻微逻辑的共享首选项,让我使用 cmets 发布代码。
(通过这个你定位到较低的 API,所以 KitKat 也会处理这个逻辑)
模拟通知作为测试的类。
/**
* Simple id just for test
*/
private int NOTIFICATION_ID = 1;
private static int value = 0;
Notification.InboxStyle inboxStyle = new Notification.InboxStyle();
private NotificationCompat.Builder mCopat;
private Bitmap bitmap;
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
mCopat = new NotificationCompat.Builder(getApplicationContext());
/**
* Here we create shared preferences.Probably you will create some helper class to access shared preferences from everywhere
*/
sharedPreferences = getSharedPreferences("shared", MODE_PRIVATE);
editor = sharedPreferences.edit();
/**
* I clear this for test purpose.
*/
editor.clear();
editor.commit();
}
public void hey(View view) {
/**
* Add notification,let`s say add 4 notifications with same id which will be grouped as single and after it add the rest which will be grouped as new notification.
*/
int clickedTime = value++;
if (clickedTime == 4) {
NOTIFICATION_ID++;
}
/**
* Here is the important part!We must check whether notification id inserted inside the shared preferences or no.If inserted IT MEANS THAT WE HAVE an notification
* to where we should add this one (add the new one to the existing group in clear way)
*/
if (sharedPreferences.getString(String.valueOf(NOTIFICATION_ID), null) != null) {
Log.d("fsafsafasfa", "hey: " + "not null adding current");
/**
* TAKE A NOTICE YOU MUST NOT CREATE A NEW INSTANCE OF INBOXSTYLE, OTHERWISE, IT WON`T WORK. JUST ADD VALUES TO EXISTING ONE
*/
NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
builder.setContentTitle("Lanes");
builder.setContentText("Notification from Lanes " + value);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(bitmap);
builder.setAutoCancel(true);
/**
* By this line you actually add an value to the group,if the notification is collapsed the 'Notification from Lanes' text will be displayed and nothing more
* otherwise if it is expanded the actual values (let`s say we have 5 items added to notification group) will be displayed.
*/
inboxStyle.setBigContentTitle("Enter Content Text");
inboxStyle.addLine("hi events " + value);
/**
* This is important too.Send current notification id to the MyBroadcastReceiver which will delete the id from sharedPrefs as soon as the notification is dismissed
* BY USER ACTION! not manually from code.
*/
Intent intent = new Intent(this, MyBroadcastReceiver.class);
intent.putExtra("id", NOTIFICATION_ID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
/**
* Simply set delete intent.
*/
builder.setDeleteIntent(pendingIntent);
builder.setStyle(inboxStyle);
nManager.notify("App Name", NOTIFICATION_ID, builder.build());
/**
* Add id to shared prefs as KEY so we can delete it later
*/
editor.putString(String.valueOf(NOTIFICATION_ID), "notification");
editor.commit();
} else {
/***
* Here is same logic EXCEPT that you do create an INBOXSTYLE instance so the values are added to actually separate notification which will just be created now!
* The rest logic is as same as above!
*/
/**
* Ok it gone to else,meaning we do no have any active notifications to add to,so just simply create new separate notification
* TAKE A NOTICE to be able to insert new values without old ones you must call new instance of InboxStyle so the old one will not take the place in new separate
* notification.
*/
Log.d("fsafsafasfa", "hey: " + " null adding new");
inboxStyle = new Notification.InboxStyle();
NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
builder.setContentTitle("Lanes");
builder.setContentText("Notification from Lanes " + value);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(bitmap);
builder.setAutoCancel(true);
inboxStyle.setBigContentTitle("Enter Content Text");
inboxStyle.addLine("hi events " + value);
Intent intent = new Intent(this, MyBroadcastReceiver.class);
intent.putExtra("id", NOTIFICATION_ID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
builder.setDeleteIntent(pendingIntent);
builder.setStyle(inboxStyle);
nManager.notify("App Name", NOTIFICATION_ID, builder.build());
editor.putString(String.valueOf(NOTIFICATION_ID), "notification");
editor.commit();
}
}
}
删除意图的广播接收器。不要忘记在清单中添加接收器!
public class MyBroadcastReceiver extends BroadcastReceiver {
/**
* Receive swipe/dismiss or delete action from user.This will not be triggered if you manually cancel the notification.
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
/**
* As soon as received,remove it from shared preferences,meaning the notification no longer available on the tray for user so you do not need to worry.
*/
SharedPreferences sharedPreferences = context.getSharedPreferences("shared", context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove(String.valueOf(intent.getExtras().getInt("id")));
editor.commit();
}
}