পেন্ডিং ইন্টেন্টের জন্য "অনুরোধকোড" কী ব্যবহার করা হয়?


110

পটভূমি:

আমি অ্যালার্ম ম্যানেজারের মাধ্যমে অ্যালার্মের জন্য পেন্ডিং ইন্টেন্ট ব্যবহার করছি।

সমস্যাটি:

প্রথমে আমি ভেবেছিলাম যে পূর্ববর্তীগুলিকে বাতিল করতে হলে অবশ্যই আমাকে অবশ্যই অনুরোধ কোডটি সরবরাহ করতে হবে যা আমি অ্যালার্ম শুরু করার আগে ব্যবহার করেছি।

তবে তারপরে আমি খুঁজে পেয়েছি যে আমি ভুল ছিলাম, যেমন বাতিলকরণ এপিআই বলে:

মিলে যাওয়া ইন্টেন্টের সাথে কোনও অ্যালার্ম সরিয়ে ফেলুন। যে কোনও ধরণের অ্যালার্ম, যার ইন্টেন্টের সাথে এটি মেলে (ফিল্টারকুইয়ালস (ইন্টেন্ট) দ্বারা সংজ্ঞায়িত) বাতিল করা হবে।

" ফিল্টারএকুয়ালস " দেখে ডকুমেন্টেশনটি বলে:

অভিপ্রায় রেজোলিউশন (ফিল্টারিং) এর উদ্দেশ্যে যদি দুটি উদ্দেশ্য একই হয় তবে নির্ধারণ করুন। এটি হ'ল যদি তাদের ক্রিয়া, ডেটা, ধরণ, শ্রেণি এবং বিভাগগুলি একই হয়। এটি অভিপ্রায়গুলিতে অন্তর্ভুক্ত কোনও অতিরিক্ত ডেটার তুলনা করে না।

সুতরাং "অনুরোধকোড" কীসের জন্য তা আমি পাই না ...

প্রশ্নটি:

"অনুরোধকোড" কিসের জন্য ব্যবহৃত হয়?

যদি আমি একই "অনুরোধকোড" দিয়ে একাধিক অ্যালার্ম তৈরি করি তবে কী হবে? তারা কি একে অপরকে ওভাররাইড করে?


আপনি যদি একই অনুরোধ কোডটি ব্যবহার করেন তবে আপনি একই পেন্ডিং ইন্টেন্ট পাবেন
pskink

3
পেন্ডিং ইন্টেন্ট.জেটড্রোডকাস্ট () এর জন্য, অনুরোধকোড দৃশ্যত অ্যান্ড্রয়েড দ্বারা উপেক্ষা করা হবে। 22 এপ্রিল হিসাবে, এটি আপনার মুলতুবি থাকা উদ্দেশ্যটিকে অনন্য করে তুলবে না। GetActivity () এবং সম্ভবত getS सर्विस () এর জন্য করে তবে আমি পরীক্ষা করি নি)। stackoverflow.com/a/33203752/2301224
বেকার

@ বাকের এটি কি বাগ হিসাবে বিবেচনা করা হয় না? যদি এটি কোনও বাগ হয় তবে আপনার এটি এখানে লিখতে হবে: কোড. google.com/p/android/issues/list
অ্যান্ড্রয়েড বিকাশকারী

1
ঠিক আছে, ডকুমেন্টেশনগুলি আবশ্যক কোডের ইউসাগাকে নির্দিষ্ট করে: If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
এয়ার

@ এয়ার রাইট, তাই রিকোস্টকোড ব্যবহারে কী লাভ? এটি কোথায় ব্যবহার করা যাবে?
অ্যান্ড্রয়েড বিকাশকারী

উত্তর:


77
  1. requestCode একই পেন্ডিং ইন্ট্যান্ট উদাহরণটি পরে পুনরুদ্ধার করতে ব্যবহৃত হয় (বাতিলকরণ ইত্যাদি)
  2. হ্যাঁ, আমার ধারণা অ্যালার্মগুলি একে অপরকে ওভাররাইড করে। আমি অনুরোধ কোডগুলি অনন্য রাখব।

5
অ্যালার্মগুলির উদ্দেশ্যগুলি খুব আলাদা (এমন কি পরিষেবা A এর জন্য এবং একটি পরিষেবা বি এর জন্য, উদাহরণস্বরূপ) ক্ষেত্রে কী অনুরোধ কোডটি অনন্য প্রয়োজন হিসাবে সেট করা হচ্ছে? এছাড়াও, কীভাবে ডকুমেন্টেশনগুলি এ সম্পর্কে কিছু না বলে? অনুরোধকোড যাই হোক না কেন কোনও নির্দিষ্ট ধরণের সমস্ত অ্যালার্ম সরিয়ে ফেলা সম্ভব?
অ্যান্ড্রয়েড বিকাশকারী

1
না, এটি বিভিন্ন উদ্দেশ্যে প্রয়োজন হয় না। এবং ডকুমেন্টেশন কেন এ সম্পর্কে কিছু বলে না আমি জানি না, তবে পুনরাবৃত্তি অ্যালার্ম সেট করার সময় এবং একই অভিপ্রায়টি ব্যবহার করার সময় আমি এটি শিখেছি।
মিনহাজ আরফিন

2
আমি পেন্ডিং ইন্টেন্টের কথা বলছিলাম। startActivityForResult একটি সাধারণ উদ্দেশ্য ব্যবহার করে।
অ্যান্ড্রয়েড বিকাশকারী

2
"প্রক্সি ক্রিয়াকলাপটি ব্যবহার করে পেন্ডিং ইন্টেন্ট সহ স্টার্টএটিভিটি ফর রিসাল্ট" এর উদ্দেশ্য কী? আপনি কি একটি উদাহরণ দিতে পারেন?
অ্যান্ড্রয়েড বিকাশকারী

3
আমি রাজী; পেন্ডিং ইন্টেন্ট এবং অ্যালার্ম ম্যানেজারের ডকুমেন্টেশনগুলি মোটামুটি শ - টি - এটিকে আরও খারাপ করে তুলেছে যে প্রোগ্রামের মাধ্যমে অ্যালার্মগুলি তালিকাভুক্ত করা সম্ভব নয়।
কেউ কোথাও কোথাও

33

আমি কেবল @ মিনহাজ আরফিন উত্তরে যুক্ত করতে চাই

1- অনুরোধকোড একই পেন্ডিং উদ্দেশ্যটি পরে ব্যবহার করতে ব্যবহৃত হয় (ইত্যাদি বাতিল করার জন্য)

২- হ্যাঁ, আপনি যতক্ষণ আপনার মুলতুবি ইন্টেন্টে নির্দিষ্ট করেছেন সেই একইভাবে আপনার নিজের অভিপ্রায়টিকে একই প্রাপক নির্দিষ্ট করে দিলে তারা ওভাররাইড করবে

উদাহরণ:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

উপরের উদাহরণ থেকে তারা একে অপরকে ওভাররাইড করবে না কারণ রিসিভারটি আলাদা (অ্যালার্মরিসিভারফার্স্ট এবং অ্যালার্মরিসিভারসেকেন্ড)

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

উপরের উদাহরণ থেকে, তারা একে অপরকে ওভাররাইড করবে , কারণ রিসিভারটি একই (অ্যালার্মরিসিভারসেকেন্ড)


ইন্টেন্ট স্টার্টইন্টেন্ট 4 = নতুন ইনটেন্ট (প্রসঙ্গ, অ্যালার্মরিসিভারসেকেন্ড.ক্লাস); উদ্বৃত্তপরিবর্তিতIInt44 = प्रलंबितIntent.getService (প্রসঙ্গ, 0, startIntent4, 0); ঠিক আছে তাহলে? মানে, এটি ওভাররাইড হবে না কারণ এটি getBroadcast () এর পরিবর্তে getService () কল করছে?
জেনিক্স

অন্য একটি প্রশ্ন জিজ্ঞাসা করার জন্য দুঃখিত তবে কারণ স্ট্যাকওভারফ্লো আমাকে একটি কোড কোড লাইন ছাড়া প্রশ্ন লেখার অনুমতি দেয় না .. গেটব্রোডকাস্টের মতো পেন্ডিং ইন্টেন্টের পদ্ধতিগুলির শেষ যুক্তিটি ওভাররাইডের সাথে কিছু করার নেই? আমি উপরে আপনার উদাহরণের কোডের মতো 0 রেখেছিলাম কিন্তু আমি আরও অনেক লোক 0 এর পরিবর্তে কিছু নির্দিষ্ট বিকল্প মান রেখে
দিচ্ছিলাম

1
@ জেনিক্স ইউউ ব্যবহারের AlarmReceiverSecond.classউদ্দেশ্যে এবং তারপরে ব্যবহার করুন PendingIntent.getService()। এটি কার্যকর হবে না, যেহেতু AlarmReceiverSecond.classএটি একটি BroadcastReceiver, একটি নয়Service
হেন্দ্রডাব্লুডি

1
পতাকা সম্পর্কে, এটি এমন বৈশিষ্ট্য যা আপনি সেট করতে পারেন, এটি আপনার প্রদত্ত পতাকা অনুসারে আপনার মুলতুবি ইন্টেন্টের আচরণ করবে। 0 এর অর্থ সমস্ত পতাকা বন্ধ রয়েছে
হেন্দ্রডাব্লুডি

আহ আমি বোকা হা হা কি ভাবছিলাম পৃথিবীতে .. আমি পেন্ডিং ইন্টেন্ট সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম এবং আপনার উত্তরটি সত্যিই সহায়ক ছিল। এবং আমি কেবল এটি আরও পরিষ্কার করে তুলতে চেয়েছিলাম তবে এখন বুঝতে পেরেছি আমার প্রশ্নটি প্রথমে কোনও অর্থ দেয় না। ধন্যবাদ!
জেনিক্স

2

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

 PendingIntent pendingIntent =
                            PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
                                    PendingIntent.FLAG_ONE_SHOT);

আমার মামলার জন্য কোডটি আরও পরীক্ষা করার প্রয়োজন ছিল না, আপনি বলতে পারেন কোন ক্ষেত্রে মুলতুবি ইন্টেন্ট উদাহরণ প্রয়োজন হবে। প্রশ্নের পরিবর্তনের অনুরোধ কোডটি আমাকে সঠিক স্ক্রিনে যেতে সাহায্য করেছিল, আমি জানি না যে এটি সঠিক উপায় কিনা এবং আমার জন্য ত্রুটি তখনই
ঘটছিল

তাহলে আপনার যদি প্রয়োজন না হয় তবে কেন একটি আলাদা অনুরোধ-কোড সেট করবেন?
অ্যান্ড্রয়েড বিকাশকারী

ঠিক আছে আমি বিস্তারিতভাবে ব্যাখ্যা করব, আমার কিছু ক্রিয়াকলাপ এ ছিল, আমি প্রশ্নগুলি দেখানো বোঝাতে চাইছি আমি উদ্দেশ্যটির মাধ্যমে বিজ্ঞপ্তিগুলি থেকে আইডিটি পাস করব এবং তারপরে সেই আইডিটির জন্য একটি নেটওয়ার্ক অনুরোধ করব এবং নির্দিষ্ট প্রশ্নটি আনব, সুতরাং যখন সেখানে কী ঘটছিল নোটিফিকেশন ট্রেতে 1 টিরও বেশি বিজ্ঞপ্তি রয়েছে এবং তারপরে আমি যে কোনও একটিতে ক্লিক করুন আমি প্রথম আইসিসি প্রশ্নের উত্তর আইডি পেয়েছিলাম, এটি অনুমিত ইন্টেন্ট রিকোয়েস্ট কোডটি কাজ করে কিছু অনন্য মূল্যে পরিবর্তন করে। আমি আশা করি আমি এখনই এটি স্পষ্ট করে দিয়েছি, যদি সেখানে আরও আলোচনার প্রয়োজন হয় তবে আমি আরও শিখতে চাই, ধন্যবাদ
JSONParser

ওহ, আপনি বোঝাচ্ছেন অন্যথায় এটি কিছুতেই কাজ করে না, তাই না? বিভ্রান্তির জন্য দুঃখিত। এই প্রশ্নটি অনেক আগে জিজ্ঞাসা করা হয়েছিল এবং আমি এটি মোটেও ভাল মনে করি না ...
অ্যান্ড্রয়েড বিকাশকারী

1

requestCodeউইজেটগুলি ব্যবহার করার সময় আপনার অ্যাপটি গুরুতরভাবে সমস্যায় ফেলবে সে সম্পর্কিত একটি গুরুত্বপূর্ণ বিষয় । উইজেটগুলি ফোন পুনরায় বুট করার পরে requestCodeসেগুলি একই থাকলে কাজ করবে না । তার অর্থ pendingIndentআপনি remoteViewsআপনার উইজেটের সেটটিতে সেট করতে হবে অনন্য অনুরোধ কোড, সাধারণত উইজেট একটি সংখ্যার সাথে যুক্ত করুন।


0

প্রকৃতপক্ষে, ডকুমেন্টেশনটিতে স্পষ্টভাবে অনুরোধ কোডটি কীসের জন্য ব্যবহৃত হয় তা বোঝায়:

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

যেহেতু মনে হচ্ছে এটি এখনও পরিষ্কার নয়, তাই আমাকে ব্যাখ্যা করার চেষ্টা করুন:

আপনি যখন কোনও PendingIntentঅবজেক্ট ব্যবহার করতে চান , আপনি কেবল একটিটিকে তাত্পর্যপূর্ণ করবেন না। বরং, আপনি ব্যবহার সিস্টেম থেকে এক প্রাপ্ত PendingIntentস্ট্যাটিক পদ্ধতি ( getActivity, getBroadcast, getServiceইত্যাদি)। সিস্টেমটি प्रलंबित পন্থাগুলির একগুচ্ছ উদাহরণ রাখে এবং আপনাকে একটি দেয়। এটি আপনাকে কোনটি দেয় এটি নির্ভর করে আপনি এই গেটর পদ্ধতিতে যে ইনপুট প্যারামিটারগুলি দিয়ে থাকেন তা নির্ভর করে। এই ইনপুট প্যারামিটারগুলি হ'ল: Contextঅর্থাত্ টার্গেট রিসিভার, Intentব্যবহার করতে হবে requestCodeএবং flags। আপনি যখন একই পাস Context, একই requestCodeএবং একই ইন্টেন্ট (একটি অভিপ্রায় অর্থ filterEqualsঅন্য অভিপ্রায় সঙ্গে), আপনি একই পেতে PendingIntentঅবজেক্ট। মুল বক্তব্যটি হ'ল সিস্টেমটি PendingIntentযতটা সম্ভব কম কিছু বস্তু থাকতে চায় তাই এটি বিদ্যমানগুলি যথাসম্ভব পুনরায় ব্যবহার করতে ঝোঁক।

উদাহরণস্বরূপ, দুটি পৃথক তারিখের জন্য আপনার কাছে দুটি ক্যালেন্ডার বিজ্ঞপ্তি রয়েছে। আপনি যখন সেগুলির একটিতে ক্লিক করেন, আপনি চান আপনার অ্যাপ্লিকেশনটি সেই বিজ্ঞপ্তির সাথে সম্পর্কিত তারিখে খোলা হোক। সেই দৃশ্যে আপনার একই Contextলক্ষ্য রয়েছে এবং আপনি যে Intentঅবজেক্টটি দিয়ে যাচ্ছেন তা কেবলমাত্র এক্সট্রা_ডাটাতে (যা খোলার তারিখটি নির্দিষ্ট করে) আলাদা হয়। আপনি যদি বস্তুটি requestCodeপাওয়ার সময় একই সরবরাহ করেন PendingIntentতবে আপনি একই PendingIntentঅবজেক্টের সাথে সমাপ্ত হবেন । সুতরাং, দ্বিতীয় বিজ্ঞপ্তিটি তৈরি করার সময়, আপনি পুরানো Intentঅবজেক্টটিকে নতুন এক্সট্রা_ডাটা দিয়ে প্রতিস্থাপন করবেন এবং একই তারিখের দিকে নির্দেশ করে দুটি বিজ্ঞপ্তি দিয়ে শেষ করবেন।

আপনি যদি দুটি ভিন্ন ভিন্ন PendingIntentজিনিস রাখতে চান, যেমনটি আপনার এই দৃশ্যে হওয়া উচিত requestCode, PendingIntentঅবজেক্টটি প্রাপ্ত করার সময় আপনাকে একটি আলাদা নির্দিষ্ট করা উচিত ।


তবে আমি যেমন উল্লেখ করেছি, অ্যালার্মগুলি বাতিল করতে আপনি কেবলমাত্র অনুরোধকোড ব্যবহার করতে পারবেন না। এটি এর জন্য কিছু বোঝায় না। তাদের মধ্যে পার্থক্য করতে আপনাকে অতিরিক্ত ডেটা রাখতে হবে। আমার মনে নেই তবে আমি মনে করি আপনি একাধিক অ্যালার্মের জন্য একই অনুরোধ কোড ব্যবহার করতে পারেন।
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আপনি যা বলেছিলেন তা ভুল। চেষ্টা করে দেখুন
Eir
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.