Androidのアクティビティの管理方法がわかりません。Androidのアクティビティがランダムに作成され、破棄される
私は一度の私は私のアプリがバックグラウンドに入るとき、気づいていながら、中の活動とを持っている、現在の活動は、(たとえばActivity3)であるものは何でもアンドロイド破棄および他のいくつかのシングルトンやオブジェクトなどのthatsの罰金。問題は、アプリが再開された直後に、アンドロイドがアクティビティやオブジェクトをメモリなどで破壊してから、アンドロイドがアプリを完全に再起動するということです。アクティビティ1からすべてのオブジェクトとデータメンバーが適切に初期化されます。
NOT SO!
すべてこれだけの時間私のアプリが再開されたとき、Activity3が再作成され、のonCreateが、(それがActivity2から呼ばれた)は初めてだったのと同じパラメータで呼び出されているようですシングルトンなどのオブジェクトは、アクティビティ1およびで初期化されました。アクティビティ2はデフォルト値で再作成され、役に立たなくなりました。
これはどのように安全なポリシー/手法ですか?どうやってアンドロイドはオブジェクトやアクティビティをランダムに破壊することができますか?そして、ユーザーが最近のアクティビティでonCreateを呼び出すだけで、すべてが大事になると期待しては正しいスタートアップ手順/初期化を実行する必要はありませんか?
UPDATE/SOLUTIONその優れた情報のためのコメント主に
感謝。アンドロイドマニュアルに従って
のonCreate
バンドル:アクティビティが以前にシャットダウンされた後に再初期化されている場合、このバンドルは、それが最近onSaveInstanceState(バンドル)に供給されたデータが含まれています。注:それ以外の場合はnullです。
したがって、私がやったことは、2つのフラグを設定することです。 onSaveInstanceStateをバンドルに入れて、それが私によって設定された有効なバンドルであることを確認してください。クラスそのものの中でがを作成したかどうかを確認するには、レクリエーションまたはの自動回転のために呼び出されました。したがって、のonCreateの場合、onSaveInstanceStateがnullでないかどうかを確認し、バンドルフラグをチェックしてbInit(デフォルトはfalse)をチェックします。両方のフラグが真であれば、アンドロイドがダンプされ、アプリのメモリが破壊されたことを意味します。リニアスタイルのアプリケーションですべてが初期化されることを確実にする最も安全な方法は、それを再起動して開始アクティビティを開始することです。
public class SomeMiddleActivity extends AppCompatActivity
{
private static boolean bInit = false; // only way it will be false again is if android cleared our memory and we are recreating
@Override
public void onSaveInstanceState(Bundle state)
{
// set a flag so that onCreate knows this is valid
state.putBoolean("StateSaved", true);
super.onSaveInstanceState(state);
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
// this must be called first always for some reason
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
if (savedInstanceState.getBoolean("StateSaved", false) && !bInit)
{
// we were recreated... start app over
Intent intent = new Intent(getApplicationContext(), Startup.class);
startActivity(intent);
finish();
return;
}
}
bInit = true; // this will stay true until android has cleared our memory
.......
}
これまでのところこれまではうまくいきましたが、誰かが別の提案をしてくれれば教えてください。私はこれについて別の記事を掲載します。
とFYI:onSaveInstanceState(バンドル、PersistableBundle)onSaveInstanceStateのバージョンは、これまでと呼ばれることはありませんので、私は、彼らもそれを実装する理由を知りません。 (?)
@goldenb @Rishabh洞察のためにgoldenbとRishabhに感謝します。
あなたのタイトルから 'SOLVED'を削除し、適切として発見ソリューションを投稿してください答え(つまり、与えられた答えの1つと正確に同じでない場合)。 – usr2564301
投稿する場所?.... – zdanman
"Your Answer"と表示された大きな空のボックスに、以下のソリューションがあります。 – usr2564301