web-dev-qa-db-ja.com

Android Applicationクラスを使用してデータを永続化する

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

109
Dave

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.

私はそれを議論します 私のブログ投稿で 、「Global Singleton」セクションの下。

132
Bryan Denny

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

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

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

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

UPDATE:

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

57
Vit Khudenko

アクティビティの外部の「グローバルシングルトン」にアクセスし、関連するすべてのオブジェクトに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();
}

ただし、コンテキスト参照を メモリリークを回避する に渡すときは注意してください。

6
saxos

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

2
Andrew

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

1
Grantland Chew

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

0
Ashish Jaiswal