112

私はかなり複雑な Android アプリケーションに取り組んでおり、そのアプリケーションに関するデータがかなり大量に必要です (合計で約 500 KB です。これはモバイル デバイスとしては大きいのでしょうか?)。私が知る限り、アプリケーション (より正確には、アクティビティ) で向きを変更すると、アクティビティが完全に破壊され、再作成されます。私の調査結果によると、Application クラスには同じライフサイクルはありません (つまり、すべての意図と目的のために、常にインスタンス化されます)。状態情報をアプリケーション クラス内に格納し、Activity から参照することは理にかなっていますか?それとも、モバイル デバイスのメモリの制約により、一般的に「受け入れられる」方法ではありませんか? このトピックに関するアドバイスをいただければ幸いです。ありがとう!

4

7 に答える 7

134

500kbは大したことないと思います。

あなたが説明したことは、アクティビティでデータを失うという問題に私がどのように取り組んだかです. Application クラスにグローバル シングルトンを作成し、使用したアクティビティからアクセスできました。

頻繁に使用される場合は、グローバル シングルトンでデータを渡すことができます。

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

次に、任意のアクティビティで次のように呼び出します。

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

これについては、ブログ記事の「グローバル シングルトン」セクションで説明しています。

于 2010-11-17T20:41:02.070 に答える
58

Applicationインスタンスを頼りにする人は間違っています。Application最初は、アプリ プロセス全体が存在する限り が存在するように見えるかもしれませんが、これは間違った仮定です。

OS は、必要に応じてプロセスを強制終了することがあります。すべてのプロセスは、ドキュメントで指定されている5 つのレベルの「killability」に分けられます。

したがって、たとえば、ユーザーが着信に応答したためにアプリがバックグラウンドになった場合、RAM の状態によっては、OS がプロセスを強制終了する (プロセスApplication内のインスタンスを破棄する) 場合があります。 .

より良いアプローチは、データを内部ストレージ ファイルに保存し、アクティビティが再開されたときにそれを読み取ることだと思います。

アップデート:

多くの否定的なフィードバックを受け取ったので、説明を追加する時が来ました。:) まあ、最初は、状態がアプリにとって本当に重要であるという間違った仮定を実際に使用しました。ただし、状態が失われることがある (再読み取り/再ダウンロードされるだけの画像である可能性があります) ことがアプリで問題ない場合は、アプリを のメンバーとして保持しても問題ありませんApplication

于 2010-11-17T21:35:19.693 に答える
6

アクティビティの外部で「グローバル シングルトン」にアクセスしたいがContext、関連するすべてのオブジェクトを通過させてシングルトンを取得したくない場合は、アプリケーション クラスで静的属性を定義するだけで、次への参照を保持できます。自体。onCreate()メソッドで属性を初期化するだけです。

例えば:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

のサブクラスApplicationもリソースを取得できるため、次のように、それらを返す静的メソッドを定義するときに簡単にアクセスできます。

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

ただし、メモリ リークを避けるために Context 参照を渡すときは十分に注意してください。

于 2010-11-17T21:36:00.597 に答える
2

デイブ、それはどんな種類のデータですか?アプリケーション全体に関連する一般的なデータ(例:ユーザーデータ)の場合は、Applicationクラスを拡張してそこに保存します。データがアクティビティに関連する場合は、onSaveInstanceStateハンドラーとonRestoreInstanceStateハンドラーを使用して、画面の回転時にデータを永続化する必要があります。

于 2010-11-17T22:03:47.773 に答える
1

実際に方向機能をオーバーライドして、アクティビティが破棄されたり再作成されたりしないようにすることができます。ここを見てください。

于 2010-11-17T20:51:15.937 に答える
0

アプリケーションクラスを作成し、その呼び出しにすべてのデータを保存して、アプリケーションのどこでも使用できます。

于 2015-07-03T12:17:30.990 に答える