1

アプリケーションのユーザーに関する慎重な情報を格納するシングルトンがあります。現時点では、ユーザーのログインとユーザーの場所が保存されています。

1)場所はサービスを介して検出されます。現在、サービスは私のシングルトンを直接参照して、経度と緯度を詰め込んでいます。代わりに、BroadcastReceiverを使用して、シングルトンが聞いて値を更新するために使用するブロードキャストを送信したいと思います。

ただし、BroadcastReceiverを登録するには、シングルトンにコンテキストが必要です。私が望んでいることを達成するための最も巧妙な方法は何ですか。BroadcastReceiverはおそらく適切なオブジェクトではありませんか?

2)また、シングルトンを使用することでどのような問題が発生しますか?Androidはいつでもこのメモリを再利用する可能性があると思います(これは明らかに悪いことです)。どうすればそれを防ぐことができますか?アプリケーションのコンテキストを渡し、それをメンバー変数に格納することで、これを阻止できますか?

Androidのドキュメントには次のように記載されています。「しかし、静的なライフサイクルは十分に制御できません。したがって、ライフサイクルモデルに従うために、アプリケーションクラスはonCreate()およびonTerminate()でこれらの静的オブジェクトを開始および破棄する必要があります。 )アプリケーションクラスのメソッド」ですが、これを実現する方法が完全にはわかりません。

4

1 に答える 1

6

ただし、BroadcastReceiverを登録するには、シングルトンにコンテキストが必要です。私が望んでいることを達成するための最も巧妙な方法は何ですか。BroadcastReceiverはおそらく適切なオブジェクトではありませんか?

「最も巧妙な方法」は、あなたがしていることをしないことです。、、、または多分BroadcastReceiverからのみ登録してください。、、、またはが破棄された場合は、これを登録解除する必要があります。ActivityServiceApplicationBroadcastReceiverActivityServiceApplication

Androidはいつでもこのメモリを再利用する可能性があると思います(これは明らかに悪いことです)。どうすればそれを防ぐことができますか?

あなたはそうしない。Androidは、いつでもプロセスを終了する権利を留保します(たとえば、メモリを再利用するため)。Android 2.1以前のタスクキラーは、いつでもプロセスを終了します。アプリケーションのすべてのコンポーネントが破棄されると、Androidはいつでもプロセスをリサイクルし、同時にヒープをクリアする可能性があります。等々。

失ってもかまわないものだけをメモリに入れてください。

「アプリケーション」は、モノリシックエンティティではなく、緩く結合されたコンポーネントのバスケットと考えるのが最善です。

アプリケーションのコンテキストを渡し、それをメンバー変数に格納することで、これを阻止できますか?

いいえ。

Androidのドキュメントには次のように記載されています。「しかし、静的なライフサイクルは十分に制御できません。したがって、ライフサイクルモデルに従うために、アプリケーションクラスはonCreate()およびonTerminate()でこれらの静的オブジェクトを開始および破棄する必要があります。 )アプリケーションクラスのメソッド」ですが、これを実現する方法が完全にはわかりません。

のサブクラスを作成し、要素の属性をApplication介して、Androidがそれを使用する必要があることをマニフェストに示します。android:name<application>

于 2010-09-17T16:27:05.403 に答える