2

を拡張するクラスがありますandroid.app.Application。これを使用して、アプリケーションのグローバル状態を永続化します。

アプリの起動時にサービスを開始したいので、このGlobalStateクラスのコンストラクター内でインテントを作成してサービスを開始しようとしましたが、取得できずにインテントを作成できませんContext

public GlobalState() {
    Log.d(this.getClass().getSimpleName(), "Initialise DatabaseManager");
    dbManager = new DatabaseManager(this);

    Log.d(this.getClass().getSimpleName(), "Requesting start up of ContactsUpdater Service");
    Intent i = new Intent(this, ContactsUpdater.class);
    startService(i);
}

を使用してみましgetApplicationContext()たが、これは null ポインター例外をスローします。

java.lang.NullPointerException at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) at android.content.ComponentName.(ComponentName.java:75) at android.content.Intent.(Intent.java:2551) at com .jameselsey.apps.cercademi.domain.GlobalState.(GlobalState.java:48) で java.lang.Class.newInstanceImpl(Native Method) で java.lang.Class.newInstance(Class.java:1479) で android.app. Instrumentation.newApplication(Instrumentation.java:957) で android.app.Instrumentation.newApplication(Instrumentation.java:942) で android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:518)

私は混乱しています、私はDatabaseManagerこれを使用して罰金を作成できます..

何か案は?

4

3 に答える 3

3

Activity、Service、ContentProvider、および Application については、コンストラクターで何もしないでください。オブジェクトが初期化され、使用できる状態になっていることがわかっている場合、最初に行うべき作業は onCreate() です。

さらに、「アプリケーションの起動時にサービスを開始したい」ということをもう一度考えてみてください。ここでコードが行っていることは、プロセスがたまたま開始されたときにサービスを開始しようとしていることです。私は本当にあなたがそれを望んでいないと思います。たまたまバックグラウンドでブロードキャストを受信したので、このサービスを開始しますか?

初めての init だけを行いたい場合は、Application をまったく使用しないことをお勧めします。必要なときに取得できるシングルトンを用意します。次に、実際に必要な時点で init が発生します。これをサービスに関連付ける必要はありません。スレッドを作成するだけです。Service を使用する唯一の理由は、システムに「私のアプリは、ユーザーが気にかけているバックグラウンド作業で忙しいので、私を殺さないようにしてください」と伝えることです。

于 2011-06-26T03:26:51.310 に答える
1

グローバルなアプリケーションの状態を維持する必要がある人のための基本クラス。AndroidManifest.xml の <application> タグでその名前を指定することにより、独自の実装を提供できます。これにより、アプリケーション/パッケージのプロセスが作成されるときに、そのクラスがインスタンス化されます。

ソース: http://developer.android.com/reference/android/app/Application.html

10 分の 4 の確率で、Android 開発者の強制終了の問題は、Android マニフェストの変更を忘れていることです。(私は完全にその統計をでっち上げました)。

ApplicationextendsContextなので、渡すことができるはずです。

ただし、アプリケーションを拡張することは、これを行うための最もリソース効率の良い方法ではありません。より簡潔に説明するために、同じページからの別の引用を次に示します。

通常、Application をサブクラス化する必要はありません。ほとんどの場合、静的シングルトンは、よりモジュール化された方法で同じ機能を提供できます。シングルトンにグローバル コンテキストが必要な場合 (ブロードキャスト レシーバーを登録する場合など)、それを取得する関数に、シングルトンを最初に構築するときに Context.getApplicationContext() を内部的に使用する Context を指定できます。

于 2011-06-26T03:38:50.160 に答える
0

ではonCreate()、必ず に電話してくださいsuper.onCreate()

于 2011-06-26T01:55:06.280 に答える