2

Androidアプリケーション内でmain()関数(メソッドではなく関数)に相当する方法をどこでも検索しましたが、失敗しました...

通常、私がやりたいことは次のとおりです。

void main()
{
    // do some really nice initialisations stuff here

    // ... let the app does his life, I really don't care

    // do some final stuff here before leaving
}

これまでに見た中で最も近い方法は、SplashScreen を使用して OnCreate() メソッドをオーバーライドすることです。問題は、私の観点からは受け入れられないことです。なんで?SplashScreen は LAUNCHER としてタグ付けされたアクティビティに他ならないためです。

これにより、アプリ リストに表示されます。これは、アプリ ウィジェットを開発するときに望ましくありません。さらに、アプリが破棄される直前にコードを配置する場所は? onDestroy() メソッドで? いいえ、繰り返しますが、これは信頼できません。Android は、アプリケーションがまだ実行されている間にインスタンスを削除することを決定できます。

実際、私はアプリのすべてのコンポーネントが同じプロセスで実行されていることを原則としています。コンポーネントを独自のプロセスで実行したくないことをマニフェストで明示的に言及していないからです。

アプリ ウィジェットの場合、onUpdate() メソッドの最初の呼び出しに初期化コードを配置しました。良い賭けだと思います。次に、このアプリ ウィジェット (より正確には AppWidgetProvider) が、任意のアクティビティを任意に起動する役割を果たします。

すべてのアプリの「データベース」は、次のように個別のシングルトンで定義されます。

public class MyDataBase {

    public static MyDataBase getInstance() {
        if (instance_ == null)
            instance_ = new DataBase();
        return instance_;
    }

    public void load();
    public void save();

    static MyDataBase instance_ = null;

    public int myInt;
    public String myString;
    public Object myObject;
    etc..
}

このシングルトンでは、少なくとも、そのライフサイクルはアプリ自体と同じです。

その AppWidgetProvider に戻るには、少しトリックを行う必要があります。実際、Android はそのインスタンスを削除することを決定できますが、他のいくつかのアクティビティがまだ実行されており、プロセスがまだ実行されています。たとえば、OnUpdate() の最初の呼び出しでデータベースを体系的にロードすることは不要でやり過ぎです。私がしているのは、このプロセスのライフサイクルでデータベースがロードされたかどうかを示す静的ブール値を持つことです。したがって、AppWidgetProvider は、Singleton DataBase が存続している限り (プロセスが) 何度もインスタンス化される可能性があり、DataBase を毎回リロードすることはありません。(はい、明確にするのは難しいです...)

アプリのクリーンアップ コードについては、DataBase Singleton の finalize() メソッドをオーバーライドすることを考えましたが、このメソッドの呼び出しの瞬間がまったく予測できないため、それが良いアイデアかどうかはわかりません。Androidの電源を突然切ると呼び出されると思いますが、ここでは何もわかりません。これまでのところ、その部分の解決策は見つかりませんでした.

コメントや、私が現在行っていることよりも簡単なことは大歓迎です。ありがとう。

4

3 に答える 3

6

onResume() は、アプリを起動する前に常に到達する関数であるため、「メイン」コードを onCreate() メソッドまたは onResume() に配置できます。

onPause() は、ユーザーまたは OS によってアプリが破棄される前に常に呼び出されます。

Android のドキュメントには、ライフサイクルに関する優れた説明があります。

http://developer.android.com/training/basics/activity-lifecycle/starting.html

于 2013-01-20T11:03:47.010 に答える
3

初期化のために、クラスのonCreateメソッドをオーバーライドできます。Application

アプリケーションの開始時、アクティビティ、サービス、またはレシーバー オブジェクト (コンテンツ プロバイダーを除く) が作成される前に呼び出されます。この関数に費やされる時間は、プロセス内の最初のアクティビティ、サービス、またはレシーバーを開始するパフォーマンスに直接影響するため、実装はできるだけ迅速にする必要があります (状態の遅延初期化を使用するなど)。このメソッドをオーバーライドする場合は、必ず super.onCreate() を呼び出してください

終了の処理はより困難です。おそらく、アプリケーションの各コンポーネントを個別に監視する必要があります。API レベル 14 以降をターゲットにしている場合はApplication.registerActivityLifecycleCallbacks、これを支援するために を使用できます。

于 2013-01-20T14:46:54.527 に答える
0

これまでに見た中で最も近い方法は、SplashScreen を使用して OnCreate() メソッドをオーバーライドすることです。問題は、私の観点からは受け入れられないことです。なんで?SplashScreen は LAUNCHER としてタグ付けされたアクティビティに他ならないためです。

これは、Android が複数のアクティビティで形成されており、それらのアクティビティにはライフサイクルがあるためです。したがって、すべてのアクティビティは onCreate() から始まり、onDestroy() で終了します。 http://developer.android.com/training/basics/activity-lifecycle/starting.html

これにより、アプリ リストに表示されます。これは、アプリ ウィジェットを開発するときに望ましくありません。さらに、アプリが破棄される直前にコードを配置する場所は? onDestroy() メソッドで? いいえ、繰り返しますが、これは信頼できません。Android は、アプリケーションがまだ実行されている間にインスタンスを削除することを決定できます。

ユーザーがホーム ボタンを押してアプリを終了するシナリオでは、現在のアクティビティが onPause() メソッドを呼び出す可能性が高くなります (アクティビティに他に終了するプロセスがない場合のみ)。ただし、ユーザーが強制的にプロセスを終了してアプリケーション全体を閉じる (終了する) 場合。その後、Android 自体がアプリケーションに関連するものを自動的に閉じるため、メソッドの呼び出しなどについて心配する必要はありません。

その AppWidgetProvider に戻るには、少しトリックを行う必要があります。実際、Android はそのインスタンスを削除することを決定できますが、他のいくつかのアクティビティがまだ実行されており、プロセスがまだ実行されています。たとえば、OnUpdate() の最初の呼び出しでデータベースを体系的にロードすることは不要でやり過ぎです。私がしているのは、このプロセスのライフサイクルでデータベースがロードされたかどうかを示す静的ブール値を持つことです。したがって、AppWidgetProvider は、Singleton DataBase が存続している限り (プロセスが) 何度もインスタンス化される可能性があり、DataBase を毎回リロードすることはありません。(はい、明確にするのは難しいです...)

シングルトンデータベース接続について投稿した例は悪くないと思いますが、仕事をきれいかつ効果的に行うためのより良い方法があります。たとえば、休止状態フレームワークの接続プーリング

于 2013-01-20T11:19:10.243 に答える