Bắt đầu

Trang này cho bạn biết cách thiết lập môi trường và bản dựng Lát cắt trong ứng dụng của bạn.

Lưu ý: Android Studio 3.2 trở lên có chứa các phiên bản các công cụ và chức năng có thể giúp bạn phát triển Lát cắt:

  • Công cụ tái cấu trúc AndroidX: bắt buộc nếu bạn đang làm việc trong một dự án sử dụng thư viện AndroidX.
  • Kiểm tra tìm lỗi mã nguồn cho Lát cắt: phát hiện các biện pháp chống phổ biến khi tạo bản dựng Lát cắt
  • Mẫu SliceProvider: xử lý mã nguyên mẫu khi xây dựng một SliceProvider

Tải xuống và cài đặt Trình xem Lát cắt

Tải mẫu mới nhất xuống Phát hành APK của Trình xem Lát cắt mà bạn có thể dùng để kiểm thử Lát cắt mà không cần triển khai API SliceView.

Nếu ADB không được thiết lập đúng cách trong môi trường của bạn, hãy xem Hướng dẫn về ADB để biết thêm thông tin.

Cài đặt Trình xem Lát cắt trên thiết bị của bạn bằng cách chạy lệnh sau trong cùng thư mục với slice-viewer.apk đã tải xuống:

adb install -r -t slice-viewer.apk

Chạy trình xem Lát cắt

Bạn có thể chạy Trình xem Lát cắt trong dự án Android Studio hoặc từ dòng lệnh:

Chạy Trình xem Lát cắt trong dự án Android Studio

  1. Trong dự án của bạn, hãy chọn Run > (Chạy >) Chỉnh sửa cấu hình...
  2. Ở góc trên cùng bên trái, hãy nhấp vào dấu cộng màu xanh lục
  3. Chọn Ứng dụng Android

  4. Nhập slice (lát cắt) vào trường tên

  5. Chọn mô-đun ứng dụng của bạn trong trình đơn thả xuống Module (Mô-đun)

  6. Trong phần Tuỳ chọn chạy, hãy chọn URL trong trình đơn thả xuống Ra mắt

  7. Nhập slice-<your slice URI> vào trường URL

    Ví dụ: slice-content://com.example.your.sliceuri

  8. Nhấp vào OK

Khởi chạy công cụ Trình xem Lát cắt qua ADB (dòng lệnh)

Chạy ứng dụng trên Android Studio:

adb install -t -r <yourapp>.apk

Xem Lát cắt của bạn bằng cách chạy lệnh sau:

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

Trình xem Lát cắt hiển thị một Lát cắt Wi-Fi

Xem tất cả Lát cắt của bạn ở cùng một nơi

Ngoài việc khởi chạy một Lát cắt, bạn có thể xem danh sách cố định Lát cắt.

  • Sử dụng thanh tìm kiếm để tìm kiếm các Lát cắt của bạn theo cách thủ công qua URI (ví dụ: content://com.example.android.app/hello). Mỗi lần bạn tìm kiếm, Lát cắt sẽ đã thêm vào danh sách.
  • Bất cứ khi nào bạn chạy công cụ Trình xem Lát cắt bằng URI Lát cắt, Lát cắt sẽ được thêm vào vào danh sách.
  • Bạn có thể vuốt một Lát cắt để xoá khỏi danh sách.
  • Nhấn vào URI của Lát cắt đó để xem một trang chỉ chứa Lát cắt đó. Thông tin này có có tác dụng tương tự như khi chạy Trình xem Lát cắt với URI Lát cắt.

Trình xem Lát cắt cho thấy danh sách Lát cắt

Xem Lát cắt ở nhiều chế độ

Ứng dụng hiển thị Lát cắt có thể sửa đổi SliceView#mode trong thời gian chạy, do đó bạn phải đảm bảo Lát cắt của mình trông như dự kiến ở mỗi chế độ. Chọn biểu tượng trình đơn ở khu vực trên cùng bên phải trang để thay đổi chế độ.

Trình xem một Lát cắt với chế độ được đặt thành "nhỏ"

Tạo Lát cắt đầu tiên

Để tạo một Lát cắt, hãy mở dự án Android Studio, nhấp chuột phải vào src gói và chọn Mới... &gt; Khác > Nhà cung cấp Lát cắt. Thao tác này sẽ tạo một lớp mở rộng SliceProvider, sẽ thêm mục nhập nhà cung cấp bắt buộc vào AndroidManifest.xml của bạn và sửa đổi build.gradle để thêm các phần phụ thuộc bắt buộc của Lát cắt.

Dưới đây là nội dung sửa đổi đối với AndroidManifest.xml:

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

Các phần phụ thuộc sau đây sẽ được thêm vào build.gradle:

Kotlin

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

Java

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

Mỗi Lát cắt có một URI liên kết. Khi một nền tảng muốn hiển thị Lát cắt, gửi một yêu cầu liên kết đến ứng dụng của bạn bằng URI này. Sau đó, ứng dụng của bạn sẽ xử lý việc này yêu cầu và tự động tạo Lát cắt thông qua onBindSlice . Sau đó, bề mặt có thể hiển thị Lát cắt khi thích hợp.

Dưới đây là ví dụ về phương thức onBindSlice để kiểm tra URI /hello đường dẫn và trả về một Lát cắt Hello World:

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

Dùng cấu hình chạy slice (Lát cắt) mà bạn đã tạo trong phần Trình xem Lát cắt ở trên, chuyển vào URI Lát cắt của bạn (ví dụ: slice-content://com.android.example.slicesample/hello) trong ứng dụng Hello World Lát cắt để xem đoạn mã đó trong Trình xem Lát cắt.

Lát cắt tương tác

Tương tự như thông báo, bạn có thể xử lý số lượt nhấp trong Lát cắt của mình bằng cách đính kèm Các đối tượng PendingIntent là được kích hoạt khi người dùng tương tác. Ví dụ dưới đây bắt đầu một Activity có thể nhận và xử lý các thông tin đó ý định:

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

Lát cắt cũng hỗ trợ các kiểu dữ liệu đầu vào khác, chẳng hạn như nút bật/tắt, có trạng thái trong ý định được gửi đến ứng dụng.

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

Sau đó, trình thu nhận có thể kiểm tra trạng thái nhận được:

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

Lát cắt động

Lát cắt cũng có thể chứa nội dung động. Trong ví dụ sau, Lát cắt hiện bao gồm số lượng tin truyền phát nhận được trong nội dung:

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

Trong ví dụ này, mặc dù số lượng được hiển thị nhưng không tự cập nhật. Bạn có thể sửa đổi broadcast receiver để thông báo cho hệ thống rằng đã xảy ra thay đổi bằng cách sử dụng 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);
        }
    }
}

Mẫu

Lát cắt hỗ trợ nhiều mẫu. Để biết thêm chi tiết về các tuỳ chọn mẫu và hành vi, hãy xem phần Mẫu.