Kanzi Android Service での開発¶
Kanzi Android Service を使用すると、デバイス上の複数のアプリケーションから同じ Kanzi Android framework (droidfw) インスタンスを使用できます。これは、1 つのアプリケーション内の Android サービスで Kanzi Android framework (droidfw) をホストし、Android の IPC メカニズムを使用してすべてのクライアントアプリケーションからそれを利用することで実現されます。
これにより、次の機能が利用可能になります。
Shared libraries。クライアントアプリケーション間で単一の Kanzi ライブラリセットを再利用することで、静的メモリの使用量を最適化します。
Shared runtime and resources。クライアントアプリケーション間で同じ Kanzi Engine とリソースを共有することで、ランタイムのメモリと GPU の使用量を最適化します。
Improved application startup time。Kanzi Engine とリソースをバックグラウンドで事前に読み込むことで、起動時間を短縮します。
Cross-application transition animations。共有の Kanzi リソースを使用して、異なるアプリケーション間のシームレスなトランジションアニメーションを実現します。
Kanzi Android Service の使用例については、Android Service の例 を参照してください。
注釈
Kanzi Android Service はエクスペリメンタル機能であり、皆様からのフィードバックは非常に重要です。フィードバックを送信するには、こちらの フィードバックフォーム を使用してください。
アーキテクチャの詳細¶
サービスホストアプリケーション¶
このアプリケーションは、kzservice ライブラリを通じて Kanzi Android Service をホストします。サービスは Kanzi Android framework (droidfw) の初期化を担い、それを通じて Kanzi ランタイムを初期化します。ホストアプリケーションには、すべての Kanzi アセット、Kanzi ネイティブライブラリ、および Kanzi Engine プラグインをバンドルします。
クライアントアプリケーション¶
これらは、サービスアプリケーションの Kanzi 機能を使用する、同じシステム上の任意の数のアプリケーションです。クライアントアプリケーションは、kzclient ライブラリのビュー型とコンポーザブル型を使用して Kanzi にアクセスします。
アプリケーション間のトランジションアニメーション¶
クライアントは、共有の Kanzi リソースを使用して異なるアプリケーション間のシームレスなトランジションアニメーションを実行するよう、サービスに要求できます。これは、サービスが他のすべてのアプリケーションの上に表示されるオーバーレイウィンドウを作成し、そこにトランジションアニメーションをレンダリングすることで機能します。アニメーションが完了すると、オーバーレイウィンドウは非表示になります。
はじめに¶
Kanzi Studio で Kanzi Android Service プロジェクトを作成するには、次の手順に従います。
Quick Start ウィンドウの New タブで、Android Service application プロジェクトテンプレートを選択します。
Create をクリックします。
Kanzi は、Kanzi Studio プロジェクトと 2 つの Android Studio アプリケーションプロジェクトを作成します。
<MyProject>Applicationディレクトリにあるサービスホストアプリケーション。<MyProject>Clientディレクトリにあるクライアントアプリケーション。
クライアント API の使用¶
これは、クライアントアプリケーションでサービスアプリケーション内の Kanzi Engine インスタンスを設定し、通信するために使用する API です。
ビュー型とコンポーザブル型¶
Kanzi コンテンツを XML レイアウトまたはコンポーザブルに追加できます。
XML レイアウトで SurfaceView ベースのレンダリングを行うには、次を追加します。
<com.rightware.kanzi.service.KanziServiceSurfaceView
android:id="@+id/clientred"
app:clientId="clientred"
app:kzbPathList="clientred.kzb"
app:startupPrefabUrl="kzb://clientred/StartupPrefab"
app:serviceHostPackage="com.example.host"
app:serviceIntentAction="com.example.host.action.LAUNCH_SERVICE"
/>
TextureView ベースのレンダリングを行うには、次を追加します。
<com.rightware.kanzi.service.KanziServiceTextureView
android:id="@+id/clientred"
app:clientId="clientred"
app:kzbPathList="clientred.kzb"
app:startupPrefabUrl="kzb://clientred/StartupPrefab"
app:serviceHostPackage="com.example.host"
app:serviceIntentAction="com.example.host.action.LAUNCH_SERVICE"
/>
KanziServiceTextureView はアプリケーション間のトランジションをサポートしていません。アプリケーション間のトランジションアニメーションの設定 を参照してください。
SurfaceView ベースのビューと TextureView ベースのビューの違いについては、Kanzi ビューを追加する を参照してください。
またはコンポーザブルに次を追加します。
KanziServiceComposable(
modifier = Modifier,
request = Request(
clientId = "clientblue",
kzbPathList = "clientblue.kzb",
startupPrefabUrl = "kzb://clientblue/StartupPrefab",
),
serviceHostPackage = "com.example.host",
serviceIntentAction = "com.example.host.action.LAUNCH_SERVICE"
)
KanziServiceComposable は KanziServiceSurfaceView をベースにしており、オプションのパラメータ transparency、focusableInTouchMode、listener も受け付けます。
ビュー型とコンポーザブル型は、次の XML アトリビュートを受け付けます。
アトリビュート (Attribute) |
フォーマット (Format) |
ディスクリプション (Description) |
|---|---|---|
|
ストリング (String) |
クライアントが表示する Kanzi コンテンツの識別子。2 つのクライアントアプリケーションで同じクライアント ID を使用するのは、それらの間でアプリケーション間のトランジションを行う場合に限ってください。アプリケーション間のトランジションアニメーションの設定 を参照してください。 |
|
ストリング (String) |
このクライアントにロードする .kzb ファイルまたは .kzb.cfg ファイルのカンマ区切りリスト。 |
|
ストリング (String) |
クライアントのロード時にクライアントのサーフェスにインスタンス化されるプレハブの URL。 |
|
ストリング (String) |
Kanzi Android Service をホストするアプリケーションの Android パッケージ名。 |
|
ストリング (String) |
Kanzi Android Service がクライアントアプリケーションをサービスにバインドするために使用するインテントアクション。 |
|
カラー (Color) |
サーフェスをクリアするために使用される色。デフォルト: |
|
Boolean |
サーフェスのクリアを有効にします。デフォルト: |
|
Boolean |
組み込みのロータリー入力処理を有効にします。設定すると、Kanzi はロータリー入力イベントを処理し、Kanzi のキーイベントに変換します。デフォルト: |
|
Boolean |
トランスパレンシーのサポートを有効にします。デフォルト: |
serviceHostPackage と serviceIntentAction が、Service ホストアプリケーションのマニフェストファイルで宣言されている applicationId および Intent アクションと完全に一致していることを確認してください。
クライアントビューのライフサイクル¶
クライアントビューは、ウィンドウにアタッチされたときに Kanzi Android Service に接続し、ウィンドウからデタッチされたときに切断します。これは KanziServiceSurfaceView、KanziServiceTextureView、KanziServiceComposable に適用されます。ビューは、たとえばフラグメント、ViewPager、RecyclerView、LazyColumn を使用する場合に、アタッチとデタッチを繰り返します。削除したクライアントビューを再び追加すると、そのビューは再接続してコンテンツを表示します。
クライアントビューがウィンドウからデタッチされると、Kanzi Android Service ホストは KanziServiceViewAdapterListener.onDetachedFromWindow を呼び出します。同じ clientId を持つ別のクライアントビューがまだコンテンツを表示している場合や、アプリケーション間のトランジションの実行中は、Kanzi Android Service ホストはこれを呼び出しません。Kanzi Android Service ホストは、終了したクライアントアプリケーションのコンテンツを解放するときにも onDetachedFromWindow を呼び出します。クライアントアプリケーションの終了 を参照してください。
onServiceConnected の前、およびクライアントビューがウィンドウからデタッチされた後に行った呼び出しは、クライアントによって破棄されます。Kanzi Android Service ホストは、クライアントビューがデタッチされる前にプッシュしたデータを保持します。クライアントビューがデタッチされている間に変更されたデータは、onServiceConnected でプッシュしてください。
KanziServiceClientListener¶
KanziServiceClientListener は、クライアントのライフサイクルイベントに関する通知を受け取るためのインターフェイスです。すべてのコールバックにはデフォルトで空の実装があるため、必要なコールバックのみをオーバーライドすれば済みます。
コールバック |
ディスクリプション (Description) |
|---|---|
|
Kanzi Android Service が接続され、クライアントが使用可能になったときに呼び出されます。クライアントビューがウィンドウに再アタッチされた後に Kanzi Android Service が接続したとき、および Kanzi Android Service ホストが再起動したときにも再び呼び出されます。サービスホストの再起動 を参照してください。 |
|
クライアントビューがウィンドウにアタッチされたときに呼び出されます。 |
|
クライアントビューがウィンドウからデタッチされたときに呼び出されます。 |
|
レンダリングサーフェスが作成され、使用可能になったときに呼び出されます。 |
|
レンダリングサーフェスが破棄される直前に呼び出されます。 |
|
レンダリングサーフェスのサイズが変更されたときに呼び出されます。 |
ビューにリスナーを設定するには、次のようにします。
val kanziView = findViewById<KanziServiceSurfaceView>(R.id.clientred)
kanziView.listener = object : KanziServiceClientListener {
override fun onServiceConnected(client: KanziServiceClient) {
// Service is ready, interact with Kanzi
}
}
注釈
リスナーは、ビューがウィンドウにアタッチされる前に設定してください。サービスがすでに接続された後にリスナーを設定すると、コールバックを受け取れなくなります。
データソースのセッター¶
ビューベースのアプリケーションでは、KanziServiceClient のリファレンスを次のように取得できます。
val clientX = findViewById(R.id.clientred) as KanziServiceClient
Compose ベースのアプリケーションでは次のように取得できます。
var kanziServiceClient: KanziServiceClient? by remember { mutableStateOf(null) }
KanziServiceComposable(
...
listener = object : KanziServiceClientListener {
override fun onServiceConnected(client: KanziServiceClient) {
kanziServiceClient = client
}
},
)
このリファレンスを通じて、セッター pushDataInt、pushDataString、pushDataReal、および pushDataBoolean にアクセスできます。例:
kanziServiceClient?.pushDataInt(
"kzb://launcher/Data Sources/Scene Data source",
"MainMenuScene",
MainMenuScenes.HOME.value
)
データソースの KZB URL、データオブジェクトへのパス、およびプッシュする値を指定する必要があります。onServiceConnected の前、およびクライアントビューがウィンドウからデタッチされた後に行った呼び出しは、クライアントによって破棄されます。
クライアントの手動デタッチ¶
デフォルトでは、アクティビティが停止しても、クライアントアプリケーションはサービスから明示的にデタッチしません。その結果、サービスは関連付けられた Kanzi Engine インスタンスの実行を続け、そのクライアントに割り当てられたリソースを保持し続けます。
明示的にデタッチするには、アクティビティのライフサイクルメソッド内で KanziServiceClient インスタンスの handleClientAttached と handleClientDetached を呼び出します。
override fun onStop() {
super.onStop()
kanziServiceClient?.handleClientDetached()
}
override fun onStart() {
super.onStart()
kanziServiceClient?.handleClientAttached()
}
注釈
手動デタッチはシームレストランジション機能と互換性がありません。アプリケーション間トランジションを使用している場合は、これらのメソッドを呼び出さないでください。
クライアントアプリケーションの終了¶
クライアントアプリケーションは、Kanzi Android Service からデタッチせずに終了することがあります。たとえば、Android がメモリを解放するためにアプリケーションを停止した場合や、ユーザーが強制停止した場合です。クライアントビューが画面に表示されている間にクライアントアプリケーションのプロセスが終了すると、Kanzi Android Service はそのビューのサーフェスを解放します。そのクライアント ID でアプリケーション間のトランジションを行うもう一方のクライアントアプリケーションがまだ実行中の場合、Kanzi Android Service はそのクライアントアプリケーションのためにコンテンツを保持します。それ以外の場合、Kanzi Android Service はそのクライアント ID のコンテンツも解放し、KanziServiceViewAdapterListener.onDetachedFromWindow を呼び出します。そのクライアント ID を持つクライアントアプリケーションが再び接続すると、Kanzi Android Service は、事前ロードしたプレハブではなく、そのクライアントアプリケーションのスタートアッププレハブをロードします。
When a client application terminates in the background, after it lost its surface, the Kanzi Android Service keeps its content. The client application then shows the content immediately when it starts again. If the client application that last showed the content terminated on the screen, the Kanzi Android Service does not keep the content. It releases the content when the last client application with that client ID terminates, also in the background.
注釈
アプリケーション間のトランジション中にクライアントアプリケーションが終了した場合、Kanzi Android Service はそのサーフェスもコンテンツも解放しません。既知の問題 を参照してください。
向きの変更を処理する¶
デバイスの向きが変わったら、Kanzi Android Service に通知します。
kanziServiceClient?.handleOrientationChange(newOrientation)
newOrientation を、Android の Configuration から取得した新しいデバイスの向きの値に設定します。
このイベントは Kanzi コンテンツを回転させません。Kanzi コンテンツの向きを設定するには、スクリーン (Screen) ノード の Orientation プロパティを使用します。
可視性の変更の処理¶
クライアントビューの可視性が変わったら、レンダリングを最適化できるように Kanzi Android Service に通知します。
kanziServiceClient?.handleVisibilityChange(isVisible)
ビューが表示されている場合は isVisible を true に、表示されていない場合は false に設定します。クライアントがコンテンツを持っていない間は、Kanzi Android Service はこの呼び出しを無視します。クライアントは、そのクライアントビューがウィンドウにアタッチされた時点、または Kanzi Android Service ホストがそのプレハブを事前ロードした時点からコンテンツを持ちます。コンテンツは、クライアントビューがウィンドウからデタッチされるまで存在します。
クライアントが非表示にしたコンテンツは、別の接続を持つクライアントが同じクライアント ID のサーフェスを提供するまで非表示のままです。その時点で Kanzi Android Service はコンテンツを表示します。これはたとえば、Android がアクティビティを再作成して新しい接続が割り当てられた場合や、Kanzi Android Service ホストが事前ロードして非表示にしたコンテンツをクライアントが引き継いだ場合に発生します。
同じクライアント ID を持つ複数のクライアントが接続している場合、Kanzi Android Service は表示状態の変更を最後に接続したクライアントによるものとみなします。古いクライアントがコンテンツを非表示にした場合、最新のクライアントが再びサーフェスを提供しても、コンテンツは非表示のままです。
サービスホストの再起動¶
Kanzi Android Service ホストのプロセスが終了すると、Android はそれを再起動し、クライアントを再び接続します。
Kanzi Android Service ホストが停止している間は、
pushDataIntなどの呼び出しはクライアントによって破棄されます。クライアントが再び接続すると、
onServiceConnectedが再度発生します。再起動した Kanzi Android Service ホストは、
startupPrefabUrlからクライアントのコンテンツを再びロードします。再起動前にプッシュしたデータは失われます。onServiceConnectedで再度プッシュしてください。
Service API の使用¶
これは、サービスホストアプリケーションで Kanzi Java API を通じて Kanzi Android framework (droidfw) を初期化および設定するために使用する API です。
KanziServiceRuntime は参照カウント方式のシングルトンで、KanziServiceRuntime.acquire(context) を呼び出して取得します。サービスが開始される前にランタイムを維持しておくには、返された Reference を Application サブクラスのメンバーとして保持します。最後の Reference が閉じられると、ランタイムはシャットダウンします。
Kanzi Engine Java プラグインを登録するには、
KanziServiceRuntimeを取得し、そのdomainを Kanzi Java API で使用します。例:private lateinit var runtimeRef: KanziServiceRuntime.Reference override fun onCreate() { super.onCreate() runtimeRef = KanziServiceRuntime.acquire(this) val domain = requireNotNull(runtimeRef.get().domain) { "KanziServiceRuntime.domain must not be null after acquire()" } domain.registerPlugin(MyJavaPlugin()) }
KanziServiceViewAdapterListenerを実装すると、サービスホストアプリケーションで、クライアントアプリケーションに関連付けられたKanziViewAdapterのステートの変化をリッスンできます。たとえば、設定したスタートアッププレハブからインスタンス化されたノードツリーにアクセスして変更するには、
KanziServiceViewAdapterListener.onPrefabLoadedコールバックを使用します。override fun onCreate() { super.onCreate() KanziServiceRuntime.addViewAdapterListener(clientId, object : KanziServiceViewAdapterListener { override fun onPrefabLoaded( clientId: String, viewAdapter: KanziViewAdapter, domain: Domain ) { // Look up a child node starting from the root. val text = viewAdapter.root.lookupNode<TextBox2D>("#Text") // Set properties on a node. text.setProperty(TextBox2D.TextProperty, "Hello world!") } }) }
サービスホストアプリケーションからクライアントのコンテンツを表示または非表示にするには、クライアント ID を指定して
KanziServiceRuntime.handleVisibilityChangeを呼び出します。たとえば、クライアントアプリケーションが引き継ぐまで事前ロードしたコンテンツを非表示にしておくには、次のようにします。runtimeRef.get().handleVisibilityChange("clientred", false)
この呼び出しは、クライアントの表示状態の変更と同じルールに従います。Kanzi Android Service はこの呼び出しを最後に接続したクライアントによるものとみなし、別の接続を持つクライアントがサーフェスを提供すると、コンテンツを再び表示します。可視性の変更の処理 を参照してください。
クライアントプレハブのプリロード¶
サービスホストアプリケーションでクライアントプレハブをプリロードしておくと、クライアントアプリケーションの起動時に、プレハブの読み込みを待たずにすぐに Kanzi のコンテンツを利用できます。
クライアントプレハブをプリロードするには、Application サブクラスの onCreate メソッドで KanziServiceRuntime を取得し、preloadClientPrefab を呼び出します。
private lateinit var runtimeRef: KanziServiceRuntime.Reference
override fun onCreate() {
super.onCreate()
runtimeRef = KanziServiceRuntime.acquire(this)
runtimeRef.get().preloadClientPrefab(
"clientred",
arrayOf("clientred.kzb"),
"kzb://clientred/Prefabs/ClientRedPrefab"
)
}
preloadClientPrefab は、指定された clientId の KanziViewAdapter を作成し、kzb ファイルをロードして、プレハブをインスタンス化します。プレハブ URL が空の場合、preloadClientPrefab はプレハブをロードせず、クライアントは登録したスタートアッププレハブを保持します。
preloadClientPrefab は、最初のクライアントアプリケーションが接続する前、またはクライアントアプリケーションがサーフェスを持っている間に呼び出してください。プレハブのロード中は、事前ロードされたコンテンツがウィンドウなしで Kanzi のメインループを駆動します。以下の場合、Kanzi Android Service ホストのデバッグビルドはプレハブのロード中に終了します。
すべてのクライアントアプリケーションがサーフェスを失った後に
preloadClientPrefabを呼び出した場合。サーフェスを持つ最後のクライアントアプリケーションが、プレハブのロードが完了する前にサーフェスを失った場合。
Application.onCreate から preloadClientPrefab を呼び出すと、1 つ目のケースを回避できます。
クライアントアプリケーションの設定は、プレハブをプリロードするかどうかにかかわらず同じです。プリロードが影響するのはクライアントの起動時間のみです。
注釈
プリロードされたコンテンツは、同じ clientId を持つ実際のクライアントが接続してその所有権を取得するまでメモリに保持されます。特定の clientId でクライアントが一度も接続しない場合、そのプリロードされたリソースはサービスが存続する間ずっと割り当てられたままになります。クライアントアプリケーションの終了によって Kanzi Android Service があるクライアント ID のコンテンツを解放した場合、そのコンテンツが再びプリロードされることはありません。クライアントアプリケーションの終了 を参照してください。
アクティブなクライアントビューがない間のタスクの送信¶
サービスホストアプリケーションは、少なくとも 1 つのクライアントビューがアクティブである間のみ Kanzi のメインループを実行します。クライアントビューは、サーフェスを持ち、かつ表示されている間はアクティブです。事前ロードされたクライアントビューは、そのプレハブのロード中はアクティブです。アクティブなクライアントビューがない間、たとえばすべてのクライアントアプリケーションがバックグラウンドにある場合、Kanzi はフレームを実行しません。
アクティブなクライアントビューがない間にサービスホストアプリケーションが TaskDispatcher に送信したタスクは待機状態になります。Kanzi は、クライアントビューが再びアクティブになった後の最初のフレームで、それらのタスクをすべて実行します。サービスホストアプリケーションが、たとえばデータソースの更新ごとに高頻度でタスクを送信し続けると、これらのタスクが蓄積されます。その結果、クライアントビューの最初のフレームは、それらすべてのタスクの実行にかかる時間だけ遅延します。
アクティブなクライアントビューがない間は、更新ごとにタスクを送信しないでください。代わりに、各データアイテムの最新の値を保持し、値を適用するタスクが待機していない場合にのみタスクを送信します。アクティブなビューがない間のタスクの送信 を参照してください。
pushDataInt などのクライアント API のデータソースセッターは、タスクディスパッチャを使用しません。これらはサービスホストアプリケーションのメインスレッドでデータオブジェクトの値を設定するため、クライアントアプリケーションがプッシュする値は蓄積されません。
アプリケーション間のトランジションアニメーションの設定¶
アプリケーション間のトランジションアニメーションを使用すると、Kanzi プロジェクト内で異なる Android アプリケーション間を移動する際に、シームレスな視覚的トランジションを作成できます。
アプリケーション間のトランジションを設定するには:
ソースアプリケーションとターゲットアプリケーションの Kanzi サービスビューを、次のように設定します。
同じ Kanzi Android Service インスタンスと同じ
clientIdを使用する。両方のクライアントアプリケーションで
KanziServiceSurfaceViewまたはKanziServiceComposableを使用します。注釈
TextureViewにはSurfaceControlがないため、KanziServiceTextureViewはアプリケーション間のトランジションをサポートしていません。そのstartSeamlessTransitionはUnsupportedOperationExceptionをスローします。アクティビティ内でフルスクリーンのビューにする。
Kanzi Android framework (droidfw) のトランスパレンシーの要件を満たす。透明なビューの作成 を参照してください。
Kanzi サービスビューで、次のように設定します。
transparencyをtrueにclearEnabledをtrueにclearColorを@android:color/transparentに
application.cfgを編集して、アルファビットを持つサーフェスを必要とするようにします。カラーフォーマット (Color format) を参照してください。SurfaceBitsAlpha = 8
Kanzi Studio で透明なコンテンツを表示するノードを選択し、Properties で Background Brush プロパティを < No Brush > に設定します。
次のパラメータを指定して
startSeamlessTransitionAPI を呼び出します。clientId- Android アプリケーション間を移動するクライアント ID。transitionDuration- Kanzi のコンテンツがオーバーレイに表示され続ける時間。kanziTransition- Kanzi のステートを更新して視覚的トランジションを駆動するラムダ関数。androidTransition- Android 側のアプリケーションのトランジションを開始するラムダ関数。leftMargin- オーバーレイ内で Kanzi のコンテンツを配置するための左マージン (ピクセル単位、省略可能)。デフォルト:0。topMargin- オーバーレイ内で Kanzi のコンテンツを配置するための上マージン (ピクセル単位、省略可能)。デフォルト:0。rightMargin- オーバーレイ内で Kanzi のコンテンツを配置するための右マージン (ピクセル単位、省略可能)。デフォルト:0。bottomMargin- オーバーレイ内で Kanzi のコンテンツを配置するための下マージン (ピクセル単位、省略可能)。デフォルト:0。
// Start a seamless transition between applications. kanziServiceView?.startSeamlessTransition( clientId = "coverflow", transitionDuration = 2.seconds, kanziTransition = { // Update Kanzi state to drive the visual transition. kanziServiceView?.pushDataInt( "kzb://service/Data Sources/Data source", "State", 1 ) }, androidTransition = { // Launch the target application. val intent = Intent().apply { setClassName( "com.example.clientred", "com.example.clientred.MainActivity" ) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } startActivity(intent) } )
この API を呼び出すと、Kanzi Android Service はアプリケーションのトランジション中にアニメーションを表示するオーバーレイウィンドウを作成します。ターゲットアプリケーションが Kanzi サービスビューを表示しない場合、オーバーレイはトランジションが終了するまで最大 10 秒間スクリーンに表示されたままになります。
Display over other applications 権限は、サービスホストアプリケーションに付与します。オーバーレイをレンダリングするのはサービスホストであるため、この権限が必要なのはそのアプリケーションだけです。
この権限を付与するには:
サービスホストアプリケーションをデバイスにインストールします。
デバイスの設定を開きます。
Apps > <HostApplicationName> > Permissions に移動します。
Display over other applications 権限を有効にします。
注釈
Android Automotiveデバイスでは、新しくインストールしたアプリケーションに対して、Android UIから Display over other applications 権限を付与することはできません。
次のいずれかの代替方法を使用します。
ホスト APK にプラットフォームキーで署名して、この権限を自動的に付与します。
ホストアプリケーションに対して AOSP レベルで権限を付与します。
adb で権限を付与します。
adb shell appops set <host_package_name> SYSTEM_ALERT_WINDOW allow
たとえば、Android Service の例 の例のホストアプリケーションの場合:
adb shell appops set com.rightware.kanzi.transition.host SYSTEM_ALERT_WINDOW allow
既知の問題¶
現在、サービスホストアプリケーションには、どのクライアントもアニメーション機能を使用していない場合でも、Display over other applications 権限が必要です。
アプリケーション間のトランジション中にクライアントアプリケーションが終了した場合、Kanzi Android Service はそのサーフェスもコンテンツも解放しません。
関連項目¶
Kanzi Android framework (droidfw) での開発
Kanzi application framework (appfw) を使用した Android 向け開発