Android Slices

https://developer.android.com/guide/slices

Slices, Google search app’inde ve umarız ki ileride de daha fazla yerde uygulamadan içerik sunan ui templateleridir. UI templateleridir diyoruz çünkü belli formatda, belli templateler kullanılarak sunulabiliyor. Basitçe widget’lara benzer de denilebilir. Şimdi App Action‘ların da developerlara açılmasıyla beraber daha fazla senaryo sağlanabilir. Slices Android 4.4’e kadar uyumlu. Bu da Android Studio’da uygulamayı create ederken görebileceğimiz gibi piyasadaki cihazların ortalama %95’i anlamına geliyor. Slices live-data, scroll edebilen içerik, inline actions, ve uygulamamıza deep link sağlamış oluyor.

Slices tasarlarken 3 nokta önemli.

  • Interaktif olmalı. Slices içerisinde kullanıcı hızlıca bazı şeyleri gerçekleştirebilmeli.
  • Slices’ın amacına uygun olarak önemli, özet bilgiye erişim sağlamalı. Her şey burada yer almamalı.
  • Modular olmalı. Uygulama dışında da tek başına yaşayabilmeli. Tabi bu uygulama olmadan slices olabileceği anlamına da gelmiyor.

Slices geliştirmek için Android Studio‘nun en az 3.2 versiyonu olması gerekiyor.

Bir Slice yaratmak için varolan Android Studio projemizde aşağıdaki imajdaki gibi New –> Other –> SliceProvider ı seçip SliceProvider‘dan extend eden bir class yaratmamız gerekmektedir.

Bunu yaptığımızda gradle dosyasına aşağıdaki dependency’lerin eklendiğini ve AndroidManifest.xml dosyasında aşağıdaki gibi provider bloğunun eklendiğini göreceğiz.

implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.slice:slice-builders:1.0.0'

<provider
android:name=".MySliceProvider"
android:authorities="com.boncuk.slicesdemo"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.app.slice.category.SLICE"/>
<data
android:host="boncuk.com"
android:pathPrefix="/hello"
android:scheme="http"/>
</intent-filter>
</provider>

Her bir slice bir URI’yle ilişkilidir. Slice herhangi bir yerden görüntülenmek istediğinde bu URI’yla uygulamaya bir binding request gönderilir. Uygulamamız da bu URI istediğini alır ve onBindSlice methodu aracılığıyla Slice’ı build eder. URI’yi karşılayan bir Slice olması durumunda da görüntülenir.

/**
* Construct the Slice and bind data if available.
*/
override fun onBindSlice(sliceUri: Uri): Slice? {
// Note: you should switch your build.gradle dependency to
// slice-builders-ktx for a nicer interface in Kotlin.
val context = context ?: return null
val activityAction = createActivityAction() ?: return null
return if (sliceUri.path == "/hello") {
// Path recognized. Customize the Slice using the androidx.slice.builders API.
// Note: ANR and StrictMode are enforced here so don't do any heavy operations.
// Only bind data that is currently available in memory.
ListBuilder(context, sliceUri, ListBuilder.INFINITY)
.addRow(
ListBuilder.RowBuilder()
.setTitle("URI found.")
.setPrimaryAction(activityAction)
)
.build()
} else {
// Error: Path not found.
ListBuilder(context, sliceUri, ListBuilder.INFINITY)
.addRow(
ListBuilder.RowBuilder()
.setTitle("URI not found.")
.setPrimaryAction(activityAction)
)
.build()
}
}
view raw onBindSlice.kt hosted with ❤ by GitHub

Slices notifications gibi interactive olabilir. Kullanıcının aksiyonuna bağlı bir PendingIntent’i Slice’a ilişkilendirerek actionları tutabilir ve yönlendirebiliriz. onBind methodunun içerisinde bu sefer ilgili pathPrefix’de Slice yaratan methodu return etmemiz gerekecek. Slices kullanıcan input almamızı sağlayacak toggle da olabilirdi. Toggle’ın action’ın negatif ya da pozitif olduğu bilgisini kullanarak da action’ı trigger edebilirdik. Ya da mesela broadcastreceiver’dan aldığı dinamik content’i de gösterebilir. Tüm slices template’leri için link inlecelenebilir.

fun createSlice(sliceUri: Uri): Slice {
val activityAction = createActivityAction()
return list(context, sliceUri, INFINITY) {
row {
title = "Perform action in app"
primaryAction = activityAction
}
}
}
private fun createActivityAction(): SliceAction? {
return SliceAction.create(
PendingIntent.getActivity(
context, 0, Intent(context, MainActivity::class.java), 0
),
IconCompat.createWithResource(context, R.drawable.ic_launcher_foreground),
ListBuilder.ICON_IMAGE,
"Open App"
)
}

Slices’ı test edebilmek için Slices Viewer APK‘ya ihtiyacımız var. Linkten güncel versiyonu indirilebilir.


adb install -r -t slice-viewer.apk

Slice’ı test edebilmek için, edit configurations diyerek Android App konfigürasyonu ekleyerek aşağıdaki görseldeki gibi pathPrefix’imizi verebiliriz.

Slices konfigurasyonunu run ettiğimizde ise slice’ımızı slice viewer’da görebiliriz. Az önce eklediğimiz slice template’den eklendiği için ise aşağıdaki gibi bir ekranla karşılacağız.

Github Repository:

https://github.com/ElifBon/SlicesDemo

Referans ve daha fazla detay için:

https://developer.android.com/guide/slices/getting-started

https://codelabs.developers.google.com/codelabs/android-slices-basic/index.html?index=..%2F..io2019#0

https://developer.android.com/guide/slices/templates

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Create a free website or blog at WordPress.com.

Up ↑