Başlarken

Bu sayfada, ortamınızı nasıl ayarlayacağınız ve uygulamanızda Dilimler'i nasıl oluşturacağınız gösterilmektedir.

Not: Android Studio 3.2 veya sonraki sürümler, Slice geliştirmenize yardımcı olabilecek ek araçlar ve işlevler içerir:

  • AndroidX yeniden düzenleme aracı: AndroidX kitaplıkları kullanan bir projede çalışıyorsanız gereklidir.
  • Dilimlere hata analizi yapar: Dilimler oluştururken yaygın karşıt uygulamaları yakalar
  • SliceProvider şablonu: SliceProvider oluştururken ortak metni işler

Dilim Görüntüleyici'yi indirme ve yükleme

SliceView API'yi uygulamadan Dilinizi test etmek için kullanabileceğiniz en son örnek Slice Viewer APK sürümünü indirin.

ADB, ortamınızda doğru şekilde ayarlanmamışsa daha fazla bilgi için ADB kılavuzuna bakın.

İndirilen slice-viewer.apk dosyasıyla aynı dizinde aşağıdaki komutu çalıştırarak Dilim Görüntüleyici'yi cihazınıza yükleyin:

adb install -r -t slice-viewer.apk

Dilim Görüntüleyici'yi çalıştırma

Dilim Görüntüleyici'yi Android Studio projenizden veya komut satırından başlatabilirsiniz:

Android Studio projenizden Dilim Görüntüleyici'yi başlatın

  1. Projenizde Çalıştır > Yapılandırmaları Düzenle... seçeneğini belirleyin.
  2. Sol üst köşedeki yeşil artı işaretini tıklayın.
  3. Android Uygulaması'nı seçin

  4. Ad alanına slice yazın

  5. Modül açılır menüsünden uygulama modülünüzü seçin

  6. Launch Options (Başlatma Seçenekleri) altında, Launch (Başlat) açılır listesinden URL'yi seçin.

  7. URL alanına slice-<your slice URI> girin

    Örnek: slice-content://com.example.your.sliceuri

  8. Tamam'ı tıklayın.

ADB (komut satırı) aracılığıyla Slice Viewer aracını başlatın

Android Studio'dan uygulamanızı çalıştırın:

adb install -t -r <yourapp>.apk

Aşağıdaki komutu çalıştırarak Dilinizi görüntüleyin:

adb shell am start -a android.intent.action.VIEW -d slice-<your slice URI>

Tek bir kablosuz ağ dilimi gösteren Dilim Görüntüleyici

Tüm Dilimlerinizi tek bir yerde görüntüleyin

Tek bir Dilim'i kullanıma sunmanın yanı sıra Dilimlerinizin kalıcı bir listesini görüntüleyebilirsiniz.

  • Dilimlerinizi URI (örneğin, content://com.example.android.app/hello) aracılığıyla manuel olarak aramak için arama çubuğunu kullanın. Her arama yaptığınızda listeye eklenir.
  • Dilim URI'si ile Dilim Görüntüleyici aracını her başlatışınızda, Dilim listeye eklenir.
  • Bir Dili hızlıca kaydırarak listeden kaldırabilirsiniz.
  • Yalnızca Dilimi içeren bir sayfayı görmek için Dilimin URI'sına dokunun. Bu işlemin, Dilim URI'si ile başlatmakla aynı etkiye sahiptir.

Dilimlerin listesini gösteren Dilim Görüntüleyici

Dilimi farklı modlarda görüntüleme

Dilim gösteren bir uygulama, çalışma zamanında SliceView#mode öğesini değiştirebilir. Bu nedenle, Dilinizin her modda beklendiği gibi göründüğünden emin olmanız gerekir. Modu değiştirmek için sayfanın sağ üst bölümündeki menü simgesini seçin.

Modu "small" olarak ayarlanmış tek dilim görüntüleyici

İlk Dilinizi oluşturun

Dilim oluşturmak için Android Studio projenizi açın, src paketinizi sağ tıklayın ve Yeni... > Diğer > Dilim Sağlayıcı'yı tıklayın. Bu işlem, SliceProvider adlı sınıfı genişleten bir sınıf oluşturur, gerekli sağlayıcı girişini AndroidManifest.xml öğenize ekler ve build.gradle öğenizi gerekli Dilim bağımlılıklarını ekleyecek şekilde değiştirir.

AndroidManifest.xml üzerinde yapılan değişiklik aşağıda gösterilmektedir:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.app">
    ...
    <application>
        ...
        <provider android:name="MySliceProvider"
            android:authorities="com.example.android.app"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.app.slice.category.SLICE" />
            </intent-filter>
        </provider>
        ...
    </application>

</manifest>

Aşağıdaki bağımlılıklar build.gradle öğenize eklenir:

Kotlin

dependencies {
// ...
    implementation "androidx.slice:slice-builders-ktx:(latest version)"
// ...
}

Java

dependencies {
// ...
    implementation "androidx.slice:slice-builders:(latest version)"
// ...
}

Her Dilim, ilişkili bir URI'ye sahiptir. Bir yüzey bir Dilim görüntülemek istediğinde, uygulamanıza bu URI ile bir bağlama isteği gönderir. Daha sonra uygulamanız bu isteği işler ve Dili onBindSlice yöntemi ile dinamik olarak derler. Yüzey, uygun olduğunda Dilimi görüntüleyebilir.

Aşağıda, /hello URI yolunu kontrol eden ve Hello World Dilimi döndüren bir onBindSlice yöntemi örneği verilmiştir:

Kotlin

override fun onBindSlice(sliceUri: Uri): Slice? {
    val activityAction = createActivityAction()
    return if (sliceUri.path == "/hello") {
        list(context, sliceUri, ListBuilder.INFINITY) {
            row {
                primaryAction = activityAction
                title = "Hello World."
            }
        }
    } else {
        list(context, sliceUri, ListBuilder.INFINITY) {
            row {
                primaryAction = activityAction
                title = "URI not recognized."
            }
        }
    }
}

Java

@Override
public Slice onBindSlice(Uri sliceUri) {
    if (getContext() == null) {
        return null;
    }
    SliceAction activityAction = createActivityAction();
    ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY);
    // Create parent ListBuilder.
    if ("/hello".equals(sliceUri.getPath())) {
        listBuilder.addRow(new ListBuilder.RowBuilder()
                .setTitle("Hello World")
                .setPrimaryAction(activityAction)
        );
    } else {
        listBuilder.addRow(new ListBuilder.RowBuilder()
                .setTitle("URI not recognized")
                .setPrimaryAction(activityAction)
        );
    }
    return listBuilder.build();
}

Yukarıdaki Dilim Görüntüleyici bölümünde oluşturduğunuz dilim çalıştırma yapılandırmasını kullanın ve bunu Dilim Görüntüleyici'de görüntülemek için Hello World Dilimi'nin Dilim URI'nizi (örneğin, slice-content://com.android.example.slicesample/hello) iletin.

Etkileşimli Dilimler

Bildirimlerde olduğu gibi, kullanıcı etkileşiminde tetiklenen PendingIntent nesneleri ekleyerek Diliminizdeki tıklamaları yönetebilirsiniz. Aşağıdaki örnekte, bu niyetleri alabilen ve işleyebilen bir Activity başlatılmıştır:

Kotlin

fun createSlice(sliceUri: Uri): Slice {
    val activityAction = createActivityAction()
    return list(context, sliceUri, INFINITY) {
        row {
            title = "Perform action in app"
            primaryAction = activityAction
        }
    }
}

fun createActivityAction(): SliceAction {
    val intent = Intent(context, MainActivity::class.java)
    return SliceAction.create(
        PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), 0),
        IconCompat.createWithResource(context, R.drawable.ic_home),
        ListBuilder.ICON_IMAGE,
        "Enter app"
    )
}

Java

public Slice createSlice(Uri sliceUri) {
    if (getContext() == null) {
        return null;
    }
    SliceAction activityAction = createActivityAction();
    return new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY)
            .addRow(new ListBuilder.RowBuilder()
                    .setTitle("Perform action in app.")
                    .setPrimaryAction(activityAction)
            ).build();
}

public SliceAction createActivityAction() {
    if (getContext() == null) {
        return null;
    }
    return SliceAction.create(
            PendingIntent.getActivity(
                    getContext(),
                    0,
                    new Intent(getContext(), MainActivity.class),
                    0
            ),
            IconCompat.createWithResource(getContext(), R.drawable.ic_home),
            ListBuilder.ICON_IMAGE,
            "Enter app"
    );
}

Dilimler, uygulamaya gönderilen amaçtaki durum bilgisini içeren açma/kapatma gibi diğer giriş türlerini de destekler.

Kotlin

fun createBrightnessSlice(sliceUri: Uri): Slice {
    val toggleAction =
        SliceAction.createToggle(
            createToggleIntent(),
            "Toggle adaptive brightness",
            true
        )
    return list(context, sliceUri, ListBuilder.INFINITY) {
        row {
            title = "Adaptive brightness"
            subtitle = "Optimizes brightness for available light"
            primaryAction = toggleAction
        }
        inputRange {
            inputAction = (brightnessPendingIntent)
            max = 100
            value = 45
        }
    }
}

fun createToggleIntent(): PendingIntent {
    val intent = Intent(context, MyBroadcastReceiver::class.java)
    return PendingIntent.getBroadcast(context, 0, intent, 0)
}

Java

public Slice createBrightnessSlice(Uri sliceUri) {
    if (getContext() == null) {
        return null;
    }
    SliceAction toggleAction = SliceAction.createToggle(
            createToggleIntent(),
            "Toggle adaptive brightness",
            true
    );
    ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY)
            .addRow(new ListBuilder.RowBuilder()
                    .setTitle("Adaptive brightness")
                    .setSubtitle("Optimizes brightness for available light.")
                    .setPrimaryAction(toggleAction)
            ).addInputRange(new ListBuilder.InputRangeBuilder()
                    .setInputAction(brightnessPendingIntent)
                    .setMax(100)
                    .setValue(45)
            );
    return listBuilder.build();
}

public PendingIntent createToggleIntent() {
    Intent intent = new Intent(getContext(), MyBroadcastReceiver.class);
    return PendingIntent.getBroadcast(getContext(), 0, intent, 0);
}

Alıcı daha sonra, aldığı durumu kontrol edebilir:

Kotlin

class MyBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.hasExtra(Slice.EXTRA_TOGGLE_STATE)) {
            Toast.makeText(context, "Toggled:  " + intent.getBooleanExtra(
                    Slice.EXTRA_TOGGLE_STATE, false),
                    Toast.LENGTH_LONG).show()
        }
    }

    companion object {
        const val EXTRA_MESSAGE = "message"
    }
}

Java

public class MyBroadcastReceiver extends BroadcastReceiver {

    public static String EXTRA_MESSAGE = "message";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.hasExtra(EXTRA_TOGGLE_STATE)) {
            Toast.makeText(context, "Toggled:  " + intent.getBooleanExtra(
                    EXTRA_TOGGLE_STATE, false),
                    Toast.LENGTH_LONG).show();
        }
    }
}

Dinamik Dilimler

Dilimler, dinamik içerik de barındırabilir. Aşağıdaki örnekte Dilim, artık içeriğine alınan yayın sayısını eklemektedir:

Kotlin

fun createDynamicSlice(sliceUri: Uri): Slice {
    return when (sliceUri.path) {
        "/count" -> {
            val toastAndIncrementAction = SliceAction.create(
                createToastAndIncrementIntent("Item clicked."),
                actionIcon,
                ListBuilder.ICON_IMAGE,
                "Increment."
            )
            list(context, sliceUri, ListBuilder.INFINITY) {
                row {
                    primaryAction = toastAndIncrementAction
                    title = "Count: ${MyBroadcastReceiver.receivedCount}"
                    subtitle = "Click me"
                }
            }
        }

        else -> {
            list(context, sliceUri, ListBuilder.INFINITY) {
                row {
                    primaryAction = createActivityAction()
                    title = "URI not found."
                }
            }
        }
    }
}

Java

public Slice createDynamicSlice(Uri sliceUri) {
    if (getContext() == null || sliceUri.getPath() == null) {
        return null;
    }
    ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY);
    switch (sliceUri.getPath()) {
        case "/count":
            SliceAction toastAndIncrementAction = SliceAction.create(
                    createToastAndIncrementIntent("Item clicked."),
                    actionIcon,
                    ListBuilder.ICON_IMAGE,
                    "Increment."
            );
            listBuilder.addRow(
                    new ListBuilder.RowBuilder()
                            .setPrimaryAction(toastAndIncrementAction)
                            .setTitle("Count: " + MyBroadcastReceiver.sReceivedCount)
                            .setSubtitle("Click me")
            );
            break;
        default:
            listBuilder.addRow(
                    new ListBuilder.RowBuilder()
                            .setPrimaryAction(createActivityAction())
                            .setTitle("URI not found.")
            );
            break;
    }
    return listBuilder.build();
}

public PendingIntent createToastAndIncrementIntent(String s) {
    Intent intent = new Intent(getContext(), MyBroadcastReceiver.class)
            .putExtra(MyBroadcastReceiver.EXTRA_MESSAGE, s);
    return PendingIntent.getBroadcast(getContext(), 0, intent, 0);
}

Bu örnekte sayı gösterilirken kendiliğinden güncellenmez. ContentResolver#notifyChange kullanarak yayın alıcınızı, bir değişiklik olduğunu sisteme bildirecek şekilde değiştirebilirsiniz.

Kotlin

class MyBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.hasExtra(Slice.EXTRA_TOGGLE_STATE)) {
            Toast.makeText(
                context, "Toggled:  " + intent.getBooleanExtra(
                    Slice.EXTRA_TOGGLE_STATE, false
                ),
                Toast.LENGTH_LONG
            ).show()
            receivedCount++;
            context.contentResolver.notifyChange(sliceUri, null)
        }
    }

    companion object {
        var receivedCount = 0
        val sliceUri = Uri.parse("content://com.android.example.slicesample/count")
        const val EXTRA_MESSAGE = "message"
    }
}

Java

public class MyBroadcastReceiver extends BroadcastReceiver {

    public static int sReceivedCount = 0;
    public static String EXTRA_MESSAGE = "message";

    private static Uri sliceUri = Uri.parse("content://com.android.example.slicesample/count");

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.hasExtra(EXTRA_TOGGLE_STATE)) {
            Toast.makeText(context, "Toggled:  " + intent.getBooleanExtra(
                    EXTRA_TOGGLE_STATE, false),
                    Toast.LENGTH_LONG).show();
            sReceivedCount++;
            context.getContentResolver().notifyChange(sliceUri, null);
        }
    }
}

Şablonlar

Dilimler çeşitli şablonları destekler. Şablon seçenekleri ve çalışma biçimleri hakkında daha fazla bilgi için Şablonlar bölümüne bakın.