0
@Override
public void onMessageReceived(String from, Bundle data) {
    dbhelper = DatabaseHelper.getInstance(this);
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);

    if (from.startsWith("/topics/teta")) {
        if (message != null) {

            final Alert alert = new Gson().fromJson(message, Alert.class);

            Log.d(TAG, alert.getDesc() + " " + alert.getLink() + " " + alert.getTimeStamp() + " " + alert.getTitle());

            dbhelper.addAlertsToDB(alert, DatabaseHelper.NEW);

            LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(AppPreferences.NEW_ALERT_RECIEVED));

            boolean notifPref = sharedPreferences.getBoolean(AppPreferences.PREFERENCE_RECIEVE_NOTIFICATION, false);
            if (notifPref) {
                sendNotification("You Have A New Job Notification.", alert.getTitle());
                Log.d(TAG, "Notifications turned " + notifPref + " ...User will be notified");
            } else {
                Log.d(TAG, "Notifications turned " + notifPref);
            }
        }
    }
}

private void sendNotification(String message, String title) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
            .setSmallIcon(R.drawable.ic_notifications_active_white_24dp)
            .setContentTitle(getResources().getString(R.string.app_name))
            .setContentText(message)
            .setSubText(title)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);

    NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(notificationBuilder);

    //Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    String strRingtonePreference = sharedPreferences.getString(AppPreferences.PREFERENCE_SOUND, "");
    Uri defaultSoundUri = Uri.parse(strRingtonePreference);
    notificationBuilder.setSound(defaultSoundUri);

    boolean vibrate = sharedPreferences.getBoolean(AppPreferences.PREFERENCE_VIBRATE, false);
    if (vibrate) {
        long[] pattern = {0, 200};
        notificationBuilder.setVibrate(pattern);
    }

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

したがって、私の問題は、ユーザーがステータスバーで古い通知をまだチェックしていない場合、ユーザーに迷惑をかけずに新しいメッセージについて通知することです。通知 ID と通知ビルダーを保持できません。

私のサーバーは、一度に 5 ~ 10 個のアラートの連続ストリームで新しいアラートを送信しますが、各アイテムは別々に非同期で到着することが多く、1 秒の違いがあります。

そのため、ユーザーは古いものを閉じたり表示したりしていないため、ユーザーにとって非常に迷惑になります。

Gmail のように、ユーザーに通知せずに、ステータス バーの前回の通知の内容を更新したい。

4

1 に答える 1

3

まず、各通知に ID を追加します。たとえば、メッセージのタイトルのハッシュコードにすることができます。

次に、通知を投稿するたびに、「getActiveNotifications()」を使用してアクティブな通知の配列を取得します。同じ ID を持つものが見つかった場合は、既存の ID を渡して更新します。

また、サウンド、バイブレーション、ティッカーを再度再生したくない場合は、「setOnlyAlertOnce(true)」オプションを使用します。

于 2016-07-17T11:52:05.090 に答える