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

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

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