Android에서 여러 알림을 표시하는 방법


103

알림을 하나만 받고 있으며 다른 알림이 오면 이전 알림을 대체하고 여기에 내 코드가 있습니다.

private static void generateNotification(Context context, String message,
        String key) {
    int icon = R.drawable.ic_launcher;
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(icon, message, when);

    String title = context.getString(R.string.app_name);

    Intent notificationIntent = new Intent(context,
            FragmentOpenActivity.class);
    notificationIntent.putExtra(key, key);
    // set intent so it does not start a new activity
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent = PendingIntent.getActivity(context, 0,
            notificationIntent, 0);
    notification.setLatestEventInfo(context, title, message, intent);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    notification.defaults |= Notification.DEFAULT_SOUND;

    // notification.sound = Uri.parse("android.resource://" +
    // context.getPackageName() + "your_sound_file_name.mp3");
    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notificationManager.notify(0, notification);

}

3
공식 문서에 따라, 당신은 당신이 모든 알림을 스택이 하나의 응용 프로그램에서 여러 알림을 표시하지 말아야 .. 좀 유무 : developer.android.com/design/patterns/notifications_k.html
Gowtham 쿠마

답변:


134

당신의 라인을 이것으로 바꾸십시오.

 notificationManager.notify(Unique_Integer_Number, notification);

도움이되기를 바랍니다.


2
Unique_Integer_Number당신의 코드에 무엇이 있고 어떤 코드를 대체
해야하는지

4
고유 한 정수는 절대 반복되지 않는 정수 값을 설정해야 함을 의미합니다. 예 : 0,1,2,3,4,5, .... !!!!
Sanket Shah

2
notificationManager.notify (1, 알림); notificationManager.notify (2, 알림);
Sanket Shah

1
알림이 오면 어떻게 자동으로 증가합니까 ??
Mitesh Shah

21
고유 한 정수 생성 : (int) ((new Date (). getTime () / 1000L) % Integer.MAX_VALUE);
Andrii Kovalchuk

87

간단한 notification_id는 변경 가능해야합니다.

notification_id에 대해 난수를 만드십시오.

    Random random = new Random();
    int m = random.nextInt(9999 - 1000) + 1000;

또는 tieorange에서 말한대로 난수를 생성하는 데이 방법을 사용할 수 있습니다 (반복되지 않음).

    int m = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);

난수를 생성하기 위해 알림 ID에 대한 매개 변수를 추가하려면이 줄을 바꿉니다.

    notificationManager.notify(m, notification);

8
약간 해키하고 동일한 알림 ID로 끝날 가능성이 있지만 정말 빠른 것이 필요한 경우 작동합니다.
Muhammad Abdul-Rahim 2015

1
이것이 맞다면 tieorange의 apporach는 몇 초만에 작동합니다. 따라서 동시에 여러 알림이있는 경우 작동하지 않습니다.
테스트

1
@testing이 맞습니다. 그래서 두 번째 단계, m + = random.nextInt (100) + 1; 이것은 한 걸음 더 나아갈 수 있지만 더 안전합니다. 위의 방법이 경매 / 입찰 앱의 마지막 몇 분 동안 실패하는 것을 보았습니다. 따라서 나는 안전을 위해 다른 라인을 추가했습니다!
user3833732

27

공유 환경 설정 사용이 저에게 효과적이었습니다.

SharedPreferences prefs = getSharedPreferences(Activity.class.getSimpleName(), Context.MODE_PRIVATE);
int notificationNumber = prefs.getInt("notificationNumber", 0);
...

notificationManager.notify(notificationNumber , notification);
SharedPreferences.Editor editor = prefs.edit();
notificationNumber++;
editor.putInt("notificationNumber", notificationNumber);
editor.commit();

5
전송 된 모든 알림을 추적해야하는 경우 매우 현명한 방법입니다. 아마도 여기에서 더 현명한 답변 중 하나 일 것입니다.
Muhammad Abdul-Rahim 2015

12

줄을 이것으로 바꾸십시오.

notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);

이 접근 방식에서는 특정 페이로드 유형의 알림을 제거하는 것이 어렵지 않습니까?
Sethuraman Srinivasan

8

나는 이것이 누군가를 도울 것이라고 생각한다 ..
아래 코드에서 "not_nu"는 임의의 정수이다.

private void sendNotification(String message,String title,JSONObject extras) throws JSONException {
   String id = extras.getString("actionParam");
    Log.e("gcm","id  = "+id);
    Intent intent = new Intent(this, OrderDetailActivty.class);
    intent.putExtra("id", id);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    final int not_nu=generateRandom();
    PendingIntent pendingIntent = PendingIntent.getActivity(this, not_nu /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_cart_red)
            .setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

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

    notificationManager.notify(not_nu /* ID of notification */, notificationBuilder.build());
}
public int generateRandom(){
    Random random = new Random();
    return random.nextInt(9999 - 1000) + 1000;
}

내 알림이 여전히 쌓이지 않습니다. 여기에 표시 한 것 외에 내가해야 할 특정 작업이 있습니까?
Lion789

그 random.nextInt 계산은 무엇입니까 ... 설명 할 수 있습니까 ??? 9999-1000 ???? 그게 뭐야 ...
Radu

@Radu 코드에서 볼 수 있듯이 "notificationManager.notify ("는 첫 번째 매개 변수로 int (알림의 ID)를 사용합니다.이 Int (ID)가 새 알림에 대해 동일하면 이전 알림을 대체하고 새 알림을 표시합니다. 이 Int (ID)가 다르면 새 알림이 별도로 처리되고 스택으로 표시됩니다. 따라서 이전 알림이 유지됩니다.이를 달성하기 위해 임의의 int를 만들고 ID로 할당합니다. "random.nextInt (9999-1000) + 1000; "이 코드를 사용합니다.
Muneef M

@ Lion789 새 알림에 다른 ID를 사용하면 알림이 누적됩니다.
Muneef M

new NotificationCompat.Builder (this); Android Oreo에서 더 이상 사용되지 않습니다. 문서를 확인하고 알림 채널 구현을 사용하세요.
TapanHP

5

다음 uniqueIntNo과 같이 고유 한 정수를 입력하십시오.

mNotificationManager.notify(uniqueIntNo, builder.build());


3

나는 이렇게 내 문제를 해결했다 ...

/**
     * Issues a notification to inform the user that server has sent a message.
     */
    private static void generateNotification(Context context, String message,
            String keys, String msgId, String branchId) {
        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        NotificationCompat.Builder nBuilder;
        Uri alarmSound = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        nBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Smart Share - " + keys)
                .setLights(Color.BLUE, 500, 500).setContentText(message)
                .setAutoCancel(true).setTicker("Notification from smartshare")
                .setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })
                .setSound(alarmSound);
        String consumerid = null;
        Integer position = null;
        Intent resultIntent = null;
        if (consumerid != null) {
            if (msgId != null && !msgId.equalsIgnoreCase("")) {
                if (key != null && key.equalsIgnoreCase("Yo! Matter")) {
                    ViewYoDataBase db_yo = new ViewYoDataBase(context);
                    position = db_yo.getPosition(msgId);
                    if (position != null) {
                        resultIntent = new Intent(context,
                                YoDetailActivity.class);
                        resultIntent.putExtra("id", Integer.parseInt(msgId));
                        resultIntent.putExtra("position", position);
                        resultIntent.putExtra("notRefresh", "notRefresh");
                    } else {
                        resultIntent = new Intent(context,
                                FragmentChangeActivity.class);
                        resultIntent.putExtra(key, key);
                    }
                } else if (key != null && key.equalsIgnoreCase("Message")) {
                    resultIntent = new Intent(context,
                            FragmentChangeActivity.class);
                    resultIntent.putExtra(key, key);
                }.
.
.
.
.
.
            } else {
                resultIntent = new Intent(context, FragmentChangeActivity.class);
                resultIntent.putExtra(key, key);
            }
        } else {
            resultIntent = new Intent(context, MainLoginSignUpActivity.class);
        }
        PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
                notify_no, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        if (notify_no < 9) {
            notify_no = notify_no + 1;
        } else {
            notify_no = 0;
        }
        nBuilder.setContentIntent(resultPendingIntent);
        NotificationManager nNotifyMgr = (NotificationManager) context
                .getSystemService(context.NOTIFICATION_SERVICE);
        nNotifyMgr.notify(notify_no + 2, nBuilder.build());
    }

3

이를 수행하는 또 다른 방법은 현재 날짜를 길게 변환하여 마지막 4 자리를 취하는 것입니다. 번호가 고유 할 가능성이 높습니다.

    long time = new Date().getTime();
    String tmpStr = String.valueOf(time);
    String last4Str = tmpStr.substring(tmpStr.length() -5);
    int notificationId = Integer.valueOf(last4Str);

날짜 시간 자체가 아닌 마지막 4 자리 만 사용하는 이유는 무엇입니까?
Muhammad Abdul-Rahim 2015

4
다음은 좀 더 짧은 코드입니다.int notificationId = System.currentTimeMillis()%10000;
bvk256

왜 4 자리 만?
Pavel Biryukov 2016

2

한 줄을 notificationManager.notify(0, notification);에서 notificationManager.notify((int) System.currentTimeMillis(), notification);... 로 변경하면 됩니다 .

새 알림이 표시 될 때마다 알림 ID가 변경됩니다.


1
notificationManager.notify(0, notification);

0 대신이 코드를 넣으십시오.

new Random().nextInt() 

아래처럼 나를 위해 작동합니다.

notificationManager.notify(new Random().nextInt(), notification);

1
리뷰에서 : 안녕하세요, 소스 코드만으로 대답하지 마십시오. 솔루션 작동 방식에 대한 멋진 설명을 제공하십시오. 참조 : 좋은 답변을 어떻게 작성합니까? . 감사합니다
sɐunıɔ ןɐ qɐp

0

문제는 notificationId. 배열 인덱스로 생각하십시오. 알림을 업데이트 할 때마다 notificationId가치를 저장하는 장소입니다. int 값 (이 경우에는 notificationId)을 증가시키지 않기 때문에 항상 이전 값을 대체합니다. 내가 생각하기에 가장 좋은 해결책은 알림을 업데이트 한 직후에 증가시키는 것입니다. 당신이 지속적으로 유지하려는 경우에, 당신은 당신의 가치 저장할 수 notificationId있는을 sharedPreferences. 돌아올 때마다 마지막 정수 값 (에 notificationId저장 됨 sharedPreferences)을 잡고 사용할 수 있습니다.


0

다음은 고유 알림 ID 전달 코드입니다.

//"CommonUtilities.getValudeFromOreference" is the method created by me to get value from savedPreferences.
String notificationId = CommonUtilities.getValueFromPreference(context, Global.NOTIFICATION_ID, "0");
int notificationIdinInt = Integer.parseInt(notificationId);

notificationManager.notify(notificationIdinInt, notification);

// will increment notification id for uniqueness
notificationIdinInt = notificationIdinInt + 1;
CommonUtilities.saveValueToPreference(context, Global.NOTIFICATION_ID, notificationIdinInt + "");
//Above "CommonUtilities.saveValueToPreference" is the method created by me to save new value in savePreferences.

재설정 notificationId에서 savedPreferences이 미래에 어떤 문제를 만들지 않습니다 그래서 내가 1000에서 해냈어 한 것처럼 특정 범위에서. 더 자세한 정보 나 질문이 필요하면 알려주세요. :)


안녕하세요 당신은 PLS를 도울 수 있다면 저장하고 내 경우에는 각각의 고유 한 ID를 얻을 수있는 문제가 .. 우리가 여러 알림 필요 고유 ID를 생성하지만 이후 우리는 또한 특정 통지를 취소해야 생성 알고 아니라 전체 코드를 게시 할 수 있습니다
Jayman 야니

0

코드에서 다음 방법을 사용하십시오.

메서드 호출 :-

notificationManager.notify(getCurrentNotificationId(getApplicationContext()), notification);

방법:-

  *Returns a unique notification id.
         */

        public static int getCurrentNotificationId(Context iContext){

            NOTIFICATION_ID_UPPER_LIMIT = 30000; // Arbitrary number.

            NOTIFICATION_ID_LOWER_LIMIT = 0;
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(iContext);
        int previousTokenId= sharedPreferences.getInt("currentNotificationTokenId", 0);

        int currentTokenId= previousTokenId+1;

        SharedPreferences.Editor editor= sharedPreferences.edit();

        if(currentTokenId<NOTIFICATION_ID_UPPER_LIMIT) {

            editor.putInt("currentNotificationTokenId", currentTokenId); // }
        }else{
            //If reaches the limit reset to lower limit..
            editor.putInt("currentNotificationTokenId", NOTIFICATION_ID_LOWER_LIMIT);
        }

        editor.commit();

        return currentTokenId;
    }

-1

간단한 카운터로 문제를 해결할 수 있습니다.

private Integer notificationId = 0;

private Integer incrementNotificationId() {
   return notificationId++;
}

NotificationManager.notify(incrementNotificationId, notification);

-1
declare class member
static int i = 0;

mNotificationManager.notify(++i, mBuilder.build());

-1
val notifyIdLong = ((Date().time / 1000L) % Integer.MAX_VALUE)
var notifyIdInteger = notifyIdLong.toInt()
if (notifyIdInteger < 0) notifyIdInteger = -1  * notifyIdInteger // if it's -ve change to positive
notificationManager.notify(notifyIdInteger, mBuilder.build())
log.d(TAG,"notifyId = $notifyIdInteger")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.