Androidのクラスには、Contextを引数に取るものが非常に多い・・・。
Contextは、アプリケーション情報をあるクラスから他のクラスへ渡して共有するための仕組み・・・。
そして、Activityや、Service、後述するApplicationクラスも、Contextの派生クラスである・・・。
なので、基本的にContextを要求された時は、thisや、Activity、Serviceなどのオブジェクト自身そのものを渡せばいい・・・。
これまでもやってきたように、ToastはContextオブジェクトを要求するが、thisを渡してみる・・・。
activity_main.xmlには、
1列目にbutton1、2列目にbutton2とbutton3を置く・・・。
strings.xmlには、
button1は"StartActivity"、button2は"StartService"、button3は"StopService"と表示・・・。
SubActivity.javaを追加し、
TextViewで"SubActivity!"と表示するとともに、Toastでthis.toStringでthisの中身を表示する・・・。
thisはSubActivityオブジェクトであり、Contextの継承なので第1引数に渡すことができる・・・。第2引数で中身を見てみる・・・。
SubService.javaを追加・・・
onCreate時に、ここでもthis.toStringで中身をToast表示している・・・。
MainActivityは、
このActivityのthisもonCreateでToast表示している・・・。
そしてbutton1を押すとSubActivityを起動、button2を押すとSubServiceを起動、button3を押すとSubServiceを停止・・・。
Intentのコンストラクタ引数にもthisをそのまま指定している・・・。
AndroidManifest.xmlに、
SubActivityとSubServiceを追加するのを忘れずに・・・。
起動すると、
こんな風にToast表示・・・。
StartActivityを押すと、
SubActivityが起動・・・。
いったんバックキーでMainActivityに戻ってから、再びStartActivityを押すと、
"@"のあとの数値が違うことがわかる・・・。
これは、最初のSubActivityオブジェクトと、2回目のSubActivityオブジェクトは違うものであるということ・・・。
まあ、最初のSubActivityは破棄されているので、当然のことなのだが・・・。
つまり、渡すContextはオブジェクトインスタンスの型も違えば(MainActivityとSubActivity)、前回のオブジェクトとも違うことがあるということである・・・。
これも当然なのだが・・・。
しかし、Toastは問題なく呼べる・・・。
最初のStartServiceで、
出てくる"@"のあとの数値と、いったんStopServiceで停止してから、再度StartServiceしたあとの、
この"@"のあとの数値も違っている・・・。
しかし、ServiceからもToastは呼べている・・・。
Contextに入っている情報は基本的にはServiceでもActivityでも違いがないので、いろいろなオブジェクト間で共有できる・・・。
ただし、ActivityやServiceはライフサイクルがあるので、いつでもうまくいくというわけではないことに注意・・・。
Yukiの枝折: Android:引数はthisか?getApplicationContextか?ActivityとApplicationの違い
メモリリークの問題などがあるので、DBやPreferencesなどの永続的データの場合はApplicationが持つgetApplicationContextのほうがいいらしい・・・。
(Contextの問題は非常に難しい・・・。たびたび触れるかもしれないが、全然自信ない・・・。)
Sample/android/Context/Context/src/Context at master · bg1bgst333/Sample · GitHub