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

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

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

اقدامات زیر در این صفحه شرح داده شده است:

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

برای راه‌اندازی یک فعالیت در تعامل با کاربر، تابع actionStartActivity را از طریق اصلاح‌کننده GlanceModifier.clickable (..) به یک Button یا دیگر قابل‌انشا ارائه کنید.

یکی از موارد زیر را در actionStartActivity ارائه دهید:

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

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

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

به عنوان مثال، تابع lambda را به اصلاح کننده GlanceModifier.clickable ارسال کنید:

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

یا آن را به پارامتر onClick در composable هایی که از آن پشتیبانی می کنند، ارسال کنید:

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

در زیر، پارامترها در هدف مورد استفاده برای راه اندازی فعالیت گنجانده شده است و به 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
        // ...
    }
}