مدیریت تعامل کاربر

Glance مدیریت تعامل کاربر را بااستفاده از کلاس‌های Action ساده می‌کند. کلاس‌های Action Glance کنش‌هایی را که کاربر می‌تواند انجام دهد تعریف می‌کنند و شما می‌توانید عملیاتی را که در پاسخ به کنش انجام می‌شود مشخص کنید. می‌توانید Action را بااستفاده از روش GlanceModifier.clickable به هر مؤلفه‌ای اعمال کنید.

ابزاره‌های برنامه در فرایند راه دور قرار دارند، بنابراین کنش‌ها در زمان ایجاد تعریف می‌شوند و اجرا در فرایند راه دور اتفاق می‌افتد. در RemoteViews بومی، این کار بااستفاده از PendingIntents انجام می‌شود.

کنش‌های زیر در این صفحه شرح داده شده است:

راه‌اندازی فعالیت

برای راه‌اندازی فعالیتی در تعامل کاربر، تابع actionStartActivity را بااستفاده از اصلاح‌کننده GlanceModifier.clickable به Button یا ترکیب‌پذیر دیگری ارائه دهید.

یکی از موارد زیر را در 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 می‌تواند از یک کنش لامبدا یا یک actionRunCallback برای انجام یک کنش، مانند به‌روزرسانی UI یا وضعیت در تعامل کاربر استفاده کند.

اجرا کردن کنش‌های لامبدا

می‌توانید از توابع لامبدا به‌عنوان فراخوانی‌های برگشتی برای تعاملات واسط کاربر استفاده کنید.

برای مثال، تابع لامبدا را به اصلاح‌کننده 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
    }
}

با کلیک کاربر، روش 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 برای ایجاد یک جفت کلید-مقدار تایپ‌شده استفاده کنید. برای مثال، برای تعریف مقصد کلیک‌شده:

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