こちらの記事のほうが正確に解説されています
Google Search等のUIをリッチにするAndroidの新機能「Slices」の仕組みと実装方法 - ログミーTech(テック)
以下は間違いを含んでいます
ドキュメント
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
スライスプロバイダ上の操作イベントをスライスへインテントの形で送信しています。
概要
スライスは、Google検索アプリ内や、Googleアシスタントなどの他の場所から、アプリのリッチでダイナミックなインタラクティブなコンテンツを表示できるUIテンプレートです。スライスを使用すると、フルスクリーンのアプリエクスペリエンス以外でのエンゲージメントを可能にし、ユーザーがタスクをより迅速に実行できるようになります。
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をテキスト入力するか、以下のコマンドを実行することで、スライスを確認できる
slice-content://com.example.your.sliceuri
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
を実行するか、手作業で書き換える必要がありました。