0

私は通知部門に強いアプリケーションの開発者です。最近、Android 4.0.3 を実行している HTC One X にアップグレードしましたが、Android 2.1 を実行している以前の電話では気付かなかった問題に気付きました。

アプリが投稿する通知には日付が設定されておらず、以前の電話通知にも日付が表示されませんでした。私の新しい電話では、通知が投稿されたときに日付が表示されませんが、しばらくすると「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);

ビルダーで を 0 に設定し、オブジェクトで値を直接when変更して別の値に設定していることはわかっています。最初にこれを行った理由を思い出せませんが、理由があります。whennotification

私が理解できないのは、notify()メソッドを呼び出した直後にステータスバーの通知を見ると、日付がないということです。電話をしばらく使用した後に表示されるのはなぜですか。

それが私が知りたい、修正したいことです。

4

1 に答える 1

1

通知whenは、表示したい時間に設定する必要があります (UNIX エポック: 1970 年 1 月 1 日 00:00:00 UTC からのミリ秒単位)。0 に設定することは、タイムスタンプを表示しない一般的な方法ですが、文書化されていません (したがって、動作することが保証されていません)。

がどこに設定されているかは示していませんが、おそらくここでエポックからのミリ秒数を低くnotifyId設定しています。when

notification.when = noteSortOrder * notifyId;

最初に設定してから0後で変更する理由は、別の文書化されていないハックを使用して、システムが他の通知との関係で通知を配置する方法に影響を与えようとしているからです。builder.getNotification()0 に設定して (with で)通知を作成することによりwhen、ビューをタイムスタンプなしでレイアウトできます。次に、タイムスタンプを変更して、を呼び出す前に並べ替え順序に影響を与えますnotify()

ICS がたまたま設定した非常に低いタイムスタンプで通知を表示してしまうという事実は、修正できる場合とできない場合があります。しばらくして ICS が通知を再レイアウトすることになるだけかもしれませんが、これにはもちろん、最後に与えたタイムスタンプが使用されます。

個人的には、ハックを削除するのが最善の選択肢だと思います。(まあ、タイムスタンプを に設定してタイムスタンプを完全に非表示にすることでおそらく回避できると思います0が、並べ替え順序のハックは問題を引き起こしているようです。)

于 2012-07-04T05:58:24.597 に答える