Android 多行通知,如 Gmail 应用程序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20748049/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android multiple line notification like Gmail app
提问by user3013243
I am trying to create a multiple line notification like the Gmail application does as shown in the image below (the 5 notifications grouped under one notification)
我正在尝试像 Gmail 应用程序那样创建一个多行通知,如下图所示(5 个通知分组在一个通知下)
I have tried various examples but can only seem to create single notifications like
我尝试了各种示例,但似乎只能创建单个通知,例如
public void createSingleNotification(String title, String messageText, String tickerttext) {
int icon = R.drawable.notification_icon; // icon from resources
CharSequence tickerText = tickerttext; // ticker-text
long when = System.currentTimeMillis(); // notification time
Context context = getApplicationContext(); // application Context
CharSequence contentTitle = title; // expanded message title
CharSequence contentText = messageText; // expanded message text
Intent notificationIntent = new Intent(this, MainActivity.class);
Bundle xtra = new Bundle();
xtra.putString("title", title);
xtra.putString("message", messageText);
notificationIntent.putExtras(xtra);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
notificationIntent, PendingIntent.FLAG_ONE_SHOT
+ PendingIntent.FLAG_UPDATE_CURRENT);
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
Notification notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
notification.defaults |= Notification.DEFAULT_LIGHTS;
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.FLAG_AUTO_CANCEL;
notification.flags = Notification.DEFAULT_LIGHTS
| Notification.FLAG_AUTO_CANCEL;
final int HELLO_ID = 0;
mNotificationManager.notify(HELLO_ID, notification);
}
I am not sure how to create a notification group that I can add lines to.
我不确定如何创建可以添加行的通知组。
采纳答案by Marcin Orlowski
You are looking for "Big View Style", like this:
您正在寻找“大视图样式”,如下所示:
Related documentation:
相关文档:
回答by Ganesh Katikar
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Event tracker")
.setContentText("Events received")
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
String[] events = {"line 1","line 2","line 3","line 4","line 5","line 6"};
// Sets a title for the Inbox in expanded layout
inboxStyle.setBigContentTitle("Event tracker details:");
...
// Moves events into the expanded layout
for (int i=0; i < events.length; i++) {
inboxStyle.addLine(events[i]);
}
// Moves the expanded layout object into the notification object.
mBuilder.setStyle(inboxStyle);
...
// Issue the notification here.
回答by Sufiyan Ansari
Here i got the solution :Make sure to create BrodCast Reciever to clear array stack when notification dismiss
在这里我得到了解决方案:确保创建 BrodCast Reciever 以在通知解除时清除数组堆栈
static ArrayList<String> notifications = new ArrayList<>();
private static void sendNotification(String messageBody,Context cxt) {
//onDismiss Intent
Intent intent = new Intent(cxt, MyBroadcastReceiver.class);
PendingIntent broadcastIntent = PendingIntent.getBroadcast(cxt.getApplicationContext(), 0, intent, 0);
//OnClick Listener
startWFApplication().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(cxt, 0, startWFApplication(),
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(cxt)
.setSmallIcon(R.drawable.fevicon)
.setContentTitle("Title")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
// Sets a title for the Inbox in expanded layout
inboxStyle.setBigContentTitle("Title - Notification");
inboxStyle.setSummaryText("You have "+notifications.size()+" Notifications.");
// Moves events into the expanded layout
notifications.add(messageBody);
for (int i=0; i < notifications.size(); i++) {
inboxStyle.addLine(notifications.get(i));
}
// Moves the expanded layout object into the notification object.
notificationBuilder.setStyle(inboxStyle);
NotificationManager notificationManager =
(NotificationManager) cxt.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
notificationBuilder.setDeleteIntent(broadcastIntent);
}
public static Intent startWFApplication(){
Intent launchIntent = new Intent();
launchIntent.setComponent(new ComponentName("your.package", "Yyour.package.servicename"));
return launchIntent;
}
BroadCastReciever would look like this:
BroadCastReciever 看起来像这样:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Notification.notifications.clear();
}
}
In the manifest Put this:
在清单中放这个:
<receiver
android:name="your.package.MyBroadcastReceiver"
android:exported="false" >
</receiver>
回答by VA Entertaiment
I know this has been asked a long time ago and probably lots of users like me were searching here as well but I will give the full code of notification in this manner. Imagine a scenario where you have a chat application and where you want to get notifications grouped BY EACH USER!notice by each user. So the best way to do it to notify by unique user id, thus you have to write a single code to notify as you can`t guess how many notifications are present at that moment if you are targeting below API level 23 which is getting almost lots of users out of sight. So what shall you do when you want to group each user received notification and keep logic? The best way I did that was using shared preferences with some slight logic there let me post the code with comments.
我知道很久以前就有人问过这个问题,可能很多像我这样的用户也在这里搜索过,但我会以这种方式提供完整的通知代码。想象一个场景,您有一个聊天应用程序,并且您希望获得按每个用户分组的通知!每个用户的通知。所以最好的方法是通过唯一的用户 id 来通知,因此你必须编写一个代码来通知,因为如果你的目标低于 API 级别 23,你将无法猜测当时有多少通知,这几乎是很多用户看不见。那么当你想对每个用户收到的通知进行分组并保持逻辑时你该怎么办?我这样做的最好方法是使用带有一些轻微逻辑的共享首选项,让我发布带有注释的代码。
(By this you targeting to lower APIs so the KitKat will handle this logic too)
(通过这种方式,您的目标是较低的 API,因此 KitKat 也将处理此逻辑)
The class which imitates the notification as a test.
模拟通知作为测试的类。
/**
* 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();
}
}
}
The broadcast receiver for delete intent. Do not forget to add a receiver to your manifest!
删除意图的广播接收器。不要忘记将接收器添加到您的清单中!
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();
}
}
回答by dsandler
There's currently no such thing as a "notification group", but rather individual notifications with multiple lines of text (as has already been pointed out this is done with the bigContentView
, which you want to use the Builder
to create). To update a notification to add more data, just post it again (with the same ID and tag) with a bigger string in BigTextStyle, or more lines in InboxStyle.
目前没有“通知组”这样的东西,而是带有多行文本的单独通知(正如已经指出的那样,这是使用 完成的bigContentView
,您想使用Builder
来创建)。要更新通知以添加更多数据,只需在 BigTextStyle 中使用更大的字符串或在 InboxStyle 中使用更多行再次发布(使用相同的 ID 和标签)。