1

同じユーザー ID (sharedUserId) と同じプロセスを共有する 2 つの Android アプリケーションを作成しました。最初のアプリでは、起動時に static int 変数を 1 に設定しました (デフォルトは 0 です)。2 番目のアプリでは、他のアプリから同じクラスを (リフレクションを使用して) 読み込み、静的 int 変数を読み取ります。0と読みました。

両方のアプリケーションが同じプロセスで実行されるため、同じ静的値を共有すると思いますか? その下のメカニズムが何をしているのか誰か教えてもらえますか?(おそらく、異なる apk/dex ローダーを使用しているため、この動作が発生しますか?)

4

2 に答える 2

1

答えはこれです....それは、クラスローダーがJavaであり、プロセスやアプリケーションではないことに関係しています。

Java 言語: クラスは、その完全修飾名によって識別されます Java 仮想マシン: クラス オブジェクトは、その完全修飾名とクラス ローダーの定義によって識別されます

同じクラスローダによってロードされたクラスのインスタンスは、確実に同じ静的変数を参照します。クラスローダは通常、その親クラスローダに委譲します。親がすでにクラスをロードしている場合、再度ロードすることはありません。この標準的な動作は、独自のクラス ローダーを作成することで変更できます。その結果、クラスローダーの階層はクラスを 1 回だけロードするため、静的変数を割り当てて静的ブロックを 1 回実行します。ただし、クラスローダーの階層が複数ある場合は、同じクラスを複数回ロードして、静的メンバーを複数回割り当てることができます。異なるクラスローダで定義された 2 つのクラスオブジェクトは、同じクラスファイルから生成されたものであっても、異なる型です。同じクラスローダーによってロードされたクラスのインスタンスは、同じ静的変数を認識します。

この投稿に答えてくれた Chris Matawa に感謝します: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/8-b5T1zYr-8

于 2012-12-30T08:49:40.170 に答える
0

しかし、特にビットマップに関しては、2 つの多くのリソースを消費します

静的変数を使用して異なるアプリケーション間で (または同じアプリケーションの異なるアクティビティ間でさえ) ビットマップを共有することは、メモリ リークの観点からは悪い考えです。例については、 http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/を参照してください。

リソースを節約する代わりに、静的変数を使用してアクティビティとアプリケーション間でデータとリソースを共有すると、状況が悪化します。これは、これらすべてが永久に (または、少なくとも長期間、必要がない場合でも) メモリに残るためです。もはや)しかしさらに、これらの静的なものは、隠された未知の参照のために、他の多くのものをもたらす可能性があります.

これは、Intents、SharedPreferences、またはデータベースのいずれかを使用してデータを渡し、リソースに関して必要なものをロードすることを各アクティビティに任せる必要がある理由です。

ロードに時間がかかる大きなリソースは、異なるアクティビティ間で共有されることがありますが、多くのメモリをリークしたくない場合は、使用するリソースに特に注意する必要があります。これは、どのモバイルでも常に貴重なものです。

于 2012-12-30T10:30:48.823 に答える