Başlarken

Bu sayfada, ortamınızı nasıl kuracağınız ve Dilimler.

Not: Android Studio 3.2 veya sonraki sürümler araçlar ve işlevler sunar:

  • AndroidX yeniden düzenleme aracı: Şu özelliklere sahip bir projede çalışıyorsanız gereklidir: AndroidX kitaplıklarını kullanır.
  • Dilimler lint kontrolleri: Yapı oluştururken yaygın karşıt uygulamaları yakalar Dilimler
  • SliceProvider şablonu: şu durumlarda ortak metni işler: SliceProvider oluşturma

Dilim Görüntüleyici'yi indirip yükleyin

En son örneği indir Dilim Görüntüleyici APK sürümü test etmek için kullanabileceğiniz SliceView API.

ADB, ortamınızda doğru şekilde ayarlanmadıysa ADB rehberini inceleyin.

indirilen slice-viewer.apk ile aynı dizin:

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 ekleyin:

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

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

  4. Ad alanına slice girin

  5. Modül açılır listesinde uygulama modülünüzü seçin

  6. Başlatma Seçenekleri altındaki Başlat açılır menüsünden 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.

ziyaret edin.

Dilim Görüntüleyici aracını ADB (komut satırı) üzerinden başlatın

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

adb install -t -r <yourapp>.apk

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

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

Tek bir kablosuz dilimi gösteren dilim görüntüleyici

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

Tek bir Dilimi kullanıma sunmanın yanı sıra, mevcut dillerinizin Dilimler.

  • Dilimlerinizi URI üzerinden manuel olarak aramak için arama çubuğunu kullanın (örneğin, content://com.example.android.app/hello) bilgileri gösterilir. Her arama yaptığınızda dilim eklendi.
  • Dilim URI'sı ile Dilim Görüntüleyici aracını her başlattığınızda, Dilim bir ekleyebilirsiniz.
  • Bir Dilimi hızlıca kaydırarak listeden kaldırabilirsiniz.
  • Yalnızca bu Dilimi içeren bir sayfa görmek için Dilimin URI'sına dokunun. Bu Bu, Dilim URI'sıyla Dilim Görüntüleyici'nin başlatılmasıyla aynı etkiye sahiptir.
ziyaret edin.

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

Dilimi farklı modlarda görüntüleme

Dilim sunan bir uygulama, SliceView#mode Bu nedenle, Dilim'inizin her modda beklendiği gibi göründüğünden emin olmanız gerekir. Modu değiştirmek için sayfanın sağ üst tarafındaki menü simgesini seçin.

Mod "küçük" olarak ayarlanmış tek dilim görüntüleyici

İlk Dilinizi oluşturun

Dilim oluşturmak için Android Studio projenizi açın, src öğenizi sağ tıklayın paketine ekleyin ve Yeni... > Diğer > Dilim Sağlayıcı'yı seçin. Bu işlemle bir sınıf oluşturulur SliceProvider uzantısını genişleterek AndroidManifest.xml için gereken sağlayıcı girişini tanımlar ve build.gradle öğesini tıklayın.

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

<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 metriğinize eklenir:

Kotlin

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

Java

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

Her Dilim'in ilişkilendirilmiş bir URI'sı vardır. Bir yüzey bir Dilimi görüntülemek istediğinde uygulamanıza bu URI ile bir bağlama isteği gönderir. Uygulamanız bu Dilimi onBindSlice yöntemidir. Daha sonra yüzey, uygun olduğunda Dilimi görüntüleyebilir.

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

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

Dilim Görüntüleyici bölümünde oluşturduğunuz dilim çalıştırma yapılandırmasını kullanın Dilim URI'nızı (örneğin, slice-content://com.android.example.slicesample/hello) of Hello World Dilim Görüntüleyici'de görüntülemek için dili dilimle görüntüleyin.

Etkileşimli Dilimler

Bildirimlere benzer şekilde, PendingIntent nesne kullanıcı etkileşimiyle tetiklenir. Aşağıdaki örnekte, Bunları alabilen ve işleyebilen Activity amaçlar:

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, aynı zamanda durum içeren açma/kapatma gibi diğer giriş türlerini de destekler: uygulamaya gönderilen amaçtır.

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

Daha sonra alıcı, 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, içeriğine alınan yayınların sayısını içerir:

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. Şunları yapabilirsiniz: yayın alıcınızı sisteme bir değişiklik olduğunu bildirecek şekilde değiştirme - ContentResolver#notifyChange.

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 Şablonlar bölümüne bakın.