অ্যান্ড্রয়েডে কীভাবে একাধিক বিজ্ঞপ্তি প্রদর্শন করবেন


104

আমি কেবল একটি বিজ্ঞপ্তি পাচ্ছি এবং যদি অন্য কোনও বিজ্ঞপ্তি আসে তবে এটি পূর্ববর্তীটি প্রতিস্থাপন করে এবং এখানে আমার কোড

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);

}

4
অফিসিয়াল ডকুমেন্ট অনুসারে, আপনাকে সমস্ত অ্যাপ্লিকেশন বিজ্ঞপ্তি রাখতে হবে এমন একটি অ্যাপ থেকে একাধিক বিজ্ঞপ্তি প্রদর্শন করা উচিত নয় .. একবার দেখুন: বিকাশকারী.অ্যান্ড্রয়েড
ডিজাইন

উত্তর:


135

এই সঙ্গে আপনার লাইন প্রতিস্থাপন

 notificationManager.notify(Unique_Integer_Number, notification);

আশা করি এটা তোমাকে সাহায্য করবে.


4
কি Unique_Integer_Numberআপনার কোডে .. এবং যা কোড এটি প্রতিস্থাপন করা উচিত
Kartheek গুলি

4
অনন্য পূর্ণসংখ্যার অর্থ হল আপনাকে পূর্ণসংখ্যা মান সেট করতে হবে যা কখনই পুনরাবৃত্তি হবে না। উদাহরণ 0,1,2,3,4,5, .... !!!!
সংকেত শাহ

4
নোটিফিকেশনম্যানেজ.নোটাইফাই (1, বিজ্ঞপ্তি); নোটিফিকেশনম্যানেজ.নোটাইফাই (২, বিজ্ঞপ্তি);
সংকেত শাহ

4
বিজ্ঞপ্তি আসার সাথে সাথে কীভাবে স্বয়ংক্রিয়ভাবে ইনক্রিমেন্ট হবে ??
মিতেশ শাহ

21
অনন্য পূর্ণসংখ্যা উত্পন্ন: (ইনট) ((নতুন তারিখ ()। গেটটাইম () / 1000L)% পূর্ণসংখ্যা। ম্যাক্স_ভ্যালু);
আন্দ্রেই কোভালচুক

89

সাধারণ নোটিফিকেশন_আইডিটি পরিবর্তনযোগ্য হতে হবে।

নোটিফিকেশন_আইডির জন্য কেবল এলোমেলো সংখ্যা তৈরি করুন।

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

অথবা টাইওরেঞ্জ অনুসারে র্যান্ডম সংখ্যা তৈরি করার জন্য আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন (এটি কখনই পুনরাবৃত্তি হবে না):

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

এবং এলোমেলো নম্বর উত্পন্ন হিসাবে নোটিফিকেশন আইডির পরামিতি যুক্ত করার জন্য এই লাইনটি প্রতিস্থাপন করুন

    notificationManager.notify(m, notification);

9
কিছুটা হ্যাকি এবং সম্ভবত একই বিজ্ঞপ্তি আইডি দিয়ে শেষ হওয়ার সম্ভাবনা রয়েছে তবে আপনার যদি খুব দ্রুত কিছু দরকার হয় তবে এটি কাজ করে।
মুহাম্মদ আবদুল-রহিম

4
আমি যদি এই অধিকারটি দেখতে পাই তবে টাইরোঞ্জের অ্যাপোরাসটি কেবল কয়েক সেকেন্ডের সাথেই কাজ করে। সুতরাং আপনার যদি একই দ্বিতীয়টিতে একাধিক বিজ্ঞপ্তি থাকে তবে এটি কার্যকর হবে না।
পরীক্ষার

4
@ টেস্টিং ঠিক আছে। কেন আমার ২ য় পদক্ষেপ রয়েছে, এম + = এলোমেলো.আক্ষেত্র (100) + 1; এটি এক ধাপ অতিরিক্ত হতে পারে তবে এর পথটি নিরাপদ। আমি নিলাম / বিডিং অ্যাপ্লিকেশনটির শেষ মিনিটগুলিতে উপরের পদ্ধতিটি ব্যর্থ দেখেছি। সুতরাং আমি সুরক্ষার জন্য অন্য লাইন যুক্ত!
ব্যবহারকারী 3833732

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
আপনার প্রেরিত প্রতিটি বিজ্ঞপ্তিও যদি ট্র্যাক করে রাখার প্রয়োজন হয় তবে এটি করার এটি মোটামুটি স্মার্ট উপায়। সম্ভবত এখানে স্মার্ট উত্তরগুলির মধ্যে একটি।
মুহাম্মদ আবদুল-রহিম

12

এটি দিয়ে আপনার লাইনটি প্রতিস্থাপন করুন।

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

কোনও নির্দিষ্ট পেডলোড প্রকারের বিজ্ঞপ্তিগুলি সরানো কি এই পদ্ধতির সাথে জটিল হয়ে ওঠে না?
শেঠুরামান শ্রিনিবাসন

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;
}

আমার বিজ্ঞপ্তিগুলি এখনও স্ট্যাক করছে না, আপনি এখানে যা দেখান তা ছাড়া আমার করার মতো কোনও নির্দিষ্ট জিনিস আছে কি?
লায়ন 789

সেখানে এলোমেলো.একটি হিসাব কী করছে ... আপনি কি ব্যাখ্যা করতে পারবেন ??? 9999-1000 ???? এটি কী ...
রাদু

@ রাদু যেমন আপনি কোডটিতে দেখতে পাচ্ছেন "নোটিফিকেশন ম্যানেজ.নোটাইফাই (" প্রজ্ঞাপনের জন্য আইডি নেয়) প্রথম পরামিতি হিসাবে। যদি এই ইন্টার (আইডি) আলাদা হয় তবে নতুন বিজ্ঞপ্তিটি আলাদাভাবে বিবেচনা করা হবে এবং স্ট্যাক হিসাবে প্রদর্শিত হবে so সুতরাং পুরানো বিজ্ঞপ্তিটি রয়ে যায় this + 1000; "এই কোডটি ব্যবহার করে
মুনিফ এম

@ লায়ন 9৮৯ আপনাকে নতুন বিজ্ঞপ্তিগুলির জন্য আলাদা আলাদা আইডি ব্যবহার করতে হবে তবে এটির বিজ্ঞপ্তিগুলি স্ট্যাক করা উচিত।
মুনিফ এম

নতুন বিজ্ঞপ্তি কমপ্যাট.বিল্ডার (এটি); অ্যান্ড্রয়েড ওরিওতে হ্রাস করা হয়েছে, দয়া করে দস্তাবেজগুলি পরীক্ষা করুন এবং বিজ্ঞপ্তি চ্যানেল প্রয়োগ ব্যবহার করুন use
তপন এইচপি

5

uniqueIntNoএই মত অনন্য পূর্ণসংখ্যার নম্বর রাখার জায়গায় :

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

4

আপনাকে প্রতিটি বিজ্ঞপ্তির সাথে একটি অনন্য আইডি যুক্ত করতে হবে যাতে তারা একে অপরের সাথে একত্রিত না হয়। আপনি আপনার রেফারেন্সের জন্য এই লিঙ্কটি ব্যবহার করতে পারেন:

https://github.com/sanathe06/AndroidGuide/tree/master/ExampleCompatNotificationsBuilder


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
এখানে কিছুটা খাটো কোড দেওয়া হচ্ছে:int notificationId = System.currentTimeMillis()%10000;
bvk256

কেন শুধুমাত্র 4 ডিজিট?
পাভেল বিরিয়ুকভ

2

আপনাকে কেবল আপনার এক-লাইনটি থেকে এতে পরিবর্তন notificationManager.notify(0, notification);করতে হবে notificationManager.notify((int) System.currentTimeMillis(), notification);...

এটি যখনই নতুন বিজ্ঞপ্তি প্রদর্শিত হবে তখন এটি বিজ্ঞপ্তির আইডি পরিবর্তন করবে


2
notificationManager.notify(0, notification);

0 এর পরিবর্তে এই কোডটি রাখুন

new Random().nextInt() 

নীচের মত এটি আমার জন্য কাজ করে

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

4
পর্যালোচনা থেকে: হাই, দয়া করে কেবল উত্স কোড দিয়ে উত্তর দিবেন না। আপনার সমাধান কীভাবে কাজ করে সে সম্পর্কে একটি দুর্দান্ত বর্ণনা দেওয়ার চেষ্টা করুন। দেখুন: আমি কীভাবে ভাল উত্তর লিখব? । ধন্যবাদ
সানুন ןɐ কিউপি

0

সমস্যা আপনার সাথে notificationId। এটি অ্যারে সূচক হিসাবে ভাবেন। প্রতিবার আপনি আপনার বিজ্ঞপ্তি আপডেট করবেন, এটি notificationIdসেই জায়গা যা স্টোরের মূল্য গ্রহণ করে। যেহেতু আপনি আপনার ইনট মান বৃদ্ধি করছেন না (এই ক্ষেত্রে, আপনার notificationId), এটি সর্বদা আগেরটির প্রতিস্থাপন করে। আমার ধারণা সর্বোত্তম সমাধান হ'ল আপনি কোনও বিজ্ঞপ্তি আপডেট করার ঠিক পরে এটিকে বাড়িয়ে তোলা। এবং যদি আপনি এটি ক্রমাগত রাখতে চান, তাহলে আপনি আপনার মান সংরক্ষণ করতে পারেন notificationIdমধ্যে sharedPreferences। আপনি যখনই ফিরে আসবেন, আপনি কেবল সর্বশেষ পূর্ণসংখ্যার মানটি ( notificationIdসঞ্চিত sharedPreferences) দখল করতে পারেন এবং এটি ব্যবহার করতে পারেন।


0

নীচে পাস অনন্য নোটিফিকেশন আইডির কোড রয়েছে:

//"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. এটা করেছিলেন সুতরাং এটি ভবিষ্যতে কোনো সমস্যা তৈরী করবে না। আপনার আরও বিশদ তথ্য বা কোনও প্রশ্নের প্রয়োজন হলে আমাকে জানান। :)


হ্যালো আপনি কি পুরো কোডটি পোস্ট করতে পারেন আমরা জানি একাধিক বিজ্ঞপ্তি জেনারেল করার জন্য অনন্য আইডি প্রয়োজন তবে জেনারেট করার পরে আমাদের সেই নির্দিষ্ট বিজ্ঞপ্তিটিও বাতিল করতে হবে .. আপনি যদি
পিএলসকে

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.