发布通知显示日期'星期四,1970年1月1日'一段时间后

时间:2012-07-04 01:07:59

标签: android date notifications android-4.0-ice-cream-sandwich

我是通知部门强大的应用程序的开发人员。我最近升级到了运行Android 4.0.3的HTC One X,发现我在之前运行Android 2.1的手机上没有注意到这个问题。

我的应用发布的通知未设置日期,并且我以前的手机通知中从未显示过日期。在我的新手机上,当发布通知时,日期不会出现,但过了一段时间,“Thu,1970年1月1日”日期出现,我无法理解为什么。

当我说“过了一会儿”时,我并不是说你一直盯着屏幕几秒钟/分钟,看看日期出现了。我的意思是在使用手机一段时间后,将其放下,再次使用它,无论如何,最终,我的应用程序发布的所有通知都将具有该日期。

我已经看过这种情况发生了几次,但是我找不到一个模式,并且在发生这种情况时能够理解我是否能找到修复方法。有没有人有任何想法为什么会在ICS上发生这种情况?

我没有多大的相关性,但我的postNotification方法的代码是完整的:

NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);

Intent intent = NoteEditorSingleActivity.createIntent(mContext);
intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, notifyId);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

builder.setContentIntent(PendingIntent.getActivity(mContext, (int)notifyId, intent,
        PendingIntent.FLAG_CANCEL_CURRENT));

builder.setContentTitle(noteTitle);
builder.setContentText(noteDescription);
builder.setSmallIcon(iconId);
builder.setTicker(noteTitle.length() > 0 ? noteTitle : null);
builder.setWhen(0);

Notification notification = builder.getNotification();

long noteSortOrder = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD ? 1 : -1;

notification.flags = Notification.FLAG_NO_CLEAR;
notification.when = noteSortOrder * notifyId;

mNotificationManager.notify((int)notifyId, notification);

我知道我正在使用构建器将when设置为0,并通过直接更改when对象中的notification值来设置不同的值。我不记得为什么我最初这样做了,但这是有原因的。

我不明白的是,在调用notify()方法并查看状态栏中的通知后的那一刻,没有日期。为什么在使用手机一段时间后会出现。

这就是我想知道和解决的问题。

1 个答案:

答案 0 :(得分:1)

您的通知when应设置为您希望显示的时间(自UNIX纪元以来的毫秒数:1970年1月1日00:00:00 UTC)。将其设置为0是一种流行但未记录(因此无法保证工作)的方式,不显示任何时间戳。

您没有显示设置notifyId的位置,但您可能会将when设置为自此纪元以来的较低毫秒数:

notification.when = noteSortOrder * notifyId;

您首先将其设置为0然后再更改它的原因是您正在使用另一个未记录的黑客,试图影响系统如何将您的通知与其他人相关联。通过将builder.getNotification()设置为0来构建通知(when),您可以在没有时间戳的情况下显示其View。然后,您在调用notify()之前更改时间戳以影响排序顺序。

事实上,ICS实际上最终会以您设置的非常低的时间戳显示您的通知,这可能是也可能无法解决。可能只是ICS最终会在一段时间后重新布置您的通知,当然这会使用您给出的最后一个时间戳。

就个人而言,我认为最好的办法是删除黑客攻击。 (好吧,我认为你可能可以将时间戳设置为0以完全隐藏时间戳,但排序顺序黑客似乎要求麻烦。)