ユーザーが特定の特性を設定できるようにウィジェットを設計します。たとえば、時計ウィジェットでは、表示するタイムゾーンをユーザーが設定できます。
ユーザーがウィジェットの設定を行えるようにするには、ウィジェット設定の Activity を作成します。このアクティビティは、指定した構成オプションに応じて、ウィジェットの作成時または後で、アプリ ウィジェット ホストによって自動的に起動されます。
構成アクティビティを宣言する
設定アクティビティを Android マニフェスト ファイルの通常のアクティビティとして宣言します。アプリ ウィジェット ホストが ACTION_APPWIDGET_CONFIGURE アクションで起動するため、アクティビティがこのインテントを受け入れるようにする必要があります。次に例を示します。
<activity android:name=".ExampleAppWidgetConfigurationActivity">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
</intent-filter>
</activity>
android:configure 属性を使用して、AppWidgetProviderInfo.xml ファイルでアクティビティを宣言します。詳しくは、このファイルの宣言をご覧ください。構成アクティビティを宣言する方法の例を次に示します。
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
...
android:configure="com.example.android.ExampleAppWidgetConfigurationActivity"
... >
</appwidget-provider>
ランチャーはパッケージ範囲の外から参照するため、アクティビティは完全修飾名前空間を使用して宣言されています。
設定アクティビティを開始するにあたって必要な作業は以上です。次に、実際のアクティビティを実装する必要があります。
構成アクティビティを実装する
アクティビティを実装する際は、次の 2 つの重要な点に注意してください。
- アプリ ウィジェット ホストが設定アクティビティを呼び出し、設定アクティビティが常に結果を返すようにします。結果には、アクティビティを起動したインテントから渡されたアプリ ウィジェット ID(インテントのエクストラに
EXTRA_APPWIDGET_IDとして保存される)が含まれている必要があります。- 設定アクティビティが起動されたときにシステムから
ACTION_APPWIDGET_UPDATEブロードキャストは送信されません。つまり、ウィジェットが作成されたときに、ウィジェットの更新が最初に呼び出されることはありません。ウィジェットを初めて作成するときにGlanceAppWidgetに更新をリクエストするのは、設定アクティビティの責任です。ただし、以降のサイクルでは更新が自動的にトリガーされます。
- 設定アクティビティが起動されたときにシステムから
設定から結果を返して Glance ウィジェットを更新する方法の例として、次のセクションのコード スニペットをご覧ください。
設定アクティビティからウィジェットを更新する
ウィジェットで設定アクティビティを使用する場合、設定完了時にウィジェットを更新することはアクティビティの責任です。これを行うには、GlanceAppWidget インスタンスから直接手動更新をトリガーします。
ウィジェットを適切に更新して設定アクティビティを閉じる手順の概要は以下のとおりです。
アクティビティを起動したインテントからアプリ ウィジェット ID を取得します。
val appWidgetId = intent?.extras?.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID ) ?: AppWidgetManager.INVALID_APPWIDGET_IDアクティビティの結果を
RESULT_CANCELEDに設定します。このようにすると、ユーザーが最後まで完了する前にアクティビティを停止した場合、設定がキャンセルされたことがアプリ ウィジェット ホストに通知され、ホストがウィジェットを追加しないようになります。
val resultValue = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(Activity.RESULT_CANCELED, resultValue)ユーザーの好みに合わせてウィジェットを構成します(選択内容を永続的な Datastore やローカル データベースに書き込むなど)。
構成が完了したら、プラットフォーム ウィジェット ID に対応する
GlanceIdを取得します。val glanceAppWidgetManager = GlanceAppWidgetManager(context) val glanceId = glanceAppWidgetManager.getGlanceIdBy(appWidgetId)GlanceAppWidgetインスタンスでupdatesuspend 関数を呼び出して、ウィジェットのコンテンツを更新します。// Update the GlanceAppWidget directly ExampleGlanceWidget().update(context, glanceId)返すインテントを作成し、アクティビティの結果で設定してから、アクティビティを終了します。
val resultValue = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(Activity.RESULT_OK, resultValue) finish()
ウィジェットの構成オプション
デフォルトでは、アプリ ウィジェット ホストは、ユーザーがアプリ ウィジェットをホーム画面に追加した直後に、設定アクティビティを 1 回だけ起動します。ただし、ユーザーが既存のウィジェットを再設定したり、デフォルトのウィジェット構成を指定して初期ウィジェット構成をスキップしたりできるようにするオプションを指定できます。
配置したウィジェットをユーザーが再設定できるようにする
ユーザーが既存のウィジェットを再設定できるようにするには、appwidget-provider の widgetFeatures 属性で reconfigurable フラグを指定します。次に例を示します。
<appwidget-provider
android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
android:widgetFeatures="reconfigurable">
</appwidget-provider>
ユーザーは、ウィジェットを長押しして、図 1 の 1 のラベルが付いた [再設定] ボタンをタップすることで、ウィジェットを再設定できます。
ウィジェットのデフォルト設定を使用する
ユーザーが初期設定の手順をスキップできるようにすることで、よりシームレスなウィジェット エクスペリエンスを提供できます。そのためには、widgetFeatures フィールドで configuration_optional フラグと reconfigurable フラグの両方を指定します。これにより、ユーザーがウィジェットを追加した後の設定アクティビティの起動が省略されます。前述のとおり、ユーザーは後でウィジェットを再設定できます。たとえば、時計ウィジェットでは初期設定を省略して、デフォルトでデバイスのタイムゾーンを表示できます。
構成アクティビティを再構成可能かつオプションとしてマークする方法の例を次に示します。
<appwidget-provider
android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
android:widgetFeatures="reconfigurable|configuration_optional">
</appwidget-provider>