Kullanıcı etkileşimini işleme

Glance, Action sınıfları aracılığıyla kullanıcı etkileşimi yönetmeyi kolaylaştırır. Glance'ın Action sınıfları kullanıcının yapabileceği işlemleri tanımlar ve siz de işleme yanıt olarak gerçekleştirilen işlemi belirtebilirsiniz. GlanceModifier.clickable yöntemiyle herhangi bir bileşene Action uygulayabilirsiniz.

Uygulama widget'ları uzak bir işlemde bulunur. Bu nedenle, işlemler oluşturma zamanında tanımlanır ve yürütme, uzak işlemde gerçekleşir. Yerel RemoteViews üzerinde bu işlem PendingIntents aracılığıyla gerçekleştirilir.

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

Etkinlik başlatma

Kullanıcı etkileşiminde bir etkinlik başlatmak için GlanceModifier.clickable(..) değiştiricisi aracılığıyla actionStartActivity işlevini bir Button öğesine veya başka bir besteyle sağlayın.

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

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

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

Hizmet başlatma

Bir etkinlik başlatmaya benzer şekilde, actionStartService yöntemlerinden birini kullanarak kullanıcı etkileşiminde 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önder

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

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ı arayüzünü veya kullanıcı etkileşiminin durumunu güncellemek gibi bir işlem gerçekleştirmek için lambda işlemi veya actionRunCallback kullanabilir.

Lambda işlemlerini çalıştır

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

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

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

Alternatif olarak, bunu destekleyen birleştirilebilir dosyalardaki onClick parametresine iletin:

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

ActionCallback Çalıştır

Alternatif olarak, kullanıcı etkileşimi üzerinde bir işlem gerçekleştirmek için actionRunCallback yöntemlerini kullanabilirsiniz. Bunu yapmak için özel bir ActionCallback uygulaması 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ıklamasında, sağlanan ActionCallback için suspend onAction yöntemi çağrılır ve tanımlanan mantığı yürütür (yani verileri yenileme isteğinde bulunur).

İşlem gerçekleştirildikten sonra widget'ı güncellemek için yeni bir örnek oluşturun ve update(..) komutunu çağırın. Daha ayrıntılı 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 yazılan 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 amaca dahil edilir ve böylece hedef Etkinlik etkinliği alabilir.

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

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