我有一个聊天风格的应用程序。我的服务器在用户收到消息时发送gcm通知。
Android方面我正在听这些消息并触发通知。 现在我正在使用相同的ID调用.notify,所以我在状态栏中没有多个通知。
我想要实现的是像gmail。它将所有消息分组到一个通知中,并且可以扩展。
我环顾四周,看到收件箱样式通知,问题是我不明白如何“追加”消息,因为它们来自gcm?
因为我建立通知的所有内容都会删除栏中已有的通知。
所以......我想知道是否必须将通知存储在数据库中?当收到消息时,我会检索以前的消息并完全创建通知吗?
如果我按照上述步骤操作,我将不得不在点击或清除通知时收听。
这是有道理的吗?或者我是否重新发明轮子并且已经实施了类似的东西?
答案 0 :(得分:1)
基本上你是在正确的轨道上。是的,您需要将信息保存在某个地方,以便在获得其他推送通知时可以使用它,然后您就会知道您的摘要内容会是什么样。
以下是一个读取已保存通知(作为JSON)的示例,因此您可以执行分组:
private LinkedList<JSONObject> getPreviousNotifications()
{
File file = new File( getFilesDir(), NOTIFICATIONS_FILENAME );
if ( file.exists() )
{
LinkedList<JSONObject> list = new LinkedList<>();
try
{
BufferedReader reader = new BufferedReader( new FileReader( file ) );
String line;
while ( ( line = reader.readLine() ) != null )
{
list.add( new JSONObject( line ) );
}
reader.close();
}
catch ( JSONException e )
{
Log.debug( "json error" );
e.printStackTrace();
}
catch ( IOException e )
{
Log.debug( "failed to open file for reading" );
e.printStackTrace();
}
return list;
}
return null;
}
现在您已收到先前的通知,您可以生成“扩展”文本以及摘要文本。遍历您之前(和当前)的项目,为您的扩展版本生成几行内容,并决定您要用于摘要显示的内容。
NotificationCompat.Builder summary = new NotificationCompat.Builder( this )
.setSmallIcon( R.drawable.ic_stat_notify )
.setColor( getResources().getColor( R.color.push_group_background ) )
.setContentTitle( yourSummaryTitle )
.setContentText( yourDetailedTextBuilder.toString() )
.setDefaults( Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE )
.setPriority( Notification.PRIORITY_DEFAULT )
.setTicker( yourSummaryText )
.setGroup( NOTIFICATION_GROUP_KEY )
.setGroupSummary( true )
.setStyle( style )
// You'll want to do this in order to delete the local file if he user swipes away your notification
.setDeleteIntent( deleteIntent )
.setAutoCancel( true );
// go directly to NotificationsActivity
summary.setContentIntent( getPendingIntentForNotifications( this, null ) );