3

私はそれを簡単にします。ウィジェットコードがあります。私のウィジェット レイアウトには、1 つのボタンを含む線形レイアウトが含まれています。私のウィジェット コードでは、いくつかの値を含む文字列リストを初期化します。ウィジェットのボタンをクリックすると、リストをいくつかの値で更新する必要があります。

だから、これは私のコードです、

List<String> myList = null;
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
myList = new List<String>();
myList.add("1");
myList.add("2");
...
Intent intent = new Intent(context, getClass());
intent.setAction("CALL_UPDATE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
....
}

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("CALL_UPDATE")) {
        Toast.makeText(context, "Intent received"+myList , 2000).show();
    }
}

ボタンがクリックされると、ブロードキャストは onReceive() によって正しく受信されます。問題は、onReceive() で、一部の文字列オブジェクトが以前に追加されたため、リストに一部の値ではなく null が表示されることです。

誰でも助けることができますか?

どうも!ラフル。

4

1 に答える 1

2

ドキュメントによると:

これは、onReceive(Context、Intent)実装で実行できることに重要な影響を及ぼします。非同期操作を処理するために関数から戻る必要があるため、非同期操作を必要とするものは利用できませんが、その時点でBroadcastReceiverはもはやアクティブではないため、システムは非同期操作が完了する前にプロセスを自由に強制終了できます。

特に、 BroadcastReceiver内からダイアログを表示したりサービスにバインドしたりすることはできません。前者の場合は、代わりにNotificationManagerAPIを使用する必要があります。後者の場合、Context.startService()を使用してコマンドをサービスに送信できます。

と:

onReceive()は通常、そのプロセスのメインスレッド内で呼び出されるため、長時間実行する操作を実行しないでください(レシーバーがブロックされ、候補が強制終了されると見なされる前に、システムが許可する10秒のタイムアウトがあります) )。onReceive()の実装でポップアップダイアログを起動することはできません。

編集
AppWidgetProviderはでありBroadcastReceiver、そのインスタンス(およびそのフィールド)はlifcycleの後に削除されます。HomeScreenでウィジェットの新しいインスタンスを作成するonUpdateonReceive、AppWidgetProviderが呼び出され、AppWidgetProviderのこのインスタンスのリストはnullではありません。 onReceive(たとえば、10秒)このインスタンスは削除されます。ボタンをクリックすると、AppWidgetProviderの2番目のインスタンスが作成され、そのリストはnullになります。
クラスのリストpublic static fieldを保存して、必要なときに取得できます。

于 2012-08-18T18:04:09.077 に答える