堆栈Android通知,因为它们来自gcm

时间:2015-12-08 21:38:00

标签: android notifications stack google-cloud-messaging

我有一个聊天风格的应用程序。我的服务器在用户收到消息时发送gcm通知。

Android方面我正在听这些消息并触发通知。 现在我正在使用相同的ID调用.notify,所以我在状态栏中没有多个通知。

我想要实现的是像gmail。它将所有消息分组到一个通知中,并且可以扩展。

我环顾四周,看到收件箱样式通知,问题是我不明白如何“追加”消息,因为它们来自gcm?

因为我建立通知的所有内容都会删除栏中已有的通知。

所以......我想知道是否必须将通知存储在数据库中?当收到消息时,我会检索以前的消息并完全创建通知吗?

如果我按照上述步骤操作,我将不得不在点击或清除通知时收听。

这是有道理的吗?或者我是否重新发明轮子并且已经实施了类似的东西?

1 个答案:

答案 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 ) );