আপনি বিজ্ঞপ্তি থেকে কোনও অ্যাক্টিভিটি শুরু করলে, আপনাকে অবশ্যই ব্যবহারকারীর প্রত্যাশিত নেভিগেশন অভিজ্ঞতা বজায় রাখতে হবে। 'ফিরে যান' বোতামে ট্যাপ করলে, অ্যাপের স্বাভাবিক ওয়ার্কফ্লো অনুযায়ী ব্যবহারকারীকে হোম স্ক্রিনে ফিরে যেতে হবে এবং 'সাম্প্রতিক' স্ক্রিন খুললে অ্যাক্টিভিটি আলাদা টাস্ক হিসেবে দেখাতে হবে। এই নেভিগেশন অভিজ্ঞতা বজায় রাখতে, নতুন টাস্কে অ্যাক্টিভিটি শুরু করুন।
আপনার বিজ্ঞপ্তির জন্য ট্যাপ আচরণ সেট করার প্রাথমিক পদ্ধতিটি
প্রাথমিক বিজ্ঞপ্তি তৈরি করুন নিবন্ধে বর্ণনা করা হয়েছে। এই পৃষ্ঠায় আপনার বিজ্ঞপ্তির অ্যাকশনের জন্য কীভাবে একটি
PendingIntent সেট-আপ করতে হয় তা বর্ণনা করা হয়েছে, যাতে এটি একটি নতুন
টাস্ক ও ব্যাক স্ট্যাক তৈরি করে। আপনি কোন ধরনের অ্যাক্টিভিটি
শুরু করছেন তার উপর নির্ভর করে আপনাকে এটি করতে হবে:
- নিয়মিত অ্যাক্টিভিটি: এটি এমন অ্যাক্টিভিটি যা আপনার অ্যাপের স্বাভাবিক UX ফ্লোর অংশ হিসেবে থাকে। বিজ্ঞপ্তি থেকে ব্যবহারকারী অ্যাক্টিভিটিতে পৌঁছালে, নতুন টাস্কে অবশ্যই সম্পূর্ণ ব্যাক স্ট্যাক থাকতে হবে, যাতে ব্যবহারকারী 'ব্যাক' বোতামে ট্যাপ করে অ্যাপের হায়ারার্কি অনুযায়ী নেভিগেট করতে পারেন।
- বিশেষ অ্যাক্টিভিটি: কোনও বিজ্ঞপ্তি থেকে শুরু হলে তবেই ব্যবহারকারী এই অ্যাক্টিভিটি দেখতে পাবেন। এক অর্থে, এই অ্যাক্টিভিটি বিজ্ঞপ্তি UI-কে আরও বড় করে, এমন তথ্য প্রদান করে যা বিজ্ঞপ্তি নিজেই দেখাতে পারে না। এই অ্যাক্টিভিটির জন্য ব্যাক স্ট্যাকের প্রয়োজন নেই।
একটি রেগুলার অ্যাক্টিভিটি PendingIntent সেট-আপ করা
আপনার বিজ্ঞপ্তি থেকে কোনও নিয়মিত অ্যাক্টিভিটি শুরু করতে, TaskStackBuilder ব্যবহার করে PendingIntent
সেট-আপ করুন যাতে এটি নিম্নলিখিতভাবে একটি নতুন ব্যাক স্ট্যাক তৈরি করে।
আপনার অ্যাপের অ্যাক্টিভিটি হায়ারার্কি নির্ধারণ করা
আপনার অ্যাপ ম্যানিফেস্ট ফাইলে প্রতিটি <activity> এলিমেন্টে
android:parentActivityName অ্যাট্রিবিউট যোগ করে
আপনার অ্যাক্টিভিটির স্বাভাবিক হায়ারার্কি নির্ধারণ করুন। নিচের উদাহরণ দেখুন:
<activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- MainActivity is the parent for ResultActivity. --> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity" /> ... </activity>
ব্যাক স্ট্যাক সহ PendingIntent তৈরি করা
অ্যাক্টিভিটির ব্যাক স্ট্যাক সহ কোনও অ্যাক্টিভিটি শুরু করতে, TaskStackBuilder-এর একটি
ইনস্ট্যান্স তৈরি করুন এবং addNextIntentWithParentStack()-কে কল করুন,
আপনি যে অ্যাক্টিভিটি শুরু করতে চান সেটির জন্য Intent পাস করুন।
আপনি যদি প্রতিটি অ্যাক্টিভিটির জন্য আগে বর্ণিত
প্যারেন্ট অ্যাক্টিভিটি নির্ধারণ করে থাকেন, তাহলে আপনি getPendingIntent() কল করে একটি PendingIntent
পাবেন যার মধ্যে সম্পূর্ণ ব্যাক স্ট্যাক অন্তর্ভুক্ত থাকবে।
// Create an Intent for the activity you want to start. val resultIntent = Intent(this, ResultActivity::class.java) // Create the TaskStackBuilder. val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run { // Add the intent, which inflates the back stack. addNextIntentWithParentStack(resultIntent) // Get the PendingIntent containing the entire back stack. getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
প্রয়োজন হলে, আপনি TaskStackBuilder.editIntentAt() কল করে স্ট্যাকের Intent অবজেক্টে আর্গুমেন্ট যোগ করতে পারেন।
এটি কখনও কখনও নিশ্চিত করার জন্য প্রয়োজনীয় যে ব্যবহারকারী
সেখানে নেভিগেট করলে ব্যাক স্ট্যাকের একটি অ্যাক্টিভিটি অর্থপূর্ণ ডেটা
দেখায়।
তারপরে আপনি যথারীতি বিজ্ঞপ্তিতে PendingIntent পাস করতে পারবেন:
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
একটি বিশেষ অ্যাক্টিভিটি PendingIntent সেট-আপ করা
বিজ্ঞপ্তি থেকে শুরু হওয়া বিশেষ অ্যাক্টিভিটির জন্য ব্যাক
স্ট্যাকের প্রয়োজন হয় না, তাই আপনি getActivity() কল করে PendingIntent তৈরি করতে পারেন।
তবে, ম্যানিফেস্টে উপযুক্ত টাস্ক বিকল্প নির্ধারণ করুন।
আপনার মেনিফেস্টে,
<activity>এলিমেন্টে নিম্নলিখিত অ্যাট্রিবিউট যোগ করুন।android:taskAffinity=""- আপনার কোডে ব্যবহার করা
FLAG_ACTIVITY_NEW_TASKফ্ল্যাগের সাথে মিলিয়ে এই অ্যাক্টিভিটি যাতে অ্যাপের ডিফল্ট টাস্কে না যায় তা নিশ্চিত করতে এই অ্যাট্রিবিউট ফাঁকা রাখুন। আগে থেকে থাকা এমন কোনও টাস্ক যার অ্যাপের ডিফল্ট অ্যাফিনিটি আছে সেটির উপর কোনও প্রভাব পড়ে না। android:excludeFromRecents="true"- 'সাম্প্রতিক' স্ক্রিন থেকে নতুন টাস্ক বাদ দেয় যাতে ব্যবহারকারী অনিচ্ছাকৃতভাবে সেটিতে ফিরে যেতে না পারেন।
নিচে দেওয়া উদাহরণে এটি দেখানো হয়েছে:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
বিজ্ঞপ্তি তৈরি ও ইস্যু করা:
Activityশুরু করে এমন একটিIntentতৈরি করুন।Activity-কে সেট করুন যাতে এটিFLAG_ACTIVITY_NEW_TASKএবংFLAG_ACTIVITY_CLEAR_TASKফ্ল্যাগ সহsetFlags()কল করে নতুন, ফাঁকা টাস্ক শুরু করতে পারে।getActivity()-এ কল করেPendingIntentতৈরি করুন।
নিচে দেওয়া উদাহরণে এটি দেখানো হয়েছে:
val notifyIntent = Intent(this, ResultActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
সাধারণত যেভাবে
PendingIntentবিজ্ঞপ্তিতে পাস করা হয়, সেইভাবেই করুন:val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
বিভিন্ন টাস্ক বিকল্প এবং ব্যাক স্ট্যাক কীভাবে কাজ করে সেই সম্পর্কে আরও জানতে, টাস্ক ও ব্যাক স্ট্যাক দেখুন।