ブロードキャスト レシーバーでハッシュ テーブルを維持したいと考えています。現在、BroadcastReceiver のライフサイクルを理解していれば、メンバー変数を一掃して殺される可能性があります。BroadcastReceiver での onReceive の前回の実行からハッシュ テーブルを取得するための理想的な戦略は何でしょうか?
5 に答える
を使用するには 2 つの方法がありますが、BroadcastReceiver
どちらを使用しているかを示していません。
他のコンポーネントによって登録された受信者用の 1 つ - のようなActivity
- via registerReceiver()
。このレシーバーは、登録されている限り存続するため、そのデータは複数のonReceive()
呼び出しに対応する場合があります。レシーバーを登録したコンポーネントは、データの永続化を担当します。
もう 1 つは、受信者をマニフェストに登録することです。これらは、cdonner の回答で引用された一節によると、1 回のonReceive()
呼び出しで消えます。レシーバーは、データベース、フラット ファイルなどにデータ自体を永続化する必要があります。
考えられる解決策の 1 つは、このマップを静的にすることです。マニフェストに登録されたレシーバーは一度に 1 つしかないため、これは問題ないようです。
static HashMap<String> hashMap;
static {
hashMap.put("key1","string1");
}
同じトリックを使用して、ハンドラーを登録し、レシーバーからフィードバックを受け取ることができます。
Androidリファレンスから:
BroadcastReceiver オブジェクトは、onReceive(Context, Intent) への呼び出しの間のみ有効です。コードがこの関数から戻ると、システムはオブジェクトが終了し、アクティブではなくなったと見なします。
あなたがやりたいことがうまくいくようには聞こえません。受信者を登録するアクティビティは、これを処理する必要があります。そうしないと、ハッシュ テーブルをデータベースに永続化することができます。
あなたの最善の戦略は、データベースを使用して、メモリ内マップの代わりにテーブルにデータを格納することです。
そうすれば、ユーザーが電話の電源を切ってから再び電源を入れても、以前の通話のデータは引き続き利用できます。
データを Object クラスにダウンキャストしてから、必要なクラスオブジェクトにアップキャストします:-)
public void onReceive(Context context, Intent intent) {
HashMap map = (HashMap) bundle.get("KEY");
Object[] data=map.get(mapKey);
XXXX xxxx=data[0];
//...
}