বিজ্ঞপ্তি পুরানো উদ্দীপনা অতিরিক্ত পাস করে


134

আমি এই কোডের মাধ্যমে একটি ব্রডকাস্টার্সিভারের ভিতরে একটি বিজ্ঞপ্তি তৈরি করছি:

String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
        int icon = R.drawable.ic_stat_notification;
        CharSequence tickerText = "New Notification";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        long[] vibrate = {0,100,200,200,200,200};
        notification.vibrate = vibrate;
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        CharSequence contentTitle = "Title";
        CharSequence contentText = "Text";
        Intent notificationIntent = new Intent(context, NotificationActivity.class);
        notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        int mynotification_id = 1;

        mNotificationManager.notify(mynotification_id, notification);

আমি যখন বিজ্ঞপ্তিটিতে ক্লিক করি তখন এটি বিজ্ঞপ্তি কার্যকলাপটি খোলে এবং ক্রিয়াকলাপের ভিতরে আমি ইন্টেন্ট-বান্ডেল থেকে foo_id পুনরুদ্ধার করতে পারি (উদাহরণস্বরূপ 1)

তবে যদি অন্য কোনও বিজ্ঞপ্তি ট্রিগার হয় এবং আমি এটিতে আবার ক্লিক করি তবে ক্রিয়াকলাপটি এখনও ইনটেন্ট-বান্ডেল থেকে "পুরানো" মান (1) গ্রহণ করে। আমি স্পষ্ট () দিয়ে বান্ডিলটি সাফ করার চেষ্টা করেছি, তবে একই প্রভাবটি পাচ্ছি। আমার মনে হয় আমার কোডে স্টাথ ভুল ..


অনুগ্রহপূর্বক অভিপ্রায়টি থেকে কীভাবে ডেটা পাবেন
ইউজার 49557

এটি পুরানো অতিরিক্ত পাঠাচ্ছে তা বুঝতে, আমার ট্রাইজিং সহজ করে তুলেছে।
উত্সব গুপ্ত

উত্তর:


268

আপনি আপনার মুলতুবি থাকা তীব্রতার জন্য একই অনুরোধ কোডটি প্রেরণ করছেন। এই পরিবর্তন:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

প্রতি:

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);

আপনি যদি একই প্যারামগুলি প্রেরণ করেন তবে উদ্দেশ্যগুলি তৈরি করা হয় না। তারা পুনরায় ব্যবহার করা হয়।


1
সুতরাং UNIQUE_INT_PER_CALL একটি পূর্ণসংখ্যা যা আমাকে সরবরাহ করতে হবে? বা এটি কোনও স্থির পরিবর্তনশীল কোথাও ঘোষণা করা হয়েছে?
ব্রায়ানএম

23
অ্যান্ড্রয়েড gotcha হয় # 147 - তাই একটি Intentআছে যা বিভিন্ন অতিরিক্ত (মাধ্যমে putExtra) একই এবং পুনরায় ব্যবহার করা কারন আমি কিছু মুলতুবি অভিপ্রায় কলে একটি অদ্বিতীয় আইডি প্রদান না বলে মনে করা হয় - অঘোর API
ওয়াল

তুমি কি জানো আমি এতটা গাফিল ছিলাম। শুধু চিন্তা করে এটি কীভাবে একটি ব্লকে 0 থাকতে পারে (আমার ক্ষেত্রে) :(
এক্সিজেণ্ট ০৫

3
এটি আমার পক্ষে অবিশ্বাস্যভাবে কার্যকর ছিল, অন্যের জন্য কেবল একটি টিপ, সম্ভবত আপনি একই পদ্ধতিতে আপনার বিজ্ঞপ্তিটি তৈরি করছেন এবং তাই আপনি কেবলমাত্র নতুন মুলতুবি করার উদ্দেশ্যে আইডিটি সেট করতে পারেন যা আপনি যাচ্ছেন ঠিক তেমনই বিজ্ঞপ্তিগুলির অনন্য আইডি ব্যবহার করুন!
জেমস ম্যাকনি 31'17

1
@ ইঙ্ক্রেডিআইএপ, পেন্ডিং ইন্টেন্ট.জেটড্রোডকাস্ট () এর সাথে কি এটি একই? ?
শ্রুতি

139

বিকল্পভাবে, আপনি আপনার পেন্ডিং ইন্টেন্ট তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

দস্তাবেজ থেকে PendingIntent.FLAG_UPDATE_CURRENT:

যদি বর্ণিত পেন্ডিং ইন্টেন্ট ইতিমধ্যে বিদ্যমান থাকে, তবে এটি রাখুন তবে তার অতিরিক্ত ডেটা এই নতুন ইন্টেন্টে রয়েছে তার সাথে প্রতিস্থাপন করুন। এটি কেবলমাত্র অতিরিক্ত অতিরিক্ত পরিবর্তিত হয় এমন অভিপ্রায় তৈরি করে থাকলে এবং আপনার পূর্ববর্তী মুলতুবি ইন্ট্যান্ট প্রাপ্ত কোনও সত্তা এটিকে আপনার নতুন অতিরিক্ত দিয়ে স্পষ্টভাবে না দেওয়া সত্ত্বেও এটি চালু করতে সক্ষম হবে সেদিকে খেয়াল রাখবেন না used


ধন্যবাদ ... এই পতাকাটির জন্য নিখুঁতভাবে কাজ করছে যা "পেন্ডিংআইজন্ট.এফএলএজি_উপিডিজেসিআরইএনএনটি" যোগ করছে :)
নাজিব আহমেদ পুঠোওয়ালা

1
ব্রডকাস্ট রিসিভারে অ্যালার্ম সেট করা থেকে রাষ্ট্র স্থানান্তর করার জন্য মুলতুবি থাকা উদ্দেশ্য ব্যবহার করে আমার পক্ষে কাজ করে।
উইলিয়াম টি। ম্যালার্ড

আমি কেবল ইচ্ছে করছিলাম যে আমি আমার ব্যবহারকারীদের (!) বিজ্ঞপ্তি পাঠানোর আগে এই পতাকাগুলি আসলে কী করেছিল সে সম্পর্কে জানতে পেরে আমি খুশী হয়েছি যে এটি আমার দুর্দশার সমাধান করে ...
জেমস অ্যান্ড্রু

42

আপনি একই আইডি পাস করছেন। এই ধরণের পরিস্থিতিতে সময় থেকে একটি অনন্য আইডি তৈরি করুন:

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);

এবং এটি এই হিসাবে রাখুন:

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);

3
কেন নতুন র্যান্ডম () ব্যবহার করবেন না .পরিবর্তিত ()
এক্সপ্লোর করুন

@hderanga "& 0xfffffff" যুক্ত করে উপরের ইনটকে কী করবে?
এজেডাব্লু 23'18

3
@ এজেডাব্লু System.currentTimeMillis()একটি দীর্ঘ প্রত্যাবর্তন করে, যখন requestIdপ্যারামিটারটি PendingIntent.getActivity()ইনট লাগে। 0xffffffffএকটি বিটমাস্ক হয়। যদিও এর আরও কিছুটা আছে, এর সহজ ব্যাখ্যাটি হ'ল দীর্ঘ & 0xffffffff 'করা দীর্ঘ থেকে সর্বনিম্ন 32-বিট দেয় এবং সর্বোচ্চ 32-বিট বিসর্জন দেয়, আপনাকে মূলত 32-বিট ইনট রেখে দেয়। এটি কেবলমাত্র কোন ইন্টিতে কাস্টিংয়ের চেয়ে ভাল কারণ এটি সাইন বিটটি উপভোগ করবে না (যদি আপনি কোনও দীর্ঘকে একটি ইন্টের চেয়ে বড় আকারের কাস্ট করেন তবে সাইন বিটটি উপচে পড়বে এবং আপনি সম্ভবত নেতিবাচক মানটি দিয়ে শেষ করবেন) )
জর্দান বোন্ডো

8

দীর্ঘ সময়ের জন্য সর্বোত্তম পদ্ধতির সন্ধানকারী যে কোনও ব্যক্তির জন্য, আপনাকে নীচের মতো দেখানো হিসাবে শেষ আর্গুমেন্ট হিসাবে পেন্ডিং ইন্টেন্টটি পাস করতে হবে F FLAG_UPDATE_CURRENT

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

এমনকি আপনাকে একটি নতুন অনন্য আইডি সরবরাহ করার প্রয়োজন নেই।

আপনার প্রথমবারের মতো নয় পরবর্তী বারের জন্য এটি করা দরকার


1
এটি কাজ করে না, আমি এখানে এসেছি কারণ আমি যা করছিলাম তা ঠিক আছে।
ব্রিল প্যাপিন

আপনার প্রথমবারের জন্য নয় পরবর্তী বারের জন্য এটি করা দরকার, এটি কার্যকর হবে।
ভদ্র

0

সমস্ত অনুরোধের জন্য আপনার অনুরোধ কোড 0 নিম্নলিখিত লাইন পরিবর্তন করুন:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

সঙ্গে:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);

1
"সিস্টেম কন্ট্রেন্টটাইমমিলিস ()" এর পরিবর্তে "নতুন র্যান্ডম () .ইসেক্সট ()" ব্যবহার করে কি কোনও সুবিধা আছে?
এজেডাব্লু 23'18

এলোমেলোভাবে ব্যবহার সহজে দুর্ঘটনার পরে একই পূর্ণসংখ্যার মানটি আবার জেনারেট করতে পারে, ফলে পুরানো অভিপ্রায়গুলি ত্রুটিযুক্ত হওয়া খুব শক্ত হয়ে যায়।
স্যাম

@ এজেডব্লিউ আমার ক্ষেত্রে ছিল। আমি ঠিক একই মিলি সেকেন্ডে 2 টি পৃথক বিজ্ঞপ্তি তৈরি করেছি, যার মধ্যে একটির অতিরিক্ত অতিরিক্ত got
শিল্পী

0

শুধু অন্য একটি বিকল্প যুক্ত করতে চেয়েছিলেন

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.