ウィジェット ホストを作成する

ほとんどの Android デバイスで利用できる Android のホーム画面では、ユーザーがアプリ ウィジェット(またはウィジェット)を埋め込んでコンテンツにすばやくアクセスできるようにすることができます。ホーム画面の代替となるアプリや ユーザーが自分でウィジェットを埋め込めるようにするには、 AppWidgetHost。これは違います。 ほとんどのアプリで必要な作業ですが、独自のホストを作成する場合は、 ホストが暗黙的に同意する契約上の義務を理解することが重要です。

このページでは、カスタムの AppWidgetHost を実装することに伴う責任について説明します。AppWidgetHost を実装する方法の具体例については、以下をご覧ください。 Android のホーム画面のソースコードを見ると、 LauncherAppWidgetHost

ここでは、Terraform の実装に関する主なクラスとコンセプトの概要を説明します。 カスタム AppWidgetHost:

  • アプリ ウィジェット ホスト: AppWidgetHost は、UI にウィジェットを埋め込むアプリのために、AppWidget サービスとのインタラクションを提供します。AppWidgetHost はホスト自身のパッケージ内で一意の ID を持つ必要があります。この ID は保持されます ファイアウォールルールがありますID は通常、アプリ内で割り当てるハードコードされた値です。

  • アプリ ウィジェット ID: 各ウィジェット インスタンスにその時点で一意の ID が割り当てられます。 説明します。詳しくは、 bindAppWidgetIdIfAllowed() 詳細については、後述の「ウィジェットのバインド」をご覧ください。「 使用して一意の ID を取得します。 allocateAppWidgetId()。 この ID は、ウィジェットの存続期間を通じて、 ホストします。アプリケーションのサイズや場所など、ホスト固有の状態 ホスティング パッケージで永続化し、 アプリ ウィジェット ID。

  • アプリ ウィジェット ホスト ビュー: AppWidgetHostView は、表示する必要のあるときにウィジェットをラップするフレームと考えることができます。ウィジェットとは、 ウィジェットがインフレートされるたびに AppWidgetHostView に関連付けられます。 ホストします。

    • デフォルトではシステムが AppWidgetHostView を作成しますが、ホストは AppWidgetHostView を拡張することで、そのサブクラスを作成します。
    • Android 12(API レベル 31)以降、AppWidgetHostViewsetColorResources() および resetColorResources() 動的にオーバーロードされた色を処理するためのメソッドが用意されています。ホストは これらのメソッドに色を指定します。
  • オプション バンドル: AppWidgetHost は、オプション バンドルを使用して、ウィジェットの表示方法(サイズ範囲のリストなど)や、ウィジェットをロック画面に表示するかホーム画面に表示するかに関する情報を AppWidgetProvider に伝達します。この情報によって AppWidgetProvider は、表示の形態と場所に応じてウィジェットのコンテンツや外観をカスタマイズできるようになります。次を使用: updateAppWidgetOptions() および updateAppWidgetSize() ウィジェットのバンドルを変更できますどちらのメソッドも、AppWidgetProvider への onAppWidgetOptionsChanged() コールバックをトリガーします。

ウィジェットのバインディング

ユーザーがホストにウィジェットを追加すると、「バインディング」と呼ばれるプロセスが発生します。バインディングとは、特定のアプリ ウィジェット ID を特定のホストと特定の AppWidgetProvider に関連付けることです。

バインディング API により、ホストがバインディングのためのカスタム UI を提供することもできます。このプロセスを使用するには、アプリがホストのマニフェストで BIND_APPWIDGET 権限を宣言する必要があります。

<uses-permission android:name="android.permission.BIND_APPWIDGET" />

ただしこれで終わりではありません。ユーザーは、実行時に明示的に権限を付与する必要があります。 権限を付与して、ホストにウィジェットを追加できるようにします。アプリにウィジェットを追加する権限があるかどうかを確認するには、bindAppWidgetIdIfAllowed() メソッドを使用します。bindAppWidgetIdIfAllowed()false が返された場合は、アプリでユーザーに権限を付与するよう求めるダイアログを表示する必要があります(現在のウィジェットの追加の場合は「許可」、今後のウィジェットの追加すべてに適用する場合は「常に許可」)。

以下のスニペットは、このダイアログの表示方法に関する例です。

Kotlin

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName)
    // This is the options bundle described in the preceding section.
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options)
}
startActivityForResult(intent, REQUEST_BIND_APPWIDGET)

Java

Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName);
// This is the options bundle described in the preceding section.
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);
startActivityForResult(intent, REQUEST_BIND_APPWIDGET);

ホストは、ユーザーが追加したウィジェットに設定が必要かどうかを確認する必要があります。対象 詳細については、ユーザーがアプリを構成できるようにする ウィジェットをご覧ください。

ホストの責任

AppWidgetProviderInfo メタデータ。 これらの構成オプションを取得できます。詳細については、 以降のセクションでは AppWidgetProviderInfo ウィジェット プロバイダに関連付けられたオブジェクト。

対象とする Android のバージョンに関係なく、すべてのホストに 次のような責任を負います。

  • ウィジェットを追加する際は、前述のようにウィジェット ID を割り当てます。ウィジェットがホストから削除されたら、deleteAppWidgetId() を呼び出してウィジェット ID の割り当てを解除します。

  • ウィジェットを追加する際に、構成アクティビティに リリースしました。通常、ホストはウィジェットの構成を起動する必要があります。 アクティビティが存在し、かつオプションとしてマークされていない場合、 configuration_optional フラグと reconfigurable フラグ。詳しくは、 構成アクティビティからウィジェットを更新する をご覧ください。これは、多くのウィジェットを表示する前に必要なステップです。

  • ウィジェットは、AppWidgetProviderInfo メタデータでデフォルトの幅と高さを指定します。これらの値は、Android 12 以降では targetCellWidthtargetCellHeight が指定されている場合はセルで定義され、minWidthminHeight のみが指定されている場合は dps で定義されます。ウィジェットのサイズ設定属性をご覧ください。

    ウィジェットがここで指定した dp 以上でレイアウトされるようにします。対象 たとえば、多くのホストがアイコンやウィジェットをグリッド状に並べます。このシナリオでは、デフォルトではホストは minWidthminHeight の制約を満たす最小の数のセルを使用してウィジェットを追加します。

前のセクションで説明した要件に加えて、特定のプラットフォーム バージョンでホストに新しい責任を課す機能が導入されています。

対象とする Android バージョンに基づいてアプローチを決定する

Android 12

Android 12(API レベル 31)では、リストを含む追加の List<SizeF> がバンドルされます。 ウィジェット インスタンスがオプション バンドルから取得できる dps 単位の可能なサイズ。 指定するサイズの数はホストの実装によって異なります。通常、ホストはスマートフォン用に 2 つのサイズ(縦向きと横向き)と、折りたたみ式デバイス用に 4 つのサイズを提供します。

異なる数に MAX_INIT_VIEW_COUNT(16)の上限があります AppWidgetProvider が提供できる RemoteViews RemoteViewsAppWidgetProvider オブジェクトは RemoteViews オブジェクトを List<SizeF>MAX_INIT_VIEW_COUNT を超えるサイズを指定しないでください。

Android 12 では、dps に maxResizeWidth 属性と maxResizeHeight 属性も導入されています。これらの属性の少なくとも 1 つを使用するウィジェットは、属性で指定されたサイズを超えないようにすることをおすすめします。

参考情報

  • Glance のリファレンス ドキュメントをご覧ください。