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の電源を突然切ると呼び出されると思いますが、ここでは何もわかりません。これまでのところ、その部分の解決策は見つかりませんでした.
コメントや、私が現在行っていることよりも簡単なことは大歓迎です。ありがとう。