5

ConfigurationActivity を持つウィジェットを実装しており、Eclair(2.1) との互換性を維持する必要があります。

AppWidgetProviders メソッドに関するドキュメントonUpdateは、次のことが明確に記載されています。

... .ただし、構成アクティビティを宣言した場合、このメソッドは、ユーザーがアプリ ウィジェットを追加するときに呼び出されませんが、その後の更新のために呼び出されます。構成が完了したときに最初の更新を実行するのは、構成アクティビティの役割です。(以下の「アプリ ウィジェット構成アクティビティの作成」を参照してください。)

残念ながら、これは真実ではありません (少なくとも JellyBean を搭載した私の Nexus S では)。実際、ConfigurationActivity トリガーのonUpdateに呼び出されます。他の電話でも同様の動作があるかどうか、およびプロバイダー内での通話を防ぐことができるかどうかを知りたいですか? onCreateonUpdate

私の回避策は、その特定の AppWidgetId を使用して、WidgetConfigurationActivity 内の SharedPreferences にフラグを格納することです。そこにない場合は、ConfigurationActivity が最初に呼び出されていないと推測できます。これは機能しますが、私の観点では本当に醜いです。onUpdateトリガーを防ぐことができない場合、より良い解決策はありますか?

4

3 に答える 3

4

はい、ホーム画面にウィジェットを追加すると onUpdate() が呼び出されます。ここを参照してください:

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

http://developer.android.com/reference/android/appwidget/AppWidgetManager.html#ACTION_APPWIDGET_UPDATE

ウィジェットの作成時にトリガーしない方法があるかどうかはわかりません。ただし、Widget Info XML ファイルの「updatePeriodMillis」フィールドを0に設定するか、空白のままにすることで、再度トリガーされないようにすることができます。

別の方法は、ウィジェット ID をどこかに保存することです。新しいウィジェットが追加されるたびに、Receiver クラスで、ID が既に存在するかどうかを確認します。存在しない (新しいウィジェットを意味する) 場合は、コードを実行しないでください。また、ウィジェットが削除されるたびに、レコードからウィジェット ID を削除します。ウィジェットを削除した可能性があるため、後で古いウィジェットと同じ ID を持つ新しいウィジェットを追加しました。

それが役立つことを願っています!

編集: Receiver クラスの onReceive() メソッドで、次のようにします。

public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    if( appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID )
    {
        super.onReceive(context, intent);
    }

}

ウィジェットがウィジェット リストから最初に選択されたとき、その appWidgetId は、ホーム画面に追加されるまで INVALID_APPWIDGET_ID と等しくなります。"super.onReceive()" は、ウィジェットが選択されたときに onUpdate() メソッドを呼び出すため、onUpdate() が初めて呼び出されることはありません。

于 2012-08-05T19:02:00.900 に答える