アプリにアクティビティAの開始アクティビティBがあります。アプリが停止し、Androidシステムのメモリが少なくなると、アプリはバックスタックからクリアされます。アプリを再度起動すると、アクティビティBのインスタンス化中に例外が発生します。したがって、メモリが不足しているときにアクティビティBが終了していることを確認したいので、例外は発生しません。onMemoryLow()にfinish()を入れてみましたが、うまくいきませんでした。他に何ができますか?
2 に答える
これはあなたの質問全体に答えないかもしれませんが、それでも役に立ちます。
最初に注意しなければならないことは、Android システム全体のメモリが不足しているときに onLowMemory() が呼び出されるということです。これはアプリやアクティビティとは関係ありません。したがって、メソッドをオーバーライドしても、Activity が確実に終了するわけではありません。
おそらく、アクティビティが Andorid システムのメモリ内にある場合 (つまり、onDestroy() が呼び出される前) で、onLowMemory() をオーバーライドしている場合、それが役に立ちます。しかし、それ以外にそれを行う可能性はありません。それ以外の場合は、アクティビティに入る前に必要な条件を確認する必要があります。
プロセスがバックグラウンドにある場合、Android は単にプロセスを強制終了します。ユーザーがアプリに戻ると、Android はプロセスを再作成し、アクティビティ スタックの一番上にあったアクティビティを再作成します。アクティビティをこのように実行できるようにプログラムする必要があります (つまり、再起動後に再作成されます)。これができない場合は、次の方法を試すことができます。
次のような静的変数を持つクラスを作成します。
public class Globals {
public static boolean initialized;
}
変数は、プロセスが作成 (または再作成) されるときにGlobals.initialized
値を持ちます。false
これで、依存ActivityA
するデータを設定するときに、次のように初期化フラグを設定できます。ActivityB
Globals.initialized = true;
でActivityB.onCreate()
の値を確認し、initialized
設定されていない場合は、次のように を呼び出すだけfinish()
で、ユーザーは に戻りますActivityA
。
if (!Globals.initialized) {
finish(); // Process was recreated while ActivityB was on top of the stack,
// so finish now
return;
}