1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Activityを保持しない場合のonActivityResult

Posted at

はじめに

Activityを保持しない場合も動作するように修正しようとしたら、ハマってしまい苦労したので備忘録として書きます。

Intentで他のアプリを起動した場合など、Activityがバックグラウンドに移動した時にメモリが足らなくなると、
もともと起動していたアプリ(Activity)を終了してメモリを確保するみたいです。
この時、アプリが復帰する動作が通常とは異なる動きをするので注意が必要です。
ただ、裏ですごいリッチでグラフィカルなゲームを起動してるとか、動かしてるアプリがめちゃめちゃメモリ喰うとか、端末が古くてすごい非力な場合とかの少し特殊な場合でしか起こり得ないことなので気づきにくいかもしれません。

結論

onActivityResultとonStartの呼び出し順が変わるので注意!!

再現方法

開発者向けオプションから「アクティビティを保持しない」の項目をONにすることで、Activityがバックグラウンドに移動した場合に常に終了するようにできます。

ライフサイクル

Activityを保持する/しないの両方共動くようにしようとしたら、思ったように動かせなくてActivityのライフサイクルの動作を確認したら次のようになっていました。

Activityを保持する場合(通常動作)

onCreate
→ onStart
→ onResume
→ (アプリを操作、startActivityForResult)
→ onPause
→ onStop
→ (Intentで他のアプリを起動) ※ここまでは一緒
onActivityResult
onStart
→ onResume

Activityを保持しない場合

onCreate
→ onStart
→ onResume
→ (アプリを操作、startActivityForResult)
→ onPause
→ onStop
→ (Intentで他のアプリを起動) ※ここまでは一緒
→ onDestroy
→ onCreate
onStart
onActivityResult
→ onResume

上記の両者を比較すれば分かると思いますが、
onStartとonActivityResultの順番が変わっています。

Activityを保持しないのでonDestroyとonCreateが増えるのは想定通りでしたが、ライフサイクルの実行順が変わるのは想定外でした。
(ライフサイクルをちゃんと理解できていないだけ?)
とりあえずonStartで設定する内容は気をつけないといけない。。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?