19

ここに Android の初心者がいます。Android アプリの最初の起動時に実行したいコードがいくつかあります。ローカル データベースのバージョンを確認し、現在のバージョンが古い場合は新しいバージョンをダウンロードします。私は最初のアクティビティの oncreate にそれを貼り付けてきましたが、これを配置するより良い場所があるはずです。起動時に一度呼び出される場所に置くことができる場所の推奨事項はありますか?

4

2 に答える 2

38

カスタム Application クラスを作成できます (android.app.Application から拡張)。onCreateアプリケーションの起動時に何が起こるかを指定するためにオーバーライドします。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Do something here.
    }
}

次に、カスタム クラスをマニフェスト ファイルに登録する必要があります。

<application ... android:name="fully.qualified.MyApplication">

編集:

David Cesarino への返答として、私はApplicationクラスの目的に同意しません。に依存している場合、それがさまざまな目的ActivityonCreate同じ巨大なクラスになるのを防ぐにはどうすればよいでしょうか...アプリケーションの起動時に何かを行う必要がある場合は、そのコードをどこかに記述する必要があります。また、特定のロジックもActivity実行する必要があるため、おそらくより雑然とします。Activity混乱が心配な場合は、ロジックを他のクラスに分けて、Application. を使用しSharedPreferencesてロジックを実行するかどうかを決定することは、既に解決されている問題の回避策のように思えます。

ダイアン・ハックボーンは論理ではなくデータに言及しているようで、私は完全に同意します。静的変数は、アプリケーション レベルの変数よりもはるかに優れています。より優れたスコープと型の安全性により、保守性と読みやすさが大幅に向上します。

于 2012-07-21T17:13:16.417 に答える
4

まず、アクティビティのライフサイクルを確認します。

あなたの質問に答えると、あなたが何をしたいかに応じて、そして最も重要なのはいつそれをトリガーしたいかに応じて、それらの「スタートアップ」メソッドのいずれかにコードを入れることができます。あなたが尋ねたことについてonCreateは、合理的な場所です。

私は最初の活動のoncreateにそれを固執してきました、これを置くためのより良い場所がなければならないことはかなり確かです。

なんで?どのコードにもエントリポイントがありますよね?Androidアクティビティでは、たまたまそうなっていますonCreate(詳細については、上記のリンクを参照してください)。呼び出しのメインシーケンスの外で発生するイベントへの応答であるイベント処理に加えて、に何かを入れますonCreate

メソッドが巨大になることを心配しているなら、それは別の問題です。私はあなたのコードをよりよく抽象化すると言います。予備的なものをチェックするために、人々は通常、アプリのメインアクティビティを開始する前に「読み込み中」アクティビティを提供します。

編集:

私のコメントは「単なるコメント」になるように複雑になり始めたので、これはdrumboogが提案したもののフォローアップです。

個人的には、コードを早い段階で実行するという唯一の理由でクラスを拡張することは避けたいと思いApplicationます。つまり、優先順位がそれほど高くないコード(データベースのバージョン管理)です。このApplicationクラスは主に、「すべてを行う」方法としてではなく、'ies間で状態を永続化する簡単な方法として使用されます。Activity要するに、私はApplicationクラスが一般的に虐待されていると感じています。

あなたが望むもののために、あなたは完全にその呼び出しコードをで達成することができますActivity onCreate。それが雑多なコード目的の巨大なクラスになるまで人々が詰め込むのを見たので、それは複雑さを減らします。Applicationそして、それはそれ自身の論理的な問題で、メンテナンスのためのノーノーです。

さらに、UIと完全に関連付けられていない別のソリューションが本当に必要な場合は、Service代わりに実装することを検討する必要があります(ただし、それだけでは必要ないと思います)。

これらの懸念は両方とも、以前はDianne Hackborn(または彼女のメッセージから得たもの)によって対処されていました。

于 2012-07-21T17:07:44.863 に答える