Kullanıcı etkileşimini işleme

Glance, Action sınıflarını kullanarak kullanıcı etkileşimini yönetmeyi 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 işlemde bulunur. Bu nedenle, işlemler oluşturma sırasında tanımlanır ve yürütme işlemi uzak işlemde gerçekleşir. Yerel RemoteViews dilinde 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 başka bir composable'a actionStartActivity işlevini sağlayın.

actionStartActivity alanında aşağıdakilerden birini sağlayın:

Glance, işlemi sağlanan hedef ve parametrelerle bir PendingIntent öğesine ç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 bir hizmet başlatın.

actionStartService alanında 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

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

actionSendBroadcast alanında 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şimiyle 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, destekleyen composable'larda onClick parametresine iletebilirsiniz:

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

ActionCallback'i çalıştırma

Alternatif olarak, kullanıcı etkileşimiyle ilgili bir işlem yapmak için actionRunCallback yöntemlerini kullanın. Bunun için ActionCallback yönteminin ö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 ActionCallback öğesinin suspend onAction yöntemi çağrılır ve tanımlanan mantık yürütülür (ör. verileri yenileme isteği).

İşlem gerçekleştirildikten sonra widget'ı güncellemek için yeni bir örnek oluşturun ve update yöntemini ç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'sini kullanarak yazılı 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() }
    }
}

Altta, parametreler etkinliği başlatmak için kullanılan intent'e dahil edilir ve hedef etkinliğin bunu almasına olanak tanır.

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

Parametreler ActionCallback için de sağlanır. Değeri almak için tanımlanan Parameters.Key öğesini 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
        // ...
    }
}