我使用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版本上(支持扩展通知)?
这会是文档中提到的五个字符串的限制吗?
或者我错过了什么?我只是无法找到有关它的任何信息,之前似乎没有人遇到过这个问题 - 我感谢任何帮助,谢谢。
答案 0 :(得分:3)
检查
的结束行private ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>(5);
在Notification.java中,如果您不想通过所有这些
,请在其下进行解释Helper类,用于生成包含(最多5个)字符串列表的大格式通知。
如果平台不提供大格式通知,则此方法无效。用户将始终看到正常的通知视图。 这个类是一个“重建者”:它附加到一个Builder对象并修改它的行为,如下所示:
Notification noti = new Notification.Builder()
.setContentTitle("5 New mails from " + sender.toString())
.setContentText(subject)
.setSmallIcon(R.drawable.new_mail)
.setLargeIcon(aBitmap)
.setStyle(new Notification.InboxStyle()
.addLine(str1)
.addLine(str2)
.setContentTitle("")
.setSummaryText("+3 more"))
.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.java
,NotificationCompatJellyBean.java
和Notification.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个)字符串
列表的大格式通知