وقتی یک فعالیت را از یک اعلان شروع می کنید، باید تجربه ناوبری مورد انتظار کاربر را حفظ کنید. ضربه زدن روی دکمه برگشت باید کاربر را از طریق جریان کار عادی برنامه به صفحه اصلی بازگرداند و باز کردن صفحه اخیر باید فعالیت را به عنوان یک کار جداگانه نشان دهد. برای حفظ این تجربه ناوبری، فعالیت را در یک کار تازه شروع کنید.
رویکرد اصلی برای تنظیم رفتار ضربه زدن برای اعلان شما در ایجاد یک اعلان اساسی توضیح داده شده است. این صفحه نحوه راهاندازی یک PendingIntent
را برای عملکرد اعلان خود توضیح میدهد تا یک کار جدید و پشته پشته ایجاد کند. نحوه انجام این کار به نوع فعالیتی که شروع می کنید بستگی دارد:
- فعالیت منظم
- این فعالیتی است که به عنوان بخشی از جریان UX عادی برنامه شما وجود دارد. هنگامی که کاربر از طریق اعلان به فعالیت میرسد، وظیفه جدید باید شامل یک پشته کامل باشد که به کاربر اجازه میدهد روی دکمه برگشت ضربه بزند تا سلسله مراتب برنامه را به سمت بالا حرکت کند.
- فعالیت ویژه
- کاربر فقط در صورتی این فعالیت را می بیند که از یک اعلان شروع شده باشد. به یک معنا، این فعالیت با ارائه اطلاعاتی که نمایش آن در خود اعلان دشوار است، رابط کاربری اعلان را گسترش می دهد. این فعالیت به پشته پشتی نیاز ندارد.
یک فعالیت منظم PendingIntent تنظیم کنید
برای شروع یک فعالیت معمولی از اعلان خود، PendingIntent
با استفاده از TaskStackBuilder
تنظیم کنید تا یک پشته جدید به شرح زیر ایجاد کند.
سلسله مراتب فعالیت برنامه خود را تعریف کنید
سلسله مراتب طبیعی فعالیت های خود را با افزودن ویژگی android:parentActivityName
به هر عنصر <activity>
در فایل مانیفست برنامه خود تعریف کنید. مثال زیر را ببینید:
<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) }
جاوا
// Create an Intent for the activity you want to start. Intent resultIntent = new Intent(this, ResultActivity.class); // Create the TaskStackBuilder and add the intent, which inflates the back // stack. TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addNextIntentWithParentStack(resultIntent); // Get the PendingIntent containing the entire back stack. PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | 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()) }
جاوا
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(resultPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
یک فعالیت ویژه PendingIntent تنظیم کنید
از آنجایی که یک اکتیویتی خاص که از یک اعلان شروع می شود، نیازی به پشته پشتی ندارد، می توانید PendingIntent
با فراخوانی getActivity()
ایجاد کنید. با این حال، گزینه های وظیفه مناسب را در مانیفست تعریف کنید.
- در مانیفست خود، ویژگی های زیر را به عنصر
<activity>
اضافه کنید.-
android:taskAffinity =""
- همراه با پرچم
FLAG_ACTIVITY_NEW_TASK
که در کد استفاده میکنید، این ویژگی را خالی تنظیم کنید تا مطمئن شوید که این فعالیت در وظایف پیشفرض برنامه قرار نمیگیرد. همه وظایف موجود که وابستگی پیشفرض برنامه را دارند تحت تأثیر قرار نمیگیرند. -
android:excludeFromRecents ="true"
- وظیفه جدید را از صفحه نمایش اخیر حذف می کند تا کاربر نتواند به طور تصادفی به آن برگردد.
این در مثال زیر نشان داده شده است:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
-
- ایجاد و صدور اطلاعیه:
- یک
Intent
ایجاد کنید کهActivity
را شروع کند. - با فراخوانی
setFlags()
با پرچمهایFLAG_ACTIVITY_NEW_TASK
وFLAG_ACTIVITY_CLEAR_TASK
،Activity
در یک کار جدید و خالی تنظیم کنید. - با فراخوانی
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 )
جاوا
Intent notifyIntent = new Intent(this, ResultActivity.class); // Set the Activity to start in a new, empty task. notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Create the PendingIntent. PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
- یک
- طبق معمول،
PendingIntent
به اعلان ارسال کنید:کاتلین
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
جاوا
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(notifyPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
برای اطلاعات بیشتر در مورد گزینههای مختلف کار و نحوه عملکرد پشته پشتی، به Tasks و پشته پشتی مراجعه کنید.