Help us understand the problem. What is going on with this article?

AndroidXのSlicesについて

More than 1 year has passed since last update.

こちらの記事のほうが正確に解説されています

Google Search等のUIをリッチにするAndroidの新機能「Slices」の仕組みと実装方法 - ログミーTech(テック)

以下は間違いを含んでいます

ドキュメント

Slices | Android Developers

Codelabo / Android スライスの作成
Github / slices-basic-codelab
Github / googlesamples/android-SliceViewer

YouTube / Android Slices: build interactive results for Google Search (Google I/O '18)

SlicesのCodelabが激アツだった - Konifar's ZATSU

Android Slices: Getting Started

クラス

Slice
スライス実装

SliceView
スライスを呼び出すビュー

SliceAction
スライス - 呼び出すビューの間でのプロトコル

SliceProvider
コンテンツプロバイダ。スライス側が保持する。スライスを呼び出すビューは、このコンテンツプロバイダをバインドし、スライスのビューやデータを取得します。

SliceMetadata
スライスプロバイダ上の操作イベントをスライスへインテントの形で送信しています。

概要

スクリーンショット 2018-07-30 21.06.01.png

スライスは、Google検索アプリ内や、Googleアシスタントなどの他の場所から、アプリのリッチでダイナミックなインタラクティブなコンテンツを表示できるUIテンプレートです。スライスを使用すると、フルスクリーンのアプリエクスペリエンス以外でのエンゲージメントを可能にし、ユーザーがタスクをより迅速に実行できるようになります。

スクリーンショット 2018-07-20 19.33.18.png
Android Slices: build interactive results for Google Search (Google I/O '18)より

スライスとスライスを表示するスライスプレゼンターの間は、コンテンツプロバイダーでやり取りされます。
(コンテンツプロバイダーは、SliceProviderとしてスライスに実装します。)
スライスプレゼンターはURIを指定して任意のスライスを呼び出します。
スライスの表示に変更がある場合、コンテンツプロバイダーの通知機能であるNotifyChangeによって、(当該コンテンツプロバイダーを保持する)スライスプレゼンターに通知されます。

また一つのスライスに対して、表示方法が3種類用意されます(≒用意する必要があります)

名称 説明
Shortcut アイコンとして表示され、スライスに関連付けられたメインのコンテンツまたはアクションを表すテキストラベルが表示されます。
Small 高さが制限されており、単一 SliceItemまたは限定されたアイテムのコレクションを表示できます。
Large 複数の小さなテンプレートをリストに表示します。スクロールが有効になっていない場合(参照setScrollable(boolean))、ビューには快適にフィットできる数のアイテムが表示されます。

動作確認用アプリ"slice-viewer.apk"をインストール

slice-viewer.apkをインストール

adb install -r -t slice-viewer.apk

Slice URIをテキスト入力するか、以下のコマンドを実行することで、スライスを確認できる

sliceuri例
slice-content://com.example.your.sliceuri
指定したURIのスライスを表示
adb shell am start -a android.intent.action.VIEW -d slice-<your slice URI>

あるいはプロジェクトセッティングで指定したURIのスライスを表示することもできます。
Run the Slice Viewer
(指定したApp Linkで起動や、指定したアクティビティを起動、といった実行オプションがあったんですね。知らなかった。実行、デバッグ構成の作成と編集
)

スライスの実装方法

Codelabo / Android スライスの作成をやってみるのが一番良さそうです。

サンプルプロジェクトの中で、Android Studio 3.1.3では、app/build.gradleをcompileSDKVersionを28に書き換える必要がありました。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {

スライスの実装方法について大まかに説明すると

ビュー
  • SliceProviderを実装する
    • ContentProviderになっていて、SliceViewから探索してもらえる
    • AndroidManifest.xmlでAuthorityを設定する。今後のこのAuthorityをつかってスライスにアクセスする
    • onBindSliceでURIを通じたリクエストを受けた時、返り値でSliceオブジェクトを返却する
イベントを伴うコントロール
  • ブロードキャストイベントを受信する
    • SliceActionsでPendingIntentsをラップすることもできる
    • イベント受信時に、ContentProviderにURIでアクセスしnotifyChangeを発行する。
スライスがブロードキャストイベント受信した時
// Should notify the URI to let any slices that might be displaying know to update.
Uri uri = MySliceProvider.getUri(context, "temperature");
context.getContentResolver().notifyChange(uri, null);

自前のアプリにスライスビューを設定する

自前のアプリにスライスを表示するビューを組み込むこともできそうです。
外部のアプリが作成したスライスを自前のアプリに組み込むイメージです。
SliceViewがそれに当たります。

先に利用したandroid-SliceViewerのソースコードが公開されているので、そちらを参考にするのが良さそうです。

サンプルコードのこのSliceViewKtx.ktあたりで、スライスのコンテンツプロバイダへのバインドを試み、成功した場合はデータはLiveDataとしてオブザーブしています。
もしかするとSliceManagerを使えば良いのかもしれないのですが、未調査です。

(利用していそうなコード)Android_Support_Library_Sample/MainActivity.kt at master · operando/Android_Support_Library_Sample

android-SliceViewerからSliceView関連のシンプルなサンプルを作ろうとした残骸がこちらです。https://github.com/ymmtyuhei/SliceViewTrial

作業した際は、空のプロジェクトを作って、AndroidXにマイグレーションしました。
Android Studio3.2の「Migrate to AndroidX」を試す
Android Studioにあるリファクタリング機能から、Refactor > Migrate to AndroidXを実行するか、手作業で書き換える必要がありました

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away