Application

アプリケーションの開始から終了まで、永続的にデータを保持していたい場合、Activityのメンバに持っていても、Activityは常に破棄される可能性があるので、その時にデータも消えてしまう・・・。

Application | Android Developers

Applicationクラスなら、開始から終了まで永続的にデータを保持できる・・・。

activity_main.xmlに、

Buttonを1つ・・・。

strings.xmlで、

Button1とする・・・。

f:id:BG1:20170107135527p:plain

Classを追加・・・。

f:id:BG1:20170107135549p:plain

Applicationの派生クラスCustomApplication・・・。

アプリケーションが永続的に保持する独自メンバappCountを0に初期化し、onCreate時やonTerminate時に値を表示・・・。
外のクラスからもアクセスできるようにsetAppCountやgetAppCountを定義・・・。

MainActivity.javaでは、

Button1を押したら、SubActivityを起動するようにしている・・・。

で、SubActivity.javaは、

SubActivityのみで有効なsubCountを0に初期化して、onCreate時にsubCountの値を表示してから1増やす・・・。
そのあと、CustomApplicationメンバオブジェクトcustomAppをgetApplicationで取得し、getAppCountで取得した値を表示してから、1増やしてsetAppCountでcustomAppにセットする・・・。

onDestroyの時にもsubCount、appCountともに表示する・・・。

あとは、

android:name=".CustomApplication"とすることで、独自のCustomApplicationが使われるようになる・・・。

実行すると、

f:id:BG1:20170107141854p:plain

これはCustomApplicationのonCreate時のappCountの値・・・。
アプリケーションの開始とともに、appCountが0・・・。

Button1を押すと、

f:id:BG1:20170107142116p:plain

SubActivityが起動・・・。
subCountが0・・・。

f:id:BG1:20170107142259p:plain

appCountも0・・・。

しかし、このあとどちらの値もインクリメントされている・・・。
バックキーで戻ると、

f:id:BG1:20170107142519p:plain

subCountが1に・・・。

f:id:BG1:20170107142610p:plain

appCountが1に・・・。
また、Button1を押してみると・・・。

f:id:BG1:20170107142709p:plain

破棄されたSubActivityを改めて再生成してるので、subCountは0・・・。

f:id:BG1:20170107142924p:plain

appCountは破棄されていないCustomApplicationオブジェクトから取得しているので1・・・。

またバックキーを押すと、

f:id:BG1:20170107143210p:plain

subCountは1、

f:id:BG1:20170107143246p:plain

appCountは2となる・・・。

戻ったときにはSubActivityは破棄されるので、何度やってもsubCountは2以上にはならない・・・。
一方、appCountはアプリケーションが終了するまで、SubActivityを起動するたびに1増えていく・・・。

ちなみにButton1を表示しているMainActivityの状態からバックキーでアプリケーションを終了しても、

f:id:BG1:20170107143614p:plain

onTerminate時のappCountが表示されない・・・。

baroqueworksdevの日記: Application#onTerminate()がコールされない

どうも実際にはonTerminateは呼ばれない模様・・・。

Sample/android/Application/Application/src/Application at master · bg1bgst333/Sample · GitHub