شروع فعالیت از اعلان

وقتی فعالیتی را از اعلان شروع می‌کنید، باید تجربه ناوبری موردانتظار کاربر را حفظ کنید. تک‌ضرب زدن روی دکمه «برگشت» باید کاربر را ازطریق جریان کار عادی برنامه به «صفحه اصلی» برگرداند، و باز کردن صفحه «موارد اخیر» باید فعالیت را به‌عنوان یک تکلیف جداگانه نشان دهد. برای حفظ این تجربه پیمایش، فعالیت را در تکلیف جدیدی شروع کنید.

رویکرد اساسی برای تنظیم رفتار تک‌ضرب برای اعلان در ایجاد اعلان پایه توضیح داده شده است. این صفحه نحوه راه‌اندازی 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
    )
}

درصورت نیاز، می‌توانید با فراخواندن TaskStackBuilder.editIntentAt()، متغیرهای مستقلی به Intent شیء در پشته اضافه کنید. این کار گاهی اوقات برای اطمینان از این امر ضروری است که وقتی کاربر به فعالیتی در پشته پشتی برمی‌گردد، داده‌های معناداری نمایش داده شود.

سپس می‌توانید PendingIntent را طبق معمول به اعلان ارسال کنید:

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

راه‌اندازی «هدف تعلیقی» فعالیت ویژه

ازآنجایی‌که فعالیت ویژه‌ای که از اعلان شروع می‌شود به پشته برگشت نیاز ندارد، می‌توانید 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. با فراخوانی setFlags() با پرچم‌های FLAG_ACTIVITY_NEW_TASK و FLAG_ACTIVITY_CLEAR_TASK، Activity را تنظیم کنید تا در تکلیف جدید و خالی شروع شود.
    3. با تماس گرفتن با 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
    )

  3. مثل همیشه PendingIntent را به اعلان ارسال کنید:

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

برای کسب اطلاعات بیشتر درباره گزینه‌های مختلف تکلیف و نحوه عملکرد پشته برگشت، تکالیف و پشته برگشت را ببینید.