התחלת פעילות מהתראה

כשמתחילים פעילות מהתראה, צריך לשמור את חוויית הניווט הצפויה. הקשה על לחצן 'הקודם' חייבת להחזיר את המשתמש דרך תהליך העבודה הרגיל של האפליקציה למסך הבית, ופתיחת הקטע 'אחרונים' צריכה להציג את הפעילות כמשימה נפרדת. כדי לשמור את הניווט הזה להתחיל את הפעילות במשימה חדשה.

הגישה הבסיסית להגדרת התנהגות ההקשה להתראה מתוארת ב יצירת רכיב בסיסי התראה. בדף הזה נסביר איך מגדירים 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());
    

כדי לקבל מידע נוסף על האפשרויות השונות לביצוע משימות ועל האופן שבו נעשה שימוש במקבץ האחורי שעובדות, כדאי לעיין במאמר Tasks ומקבץ אחורי.