Android開発のメモ

今回は気付いた点のメモで、しかもあまりよく分かっていない。
このためAndroid開発者に何らかのヒントを与えるかもしれないが、誤った情報を与えるかもしれない。

伝統的なライフサイクル


Androidの伝統的なライフサイクルだと、Activityは次のような流れになるらしい。

Activity#onCreate(Bundle savedInstanceState)

Activity#onStart()

Activity#onPostCreate()

Activity#onResume()

Activity#onPostResume()

アクティビティの稼働

画面回転などをすると、またActivity#onCreate()からやり直す。
ただし最初の起動時Bundle savedInstanceStateはnullだが、画面回転時は非nullとなるため区別可能で、これをみて初期化方法を変えることができる。

現状はonCreate()の動きがおかしい


今回、AndroidStudioで作り直すにあたりTabLayoutを使うためAppCompatActivityを用いたが、その影響かは不明ながら従来と動きが違う。
まず画面回転をさせても、AppCompatActivity#onCreate()は呼ばれないようだ。

加えて、Intentで他のAppCompatActivityな別画面を呼び出したあと、□ボタンを押しアプリを強制終了させ、再度アプリを起動させると、更に問題が生じる。
なぜかAppCompatActivity#onCreate(Bundle savedInstanceState)のBundle savedInstanceStateが非nullであり、つまり何かが残っている。

savedInstanceStateはあまり深く考えたことがないので、アプリ再起動でなぜ非nullになるのか、なぜ前回のなにかが残ってしまうのかは全く分からないのだが、結果として非nullなので非null=画面回転とみなすと確実に誤動作してくれるし、状態遷移が乱れるので画面表示もおかしくなるしで、きわめてありがたくない。

ということで、onCreate()の呼び出され方や、Bundleが従来と違い期待通りにはなっていないことがわかった。onCreate()内の処理方法は全体的に見直さないといけないようだ。


今後のメモ


画面回転でonCreate()が呼ばれないのであれば、画面作成はonCreate()にこだわる理由がない。
onCreate()内で重い処理するとANRが発生しやすいし、new Thread()… とか連ねるのもいかがなものかとは思っていた。
なので、処理はまとめてonStart()またはonResume()に移動させた方が良いのかもしれない。
どちらの方が良いのかは今後考える。


追記 (H30/7/13)


android:configChanges="orientation|screenSize" があると画面回転してもonCreate()は走らない、というコメントをいただいたので、削って試してみた。
Eclipseの時にはあってもonCreate()が走っていた気がしたが何かが違っていたのかもしれない。
これで画面回転でもonCreate()が動くことを確認したが、これは副次的な発見であって、今回の目的は別にこれではない。

次に、ロングタップして物販報告の選択画面などを開き(別Activity)、□ボタンからアプリを終了させ、アイコンタップでアプリを再起動させたところ、これでもなおonCreate()のBundleが非nullで起動する現象は再現していた。

どこに原因があるのかさっぱり分からないが、アプリ起動時すらBundleが非nullになるという前提で処理を組んでいかねばならないのは間違いがないようだ。

2018/07/12(木)20:59 |Comments(2) |Trackback(0)

製造開発 | ソフトウェア開発 | コンピュータ | [編集]

▲ページトップ

コメント

通常、画面回転時は Activity が再生成されますが、
AndroidManifest.xml の activity 定義で
android:configChanges="orientation|screenSize"
などといった指定をしたActivityは、回転させても再生成されません。
そのため onCreate が呼ばれないのかと思います。
(代わりに onConfigurationChanged が呼ばれます。)

onSaveInstanceState で保存されたデータがあるときだけ呼ばれる onRestoreInstanceState もあり、そちらに復元処理を書くこともできます。

"~□ボタンを押しアプリを強制終了させ~" はどういう操作かよくわかってませんが、バックグラウンドに行っただけではないのでしょうか?
・アプリ履歴一覧から横にスライドさせて消し、開き直す
・アプリを開いた状態から 戻るキー で閉じ、開き直す
などの場合は null になるように思います。
2018/07/12(木)23:06 | | URL |編集
▲ページトップ

古いEclipse版アプリも作り始めが3年くらい前となり今ひとつ記憶が曖昧なのですが、Eclipse版でもAndroidManifest.xmlにも同じく
android:configChanges="orientation|screenSize"
とありました。
動作が変化する理由は分かりませんが、この設定を削ることも検討してみたいと思います。

□ボタンを押したあと、当然ですがスライドしてアプリを終了させています。
終了させているのに次回起動時Bundleがnullになっていないため、このメモを書きました。
分かりませんが、Activityが作り直されない設定では、システムのどこかに残ってしまうのかもしれません。
2018/07/13(金)09:11 |未来情報産業 | URL |編集
▲ページトップ

コメントの投稿

ICカードこれひとつの抜本的な仕様変更 ホーム 「電子マネーのチャージ機」という業態
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

08 | 2018/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterマストドン

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR