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

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

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

החל מ-Android 13, מוסיפים את השורה הבאה לקובץ AndroidManifest.xml:

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

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

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

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

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

Kotlin

class DACapp : 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, צריך לבקש הרשאות לשליחת התראות לפני שמציגים התראות למשתמשים.

יישום מינימלי נראה כך:

Kotlin

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:

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

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

כשיוצרים את ההתראה, חשוב לכלול שם והודעה תיאוריים.

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

Kotlin

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(666, notificationBuilder.build())
}

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

הפעלת הפונקציה showNotification() תגרום להצגת ההתראה באופן הבא:

Kotlin

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

ההתראה בדוגמה הזו נראית כמו באיור 4:

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

התראה מתמשכת

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

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

Kotlin

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

Java

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