بدء نشاط من إشعار

عند بدء نشاط من إشعار، عليك الحفاظ على تجربة التنقّل المتوقّعة للمستخدم. يجب أن يؤدي النقر على زر الرجوع إلى إعادة المستخدم إلى الشاشة الرئيسية من خلال سير العمل العادي للتطبيق، كما يجب أن يؤدي فتح شاشة "التطبيقات الحديثة" إلى عرض النشاط كمهمة منفصلة. للحفاظ على تجربة التنقّل هذه، ابدأ النشاط في مهمة جديدة.

يتم توضيح الطريقة الأساسية لضبط سلوك النقر على الإشعار في مقالة إنشاء إشعار أساسي. توضّح هذه الصفحة كيفية إعداد 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 يتضمّن الأنشطة السابقة بأكملها.

// 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
    )
}

إذا لزم الأمر، يمكنك إضافة وسيطات إلى عناصر Intent في الحزمة من خلال استدعاء TaskStackBuilder.editIntentAt(). ويكون ذلك ضروريًا في بعض الأحيان لضمان عرض النشاط في قائمة الأنشطة السابقة لبيانات مفيدة عندما ينتقل المستخدم إليه.

بعد ذلك، يمكنك تمرير PendingIntent إلى الإشعار كالمعتاد:

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentIntent(resultPendingIntent)
    // ...
}
with(NotificationManagerCompat.from(this)) {
    notify(NOTIFICATION_ID, builder.build())
}

إعداد PendingIntent لنشاط خاص

بما أنّ النشاط الخاص الذي يبدأ من إشعار لا يحتاج إلى حزمة احتياطية، يمكنك إنشاء PendingIntent من خلال استدعاء getActivity(). ومع ذلك، يجب تحديد خيارات المهام المناسبة في البيان.

  1. في ملف البيان، أضِف السمات التالية إلى العنصر <activity>.

    android:taskAffinity=""
    بالإضافة إلى العلامة FLAG_ACTIVITY_NEW_TASK التي تستخدمها في الرمز، اضبط هذه السمة على قيمة فارغة لضمان عدم انتقال هذا النشاط إلى المهمة التلقائية للتطبيق. لن تتأثر أي مهام حالية تتضمّن الانتماء التلقائي للتطبيق.
    android:excludeFromRecents="true"
    يستبعد هذه المهمة الجديدة من شاشة "المستندات الحديثة" حتى لا يتمكّن المستخدم من الرجوع إليها عن طريق الخطأ.

    يوضّح المثال التالي كيفية إجراء ذلك:

    <activity
    android:name=".ResultActivity"
    android:launchMode="singleTask"
    android:taskAffinity=""
    android:excludeFromRecents="true">
    </activity>

  2. إنشاء الإشعار وإصداره:

    1. أنشئ Intent يبدأ Activity.
    2. اضبط Activity على البدء في مهمة جديدة فارغة من خلال استدعاء setFlags() مع العلامتَين FLAG_ACTIVITY_NEW_TASK وFLAG_ACTIVITY_CLEAR_TASK.
    3. أنشئ PendingIntent من خلال استدعاء getActivity().

    يوضّح المثال التالي كيفية إجراء ذلك:

    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
    )

  3. مرِّر PendingIntent إلى الإشعار كالمعتاد:

    val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
        setContentIntent(notifyPendingIntent)
        // ...
    }
    with(NotificationManagerCompat.from(this)) {
        notify(NOTIFICATION_ID, builder.build())
    }

لمزيد من المعلومات حول خيارات المهام المختلفة وطريقة عمل الأنشطة السابقة، راجِع المهام والأنشطة السابقة.