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

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

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

  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().

    يظهر ذلك في المثال التالي:

    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
    );
    
  3. مرِّر 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.