私は基本的に私の質問を要約するこの本当に古い投稿を見つけました:
https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QsSjuB62Kow
そのスレッドの結果 (hackbod/mark/romain の回答) は、バージョン 1.5 より前では発生しなかったという OP のメモを考えると、私にはやや満足のいくものではないようです。
長いものと短いもの:
Activity starts service.
finish is called on Activity.
Application's memory allocation remains constant
(despite views being garbage collected either eventually or manually)
これを取り上げる理由。
ブロードキャスト レシーバーを介してブート時に開始されるサービスがあり、約 5 MB を使用します。
アクティビティが開始されると、メモリ割り当てが 40MB に跳ね上がります (多くのビューが進行しているので、これは予想されることです)。アクティビティは終了し、サービスは引き続き実行されます (設計による)。メモリ割り当ては依然として高く、これは問題だと思います。
このアクティビティでは、すべてをヌル化しonDestroy
、すべてのビューと配列を反復処理してヌル化しますSystem.gc()
(はい、それが示唆していることはわかっています)、GC を強制することも、デバイスの空きメモリの合計を 20% 未満にするためにできるだけ多くのアプリを開くことも、この割り当てには何もしません。 . 活動の痕跡が残っていないにもかかわらず (MAT で多くの時間を費やした)、40MB で一定のままです。
この割り当てを 40MB から 5MB に下げるにはどうすればよいですか? それとも、これは単に Android のやり方ではないのでしょうか?
コンテキストまたはオブジェクトがアクティビティからサービスなどに漏れないようにするために、私は極端な手段を講じました(実際、共有設定を除いて、どちらにも参照はありません)。元の投稿の非常に基本的な例を見れば、状況を明らかにするのに役立つと思います。
サービスをアクティビティから分離し、サービスまたはアクティビティのみを実行し、両方を同時に実行しない場合、メモリ割り当ては予測可能です。サービスが 5MB を超えることはなく、アクティビティが 35MB を超えることもありません。また、いずれかの onDestroy が呼び出されると、メモリはそれぞれに割り当てられたものとして表示されなくなります。
Android 2.3 と 4.x の両方で同じ動作を確認しました。
ここで何か基本的なことが抜けているのかもしれません。あるいは、これは単なるばかげた質問かもしれません。