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

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

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

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

התחלת פעילות

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

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

התכונה 'בקצרה' מתרגם את הפעולה ל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>()
    )
}

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

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

הפעלת פעולות של lambda

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

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

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

לחלופין, מעבירים אותו לפרמטר onClick בתכנים קומפוזביליים שתומכים בו:

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

הרצת ActionCallback

לחלופין, אפשר להשתמש ב-methods 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)
    }
}

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

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

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() }
    }
}

מתחתיו, הפרמטרים נכללים בכוונה שמשמשת להפעלת מאפשר לפעילות היעד לאחזר אותה.

    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
        // ...
    }
}