NotificationCompat.InboxStyle:我最多可以添加多少行?

时间:2016-06-29 21:40:08

标签: android android-notifications

我使用NotificationCompat.InboxStyle来显示通知。

我无法找出最多可以添加NotificationCompat#addLine()的行数,以便所有收件箱消息仍然可以在(扩展)通知中看到。

我在documentation of NotificationCompat.InboxStyle

中找到了这个
  

Helper类,用于生成包含(最多5个)字符串列表的大格式通知。

根据这个,最多可以是五行

但:
(1)在NotificationCompat.java中我发现了这个:

private static final int MAX_CHARSEQUENCE_LENGTH = 5 * 1024;

...

ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();

...

/**
 * Append a line to the digest section of the Inbox notification.
 */
public InboxStyle addLine(CharSequence cs) {
    mTexts.add(Builder.limitCharSequenceLength(cs));
    return this;
}

...

protected static CharSequence limitCharSequenceLength(CharSequence cs) {
    if (cs == null) return cs;
    if (cs.length() > MAX_CHARSEQUENCE_LENGTH) {
        cs = cs.subSequence(0, MAX_CHARSEQUENCE_LENGTH);
    }
    return cs;
}

这表明创建InboxStyle时不限制线条。

(2)我发现,通过尝试,我可以添加7行,这些行将显示在Android手机上的通知的展开视图中。当我添加8行时,它会显示&#34; ...&#34;作为第7个收件箱消息。

所以现在我的问题:
收件箱消息行的限制是7还是限制设备特定的,例如取决于设备的屏幕大小?

如果它是特定于设备的,那就是行数我可以确定它们显示在所有Android版本上(支持扩展通知)?
这会是文档中提到的五个字符串的限制吗?

或者我错过了什么?我只是无法找到有关它的任何信息,之前似乎没有人遇到过这个问题 - 我感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

检查

的结束行
private ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>(5);

在Notification.java中,如果您不想通过所有这些

,请在其下进行解释

Helper类,用于生成包含(最多5个)字符串列表的大格式通知。

如果平台不提供大格式通知,则此方法无效。用户将始终看到正常的通知视图。       这个类是一个“重建者”:它附加到一个Builder对象并修改它的行为,如下所示:

Notification noti = new Notification.Builder()
     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
     .setContentText(subject)
     .setSmallIcon(R.drawable.new_mail)
     .setLargeIcon(aBitmap)
     .setStyle(new Notification.InboxStyle()
     .addLine(str1)
     .addLine(str2)
     .setContentTitle(&quot;&quot;)
     .setSummaryText(&quot;+3 more&quot;))
     .build();

这就是它在文档中所说的内容。

你错过了整个文档的图片。我们使用以下代码显示通知。

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(1 /* ID of notification */, notificationBuilder.build());

以下是NotificationCompat.Builder.build()

中的通知代码
    public Notification build() {
        return IMPL.build(this, getExtender());
    }

此处IMPL是一个静态接口,具有实现通知方法的方法

private static final NotificationCompatImpl IMPL;

interface NotificationCompatImpl {
    public Notification build(Builder b, BuilderExtender extender);
    public Bundle getExtras(Notification n);
    public int getActionCount(Notification n);
    public Action getAction(Notification n, int actionIndex);
    public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables);
    public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions);
    public String getCategory(Notification n);
    public boolean getLocalOnly(Notification n);
    public String getGroup(Notification n);
    public boolean isGroupSummary(Notification n);
    public String getSortKey(Notification n);
    Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc);
    NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
            Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
            RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory);
}

IMPL使用SDK_INT定义为

static {
        if (Build.VERSION.SDK_INT >= 21) {
            IMPL = new NotificationCompatImplApi21();
        } else if (Build.VERSION.SDK_INT >= 20) {
            IMPL = new NotificationCompatImplApi20();
        } else if (Build.VERSION.SDK_INT >= 19) {
            IMPL = new NotificationCompatImplKitKat();
        } else if (Build.VERSION.SDK_INT >= 16) {
            IMPL = new NotificationCompatImplJellybean();
        } else if (Build.VERSION.SDK_INT >= 14) {
            IMPL = new NotificationCompatImplIceCreamSandwich();
        } else if (Build.VERSION.SDK_INT >= 11) {
            IMPL = new NotificationCompatImplHoneycomb();
        } else if (Build.VERSION.SDK_INT >= 9) {
            IMPL = new NotificationCompatImplGingerbread();
        } else {
            IMPL = new NotificationCompatImplBase();
        }

由于我使用JellyBean,因此我检查了NotificationCompatImplJellybean.Build

static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
        @Override
        public Notification build(Builder b, BuilderExtender extender) {
            NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder(
                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly,
                    b.mPeople, b.mExtras, b.mGroupKey, b.mGroupSummary, b.mSortKey);
            addActionsToBuilder(builder, b.mActions);
            addStyleToBuilderJellybean(builder, b.mStyle);
            return extender.build(b, builder);
        }

此处addStyleToBuilderJellybean()导致

private static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
            Style style) {
        if (style != null) {
            if (style instanceof BigTextStyle) {
                BigTextStyle bigTextStyle = (BigTextStyle) style;
                NotificationCompatJellybean.addBigTextStyle(builder,
                        bigTextStyle.mBigContentTitle,
                        bigTextStyle.mSummaryTextSet,
                        bigTextStyle.mSummaryText,
                        bigTextStyle.mBigText);
            } else if (style instanceof InboxStyle) {
                InboxStyle inboxStyle = (InboxStyle) style;
                NotificationCompatJellybean.addInboxStyle(builder,
                        inboxStyle.mBigContentTitle,
                        inboxStyle.mSummaryTextSet,
                        inboxStyle.mSummaryText,
                        inboxStyle.mTexts);
            } else if (style instanceof BigPictureStyle) {
                BigPictureStyle bigPictureStyle = (BigPictureStyle) style;
                NotificationCompatJellybean.addBigPictureStyle(builder,
                        bigPictureStyle.mBigContentTitle,
                        bigPictureStyle.mSummaryTextSet,
                        bigPictureStyle.mSummaryText,
                        bigPictureStyle.mPicture,
                        bigPictureStyle.mBigLargeIcon,
                        bigPictureStyle.mBigLargeIconSet);
            }
        }
    }

此处addInboxStyle转到NotificationCompatJellyBean.java

public static void addInboxStyle(NotificationBuilderWithBuilderAccessor b,
            CharSequence bigContentTitle, boolean useSummary,
            CharSequence summaryText, ArrayList<CharSequence> texts) {
        Notification.InboxStyle style = new Notification.InboxStyle(b.getBuilder())
            .setBigContentTitle(bigContentTitle);
        if (useSummary) {
            style.setSummaryText(summaryText);
        }
        for (CharSequence text: texts) {
            style.addLine(text);
        }
    }

此处style.addLine(text)转到Notification.java,在此处声明为:

public InboxStyle addLine(CharSequence cs) {
            mTexts.add(safeCharSequence(cs));
            return this;
        }

现在在mTexts

中查看Notification.java的声明

private ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>(5);

这表明它将通知行的数量限制为5.我知道通过所有这些是非常复杂的,但是在完成它在Notification.java中声明的所有声明之后的最后,这仅限于5只有行。

使用的类有:NotificationManagerCompat.javaNotificationCompatJellyBean.javaNotification.java

2)关于你问题的第2部分。即使我不明白为什么它显示7行而不是5行 enter image description here 这是添加8行的输出。我在模拟器中使用Google Nexus S-4.1.1设备。因此我认为这与设备无关。

答案 1 :(得分:-1)

答案简单明了,报告的最大值为5:https://developer.android.com/reference/android/app/Notification.InboxStyle.html

取自上述链接:

  

Helper类,用于生成包含(最多5个)字符串

列表的大格式通知