3

私は appwidget を作成していますが、システムがウィジェットのプロセスを強制終了し、後で再起動すると失われるクリック イベントに問題があります。これは、画面の回転後にも発生します。

SDK バージョン 7 に対してビルドし、エミュレーター (2.1) および 2.3.3 の実際のデバイスで実行します。

私の onUpdate メソッド:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int wid : appWidgetIds) {
        Log.i(TAG, "onUpdate widget #" + wid);

        Intent intent = new Intent(context, MyClass.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid);

        PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget);
        widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent);

        appWidgetManager.updateAppWidget(wid, widget);
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

ここで、R.id.widget_layout は appwidget の線形レイアウトの ID です。このクリックイベントをテキストビューにも追加しようとしましたが、同じ結果になりました。

私はこの問題を数日間戦っていますが、この同じ問題を抱えている人を見つけましたが、解決策はありません:(私は別の保留中のインテントフラグも試しましたが、成功しませんでした。

2番目の問題は、ホーム画面に別のappwidgetを追加すると、クリックイベントに反応しないことです。logcat で、onUpdate メソッドからのメッセージ「onUpdate widget #xy」が表示されますが、appwidget はクリックに反応しません。ホーム画面に配置された最初の appwidget のみがクリックに反応しますが、しばらくの間だけです。何か案は?

4

1 に答える 1

2

最初のウィジェットがクリックに反応しなくなったというのは、onUpdateメソッドが呼び出されていないということですか? おそらくonEnabled(Context context)、それが代わりに呼び出されているかどうかを確認するコードを入れて、そうであれば、その関数に必要なロジックを入れてください。また、onReceiveメソッド (同じリンクにあります) を介してインテントをキャッチして、ウィジェットが実際に受信しているインテントを確認することもできます。

また、Context実行中のレシーバー (この関数に渡されるもの) がアプリケーションまたはサービスであり、アクティビティではないことを確認してください。そうしないと、それへの参照が保持されない可能性があります。

また、ウィジェットをオブジェクトで更新するたびに、ウィジェットRemoteViewsを完全に再構築するために必要なすべてのデータを送信する必要があります。RemoteViewsこれは、たとえば画面の回転では、渡された最新のもの以外にウィジェットを再構築するものがシステムにないためです。

于 2011-04-13T20:24:30.927 に答える