איך מטפלים באינטראקציות של משתמשים

ב-Glance קל יותר לטפל באינטראקציות של המשתמשים באמצעות המחלקות של Action. המחלקות של Action ב-Glance מגדירות את הפעולות שהמשתמש יכול לבצע, ואתם יכולים לציין את הפעולה שתתבצע בתגובה לפעולה. אפשר להחיל Action על כל רכיב באמצעות השיטה GlanceModifier.clickable.

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

בדף הזה מתוארות הפעולות הבאות:

איך מתחילים פעילויות

כדי להפעיל Activity באינטראקציית משתמש, צריך לספק את הפונקציה actionStartActivity ל-Button או לפונקציה קומפוזבילית אחרת באמצעות העיבוד GlanceModifier.clickable.

צריך לספק אחד מהפרטים הבאים ב-actionStartActivity:

‫Glance מתרגם את הפעולה ל-PendingIntent עם היעד והפרמטרים שסופקו. בדוגמה הבאה, ה-NavigationActivity מופעל כשמשתמש לוחץ על הכפתור:

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MyActivity>()
    )
}

הפעלת שירות

בדומה להפעלת פעילות, מפעילים שירות באינטראקציה של המשתמש באמצעות אחת מהשיטות של actionStartService.

צריך לספק אחד מהפרטים הבאים ב-actionStartService:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

שליחת אירוע שידור

שולחים אירוע שידור באינטראקציה של המשתמש באמצעות אחת מהשיטות של actionSendBroadcast:

צריך לספק אחד מהפרטים הבאים ב-actionSendBroadcast:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

ביצוע פעולות בהתאמה אישית

במקום להפעיל יעד ספציפי, אפשר להשתמש ב-Glance בפעולת lambda או ב-actionRunCallback כדי לבצע פעולה, כמו עדכון של ממשק המשתמש או המצב באינטראקציה של המשתמש.

הפעלת פעולות Lambda

אפשר להשתמש בפונקציות lambda כקריאות חוזרות (callbacks) לאינטראקציות בממשק המשתמש.

לדוגמה, מעבירים את פונקציית הלמבדה ל-modifier‏ GlanceModifier.clickable:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

או להעביר אותו לפרמטר onClick ברכיבים קומפוזביליים שתומכים בו:

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

הפעלת ActionCallback

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

@Composable
private fun MyContent() {
    // ..
    Image(
        provider = ImageProvider(R.drawable.ic_hourglass_animated),
        modifier = GlanceModifier.clickable(
            onClick = actionRunCallback<RefreshAction>()
        ),
        contentDescription = "Refresh"
    )
}

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // TODO implement
    }
}

כשהמשתמש לוחץ, מתבצעת קריאה ל-method‏ suspend onAction של ActionCallback שסופק, והלוגיקה שהוגדרה מופעלת (כלומר, בקשה לרענון הנתונים).

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

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // do some work but offset long-term tasks (e.g a Worker)
        MyAppWidget().update(context, glanceId)
    }
}

הוספת פרמטרים לפעולות

כדי לספק מידע נוסף לפעולה, משתמשים ב-API‏ ActionParameters כדי ליצור צמד מפתח/ערך מסווג. לדוגמה, כדי להגדיר את היעד שעליו לחצו:

private val destinationKey = ActionParameters.Key<String>(
    NavigationActivity.KEY_DESTINATION
)

class MyAppWidget : GlanceAppWidget() {

    // ..

    @Composable
    private fun MyContent() {
        // ..
        Button(
            text = "Home",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "home")
            )
        )
        Button(
            text = "Work",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "work")
            )
        )
    }

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        provideContent { MyContent() }
    }
}

מתחת לפני השטח, הפרמטרים נכללים ב-Intent שמשמש להפעלת ה-Activity, וכך ה-Activity המטורגט יכול לאחזר אותו.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

הפרמטרים מסופקים גם ל-ActionCallback. משתמשים ב-Parameters.Key שהוגדר כדי לאחזר את הערך:

class RefreshAction : ActionCallback {

    private val destinationKey = ActionParameters.Key<String>(
        NavigationActivity.KEY_DESTINATION
    )

    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        val destination: String = parameters[destinationKey] ?: return
        // ...
    }
}