عند بدء نشاط من الإشعار، يجب عليك الاحتفاظ بتجربة التنقل المتوقعة للمستخدم. يجب أن يؤدي النقر على زر الرجوع إلى إرجاع المستخدم عبر تدفق العمل العادي للتطبيق إلى الشاشة الرئيسية، ويجب أن يُظهر فتح شاشة "العناصر الأخيرة" النشاط كمهمة منفصلة. للحفاظ على تجربة التنقل هذه، ابدأ النشاط في مهمة جديدة.
يمكنك الاطّلاع على الطريقة الأساسية لضبط سلوك النقر على الإشعار في قسم إنشاء إشعار أساسي.
توضّح هذه الصفحة كيفية إعداد
PendingIntent
لإجراء الإشعار لكي يتم إنشاء مهمة جديدة
وحزمة ترتيب جديدة. تعتمد كيفية القيام بذلك
على نوع النشاط الذي تبدأه:
- نشاط منتظم
- هذا نشاط موجود كجزء من المسار العادي لتجربة المستخدم في تطبيقك. عندما يصل المستخدم إلى النشاط من الإشعار، يجب أن تتضمن المهمة الجديدة حزمة خلفية كاملة تتيح للمستخدم النقر على زر الرجوع للانتقال إلى أعلى التسلسل الهرمي للتطبيق.
- نشاط خاص
- لن يرى المستخدم هذا النشاط إلا إذا بدأ من إشعار. يؤدي هذا النشاط إلى توسيع واجهة المستخدم الخاصة بالإشعارات من خلال تقديم معلومات يصعب عرضها في الإشعار نفسه. لا يحتاج هذا النشاط إلى مكدس خلفي.
إعداد نشاط عادي 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
يتضمّن الحزمة الخلفية بالكامل.
Kotlin
// 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) }
Java
// 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);
إذا لزم الأمر، يمكنك إضافة وسيطات إلى كائنات Intent
في الحزمة من خلال استدعاء
TaskStackBuilder.editIntentAt()
.
وهذا أمر ضروري في بعض الأحيان للتأكّد من أنّ النشاط في الحزمة الخلفية يعرض بيانات مفيدة عندما ينتقل المستخدم إليها.
بعد ذلك، يمكنك إرسال PendingIntent
إلى الإشعار كالمعتاد:
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
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
. -
يمكنك ضبط
Activity
للبدء في مهمة جديدة فارغة من خلال استدعاءsetFlags()
مع العَلمَينFLAG_ACTIVITY_NEW_TASK
وFLAG_ACTIVITY_CLEAR_TASK
. -
أنشِئ
PendingIntent
من خلال طلب الرقمgetActivity()
.
يظهر ذلك في المثال التالي:
Kotlin
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 )
Java
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
إلى الإشعار كالمعتاد:Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(notifyPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
لمزيد من المعلومات حول الخيارات المختلفة للمهام وآلية عمل الحزمة الخلفية، يُرجى الاطّلاع على مهام Google وحزمة Backpack.