Kullanıcı etkileşimini işleme

Glance, Action sınıflarını kullanarak kullanıcı etkileşimini kolaylaştırır. Glance'in Action sınıfları, kullanıcının gerçekleştirebileceği işlemleri tanımlar. İşleme yanıt olarak gerçekleştirilen işlemi belirtebilirsiniz. GlanceModifier.clickable yöntemini kullanarak herhangi bir bileşene Action uygulayabilirsiniz.

Uygulama widget'ları uzak bir süreçte bulunur. Bu nedenle, işlemler oluşturma sırasında tanımlanır ve yürütme uzak süreçte gerçekleşir. Yerel RemoteViews'da bu işlem PendingIntents kullanılarak yapılır.

Bu sayfada aşağıdaki işlemler açıklanmaktadır:

Etkinlik başlatma

Kullanıcı etkileşimiyle bir etkinlik başlatmak için GlanceModifier.clickable değiştiricisini kullanarak Button veya diğer composable'lara actionStartActivity işlevini sağlayın.

actionStartActivity içinde aşağıdakilerden birini sağlayın:

Glance, İşlemi sağlanan hedef ve parametrelerle PendingIntent olarak çevirir. Aşağıdaki örnekte, kullanıcı düğmeyi tıkladığında NavigationActivity başlatılır:

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

Hizmet başlatma

Etkinlik başlatmaya benzer şekilde, actionStartService yöntemlerinden birini kullanarak kullanıcı etkileşimiyle hizmet başlatın.

actionStartService içinde aşağıdakilerden birini sağlayın:

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

Yayın etkinliği gönderme

Aşağıdaki actionSendBroadcast yöntemlerden birini kullanarak kullanıcı etkileşimiyle ilgili bir yayın etkinliği gönderin:

actionSendBroadcast içinde aşağıdakilerden birini sağlayın:

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

Özel işlemler gerçekleştirme

Glance, belirli bir hedefi başlatmak yerine kullanıcı etkileşimi sırasında kullanıcı arayüzünü veya durumu güncelleme gibi bir işlemi gerçekleştirmek için lambda işlemi ya da actionRunCallback kullanabilir.

Lambda işlemlerini çalıştırma

Lambda işlevlerini, kullanıcı arayüzü etkileşimlerine geri çağırma olarak kullanabilirsiniz.

Örneğin, lambda işlevini GlanceModifier.clickable değiştiricisine iletin:

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

Alternatif olarak, bunu destekleyen composable'lardaki onClick parametresine iletebilirsiniz:

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

Run ActionCallback

Alternatif olarak, kullanıcı etkileşimi üzerinde işlem gerçekleştirmek için actionRunCallback yöntemlerini kullanın. Bunu yapmak için ActionCallback öğesinin özel bir uygulamasını sağlayın:

@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
    }
}

Kullanıcı tıkladığında, sağlanan suspend onAction yöntemi çağrılır ve tanımlanan mantık (ör. verilerin yenilenmesi isteğinde bulunma) yürütülür.ActionCallback

İşlem gerçekleştirildikten sonra widget'ı güncellemek için yeni bir örnek oluşturun ve update(..) işlevini çağırın. Daha fazla bilgi için GlanceAppWidget durumunu yönetme bölümüne bakın.

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

İşlemlere parametre sağlama

Bir işleme ek bilgi sağlamak için ActionParameters API'yi kullanarak türü belirlenmiş bir anahtar/değer çifti oluşturun. Örneğin, tıklanan hedefi tanımlamak için:

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

Alt tarafta, parametreler etkinliği başlatmak için kullanılan amaçta yer alır ve hedef etkinliğin bunları almasına olanak tanır.

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

Parametreler ActionCallback ile de paylaşılır. Değeri almak için tanımlanmış Parameters.Key kullanın:

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