הצגת התראות תלויות-זמן

יכול להיות שהאפליקציה תצטרך למשוך את תשומת הלב של המשתמש בדחיפות במצבים מסוימים, כמו התראה שמופעלת או שיחה נכנסת. במכשירים עם Android בגרסה 9 (רמת API‏ 28) ומטה, אפשר לטפל בזה על ידי הפעלת פעילות כשהאפליקציה פועלת ברקע. במסמך הזה מוסבר איך להשיג את ההתנהגות הזו במכשירים עם Android גרסה 10 (רמת API‏ 29) ומעלה.

הוספת ההרשאה POST_NOTIFICATIONS

החל מ-Android 13 (רמת API‏ 33), צריך להצהיר על ההרשאה POST_NOTIFICATIONS בקובץ AndroidManifest.xml:

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

אחרי שמצהירים על ההרשאה, יוצרים ערוץ התראות.

יצירת ערוץ התראות

יוצרים ערוץ התראות כדי להציג התראות ולאפשר למשתמשים לנהל את קטגוריות ההתראות בהגדרות המערכת. למידע נוסף על ערוצי התראות, קראו את המאמר יצירה וניהול של ערוצי התראות.

יוצרים את ערוצי ההתראות ב-method‏ onCreate של הכיתה Application:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        val channel = NotificationChannel(
            CHANNEL_ID,
            "High priority notifications",
            NotificationManager.IMPORTANCE_HIGH
        )

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
}

כשהמשתמש מפעיל את האפליקציה בפעם הראשונה, המערכת מציגה את הערוץ במסך פרטי האפליקציה, כמו שמוצג באיור 1:

מסך ההתראות של פרטי האפליקציה שבו מוצג הערוץ שנוצר.
איור 1. בקטע "התראות" במסך פרטי האפליקציה בהגדרות המערכת של האפליקציה.

ניהול ההרשאות לשליחת התראות

החל מגרסת Android 13, צריך לבקש הרשאות לשליחת התראות לפני שמציגים התראות למשתמשים.

בדוגמת הקוד הבאה אפשר לראות איך מבקשים הרשאה לשליחת התראות בזמן הריצה ב-Jetpack Compose:

val permissionLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.RequestPermission(),
    onResult = { hasNotificationPermission = it }
)
// ...
Button(
    onClick = {
        if (!hasNotificationPermission) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
            }
        }
    },
) {
    Text(text = "Request permission")
}

במכשירים עם Android מגרסה 13 ואילך, לחיצה על הכפתור Request permission תציג את תיבת הדו-שיח של המערכת שמופיעה באיור 2:

תיבת הדו-שיח של המערכת שבה המשתמש מתבקש לאשר את ההתראות.
איור 2. תיבת דו-שיח של המערכת לבקשת הרשאה לשליחת התראות.

כשהמשתמש מעניק את ההרשאה, המערכת מעדכנת את המסך פרטי האפליקציה, כמו שמוצג באיור 3:

מסך פרטי האפליקציה שבו מוצגות ההרשאות לשליחת התראות שניתנו.
איור 3. ניתנה הרשאה לשליחת התראות.

יצירת התראה בעדיפות גבוהה

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

הקוד לדוגמה הבא מגדיר ויוצר התראה בעדיפות גבוהה:

private fun showNotification() {
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    val notificationBuilder =
        NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.baseline_auto_awesome_24)
            .setContentTitle("HIGH PRIORITY")
            .setContentText("Check this dog puppy video NOW!")
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setCategory(NotificationCompat.CATEGORY_RECOMMENDATION)

    notificationManager.notify(0, notificationBuilder.build())
}

הצגת ההתראה למשתמש

קריאה לפונקציה showNotification מפעילה את ההתראה באופן הבא:

Button(onClick = { showNotification() }) {
    Text(text = "Show notification")
}

באיור 4 מוצגת ההתראה בעדיפות גבוהה שהמערכת מציגה:

התראה בעדיפות גבוהה שמוצגת במכשיר.
איור 4. התראה בעדיפות גבוהה.

התראה מתמשכת

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

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

// Provide a unique integer for the "notificationId" of each notification.
startForeground(notificationId, notification)

כדאי להשתמש בעדכונים בזמן אמת

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