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

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

رویکرد اصلی برای تنظیم رفتار ضربه زدن برای اعلان شما در ایجاد یک اعلان اساسی توضیح داده شده است. این صفحه نحوه راه‌اندازی یک PendingIntent را برای عملکرد اعلان خود توضیح می‌دهد تا یک کار جدید و پشته پشته ایجاد کند. نحوه انجام این کار به نوع فعالیتی که شروع می کنید بستگی دارد:

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

یک فعالیت منظم 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)
}

جاوا

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

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

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

کاتلین

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

جاوا

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. با فراخوانی 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
    )
    

    جاوا

    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 به اعلان ارسال کنید:

    کاتلین

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

    جاوا

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
    builder.setContentIntent(notifyPendingIntent);
    ...
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(NOTIFICATION_ID, builder.build());
    

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