التعامل مع تفاعل المستخدم

تبسّط ميزة "نظرة سريعة" التعامل مع تفاعل المستخدمين من خلال فئات Action. ميزة Glances تحدّد Action فئة الإجراءات التي يمكن للمستخدم اتخاذها، ويمكنك تحديد العملية التي يتم تنفيذها استجابةً للإجراء. يمكنك تطبيق Action على أي باستخدام الطريقة 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>()
    )
}

تنفيذ إجراءات مخصّصة

وبدلاً من إطلاق هدف محدد، يمكن أن تستخدم ميزة Glance إجراء lambda أو actionRunCallback لتنفيذ إجراء، مثل تحديث واجهة المستخدم أو الحالة تفاعل المستخدم.

تنفيذ إجراءات lambda

يمكنك استخدام دوال lambda كعمليات استدعاء لتفاعلات واجهة المستخدم.

على سبيل المثال، أدخِل دالة lambda في 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. واجهة برمجة التطبيقات لإنشاء زوج المفتاح/القيمة المكتوب. على سبيل المثال، لتحديد نوع النقرة الوجهة:

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