Genereer int unieke id als android meldings-id

Als ik meerdere pushmeldingen verstuur, wil ik dat ze allemaal worden weergegeven in de meldingsbalk, gerangschikt op de verzonden tijd. Ik weet dat ik een unieke melding moet gebruiken – ik heb geprobeerd een willekeurig nummer te genereren, maar dat loste mijn probleem niet op, omdat ik ze nodig heb om te bestellen. Ik heb geprobeerd AtomicIntte gebruiken en heb nog steeds niet het gewenste resultaat.

package com.mypackage.lebadagency;
import java.util.concurrent.atomic.AtomicInteger;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.RemoteViews;
import com.google.android.gms.gcm.GoogleCloudMessaging;
public class GCMNotificationIntentService extends IntentService {
  private AtomicInteger c = new AtomicInteger(0);
  public int NOTIFICATION_ID = c.incrementAndGet(); 
  private NotificationManager mNotificationManager;
  NotificationCompat.Builder builder;
  public GCMNotificationIntentService() {
    super("GcmIntentService");
  }
  public static final String TAG = "GCMNotificationIntentService";
  @Override
  protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
    String messageType = gcm.getMessageType(intent);
    if (!extras.isEmpty()) {
      if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
          .equals(messageType)) {
        sendNotification("Send error: " + extras.toString());
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
          .equals(messageType)) {
        sendNotification("Deleted messages on server: "
            + extras.toString());
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
          .equals(messageType)) {
        for (int i = 0; i < 3; i++) {
          Log.i(TAG,
              "Working... " + (i + 1) + "/5 @ "
                  + SystemClock.elapsedRealtime());
          try {
            Thread.sleep(5000);
          } catch (InterruptedException e) {
          }
        }
        Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
        sendNotification(""
            + extras.get(Config.MESSAGE_KEY));
        Log.i(TAG, "Received: " + extras.toString());
      }
    }
    GcmBroadcastReceiver.completeWakefulIntent(intent);
  }
  private void sendNotification(String msg) {
    Log.d(TAG, "Preparing to send notification...: " + msg);
    mNotificationManager = (NotificationManager) this
        .getSystemService(Context.NOTIFICATION_SERVICE);
    //here start
    Intent gcmintent = new Intent(this, AppGcmStation.class);
    gcmintent.putExtra("ntitle", msg);
    gcmintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    int requestID = (int) System.currentTimeMillis();
    //here end
    PendingIntent contentIntent = PendingIntent.getActivity(this, requestID,
        gcmintent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
        this).setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle("my title")
        .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
        .setContentText(msg);
    mBuilder.setAutoCancel(true);
    mBuilder.setTicker(msg);
    mBuilder.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }); 
    mBuilder.setLights(Color.RED, 3000, 3000);
    mBuilder.setContentIntent(contentIntent);
    mBuilder.setDefaults(Notification.DEFAULT_SOUND);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    Log.d(TAG, "Notification sent successfully.");
  }
}

Ik heb de BESTE en eenvoudigste manier nodig om een ​​int-ID te genereren die incrementeel is om deze toe te wijzen als de meldings-ID.


Antwoord 1, autoriteit 100%

Je gebruikt dezelfde meldings-ID (de waarde is altijd 1) voor al je meldingen. U moet waarschijnlijk de notificatie-ID scheiden in een aparte singleton-klasse:

public class NotificationID {
    private final static AtomicInteger c = new AtomicInteger(0);
    public static int getID() {
        return c.incrementAndGet();
    }
}

Gebruik vervolgens NotificationID.getID()in plaats van NOTIFICATION_IDin uw code.

EDIT: Zoals @racs in een opmerking aangeeft, is de bovenstaande aanpak niet voldoende om correct gedrag te garanderen als uw app-proces toevallig wordt stopgezet. De initiële waarde van de AtomicIntegermoet minimaal worden geïnitialiseerd vanuit de opgeslagen status van een activiteit in plaats van te beginnen bij 0. Als de meldings-ID’s uniek moeten zijn bij het opnieuw opstarten van de app (opnieuw, waar de app proces kan worden afgebroken), dan moet de laatste waarde ergens worden opgeslagen (waarschijnlijk in gedeelde voorkeuren) na elke verhoging en hersteld wanneer de app start.


Antwoord 2, autoriteit 35%

Voor iedereen die nog rondkijkt. Ik heb een tijdstempel gegenereerd en deze als id gebruikt.

import java.util.Date;
import java.util.Locale;
public int createID(){
   Date now = new Date();
   int id = Integer.parseInt(new SimpleDateFormat("ddHHmmss",  Locale.US).format(now));
   return id;
}

Gebruik het zo

int id = createID();
mNotifyManager.notify(id, mBuilder.build());

Antwoord 3, autoriteit 18%

Misschien niet de beste, maar zeker de eenvoudigsteis om de huidige tijd te gebruiken.

int oneTimeID = (int) SystemClock.uptimeMillis();
mNotificationManager.notify(oneTimeID, mBuilder.build());

Het goede: dit is de gemakkelijkste manier om toenemende ID’s te krijgen.

Het slechte: de tijd is longen we verkorten het tot de helft daarvan. Dit betekent dat de teller elke 2’147’483’647/1000(ms->s)/60(s->m)/60(m->h)/24(h-> d) =~25 dagen.

SystemClock.uptimeMillis()heeft 2 voordelen ten opzichte van currentTimeMillis:

  1. verlaagt alle milliseconden die worden besteed aan diepe slaap, wat het aantal omhullingen vermindert.
  2. begint bij 0 wanneer de telefoon opnieuw wordt opgestart.

Antwoord 4, autoriteit 17%

private static final String PREFERENCE_LAST_NOTIF_ID = "PREFERENCE_LAST_NOTIF_ID";
private static int getNextNotifId(Context context) {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    int id = sharedPreferences.getInt(PREFERENCE_LAST_NOTIF_ID, 0) + 1;
    if (id == Integer.MAX_VALUE) { id = 0; } // isn't this over kill ??? hahaha!!  ^_^
    sharedPreferences.edit().putInt(PREFERENCE_LAST_NOTIF_ID, id).apply();
    return id;
}

Antwoord 5, autoriteit 5%

U kunt een teller gebruiken en deze opslaan in de SharedPreferences.
Dit is een voorbeeld in kotlin:

fun getNextNotificationId(context: Context) : Int {
    val sp = context.getSharedPreferences("your_shared_preferences_key", MODE_PRIVATE)
    val id = sp.getInt("notification_id_key", 0)
    sp.edit().putInt("notification_id_key", (id + 1) % Int.MAX_VALUE).apply()
    return id
}

het krijgt de id en slaat de volgende id op (verhoogd met 1), ook als de id de maximale waarde voor een geheel getal bereikt, wordt het teruggezet naar 0.

Je kunt het als volgt gebruiken:

val notificationId = getNextNotificationId(applicationContext)
notificationManager.notify(notificationId, yourNotification)

Antwoord 6, autoriteit 5%

Je moet een unieke tag (String) / id (integer)

instellen

Bekijk deze methode in officiële documentatie

Ik raad aan om een ​​tijdstempel (SystemClock.uptimeMillis() / System.currentTimeMillis()) als tag te gebruiken tijdens de melding.

notificationManager.notify(String.valueOf(System.currentTimeMillis()), 0, notification);

Antwoord 7

Als iemand dit leest, is er een methode hier. het is beter om ook een tag-naam op te geven met id, zodat het helpt als je het onderdeel bundelt als een module om te delen met ontwikkelaars.

OPMERKING: Het probleem met het toewijzen van een willekeurig geheel getal-ID is dat, als een module of bibliotheek hetzelfde ID gebruikt, je melding wordt vervangen door nieuwe meldingsgegevens.

// here createID method means any generic method of creating an integer id
int id = createID();
// it will uniqly identify your module with uniq tag name & update if present.
mNotifyManager.notify("com.packagename.app", id, mBuilder.build());

Other episodes