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

יכול להיות שהאפליקציה תצטרך למשוך את תשומת הלב של המשתמש באופן דחוף במצבים מסוימים, למשל אם יש התראה פעילה או שיחה נכנסת. באפליקציות שמטרגטות מכשירים עם 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>

לאחר מכן תוכלו ליצור ערוץ התראות.

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

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

יוצרים את ערוצי ההתראות ב-method‏ 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 במסך המערכת פרטי האפליקציה של האפליקציה:

תמונה שבה מוצג המסך &#39;פרטי האפליקציה&#39;, &#39;התראות&#39; של האפליקציה.
איור 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);