スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Contextとは?

2010年12月27日 22:14

AndroidでActivityの起動とかで
引数とかにContextを指定する機会が非常に多い。

たとえば、別画面の起動
(thisのみでも良いですけど、場所によって何のthis?ってなるから明確にアクティブ名を指定してます。) メッセージボックスを表示する とかの第一引数で、Contextを渡している。

また、コンテキストを取得するのには
thisとgetApplicationContext()がある。
どっち使えばいいの?この二つの違いは?ってのを個人的に調べてみた。
(間違ってるところありましたら教えてください。)

・Contextとは?
まずコンテキストとは何ぞや?ってところから調べてみた。
googleのドキュメントから抜粋(http://developer.android.com/intl/ja/reference/android/content/Context.html)

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

要約すると、
  • アプリケーションの環境情報とかをグローバル(Android OSの全域)で受け渡しするためのインターフェース
  • アクティビティの起動とかブロードキャスト、インテントの受け取りといった他のアプリからの応答を行え、アンドロイド特有のリソース・クラスにアクセスすることも出来る。
アプリ全体の状態を持っていて、何から起動されたかどういう状態か、何にアクセスしようとしているか、といった情報を受け渡すために使っている。ということでいいのかも。

http://magpad.jugem.jp/?eid=197
この参考サイトを見ると、Contextがアプリ全体の情報を統括してるって感じがわかる。

・Application or Activity
なぜContextを渡すのかについては、アプリの状態を受け渡すため~みたいな認識で良いとして・・・
ContextにはActivity Applicationって2つのContextがある。

ActivityのContextを取得するには、(Activityを継承してるクラスで)thisを呼ぶ。
ApplicationのContextを取得するには、getApplicationContext()を呼ぶということで合ってるかな?

2つのContextの違いは
http://stackoverflow.com/questions/1026973/android-whats-the-difference-between-the-various-methods-to-get-a-context
の書き込みを参考にしたんだけど。。。

要するに、 Application Contextはアプリケーションに関連していて、アプリケーションのライフサイクルに関わらず同じContextオブジェクトとなっていること。それに反して、Activity ContextはActivityに関連していて、Activityが破棄される時(画面が回転するなどといったときに簡単に破棄される)、Contextオブジェクトも同様に何度でも破棄されて何度でも作られる。ということだろうか。

では、どっちを使えば良いのか?ということだが…
http://achch362.blog112.fc2.com/blog-entry-6.htmlを参考にしたところ。
情報として持っている物は、変わらないみたいですね。
好きなほうを使っても、取得できるものは変わらないから、これはこれですっきり?


・メモリリークに気をつける
http://www.textdrop.net/soft/android-avoiding-memory-leaks/
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
http://d.hatena.ne.jp/androidzaurus/20090121

これらの参考サイトで、メモリリークする理由が書いてあります。また、2つのContextの違いを推測した参考サイトでもあるんだけど・・・

ActivityのContextは、ライフサイクルにより破棄されたり作られたりする。っと上で、説明したがもしContextを参照するものを静的な変数にしていたら、メモリリークが発生する可能性がある。


このコード例では、 静的変数のsBackgroundはTextViewへの参照を保持している。 また、 で、textView自身もContextへの参照を持っている。

GCは、参照されているものがあるとメモリを開放してくれない。 だから、Contextオブジェクトが新しいContextオブジェクトを作っても古いContextにも参照が残ったままなのでメモリ開放されずリークしてしまう。こういう場合は、ライフサイクルによらないgetApplicationContextを利用したほうがいい。
(メモリリークの詳細は、上記リンクを参照してください。)


・結論
う~ん・・・
ここまで、調べたけど全体的にgetApplicationContextのほうを使ったほうが良さそうな気がする。ActivityのContextは、どういうときに使えば便利なのだろうか?ライフサイクル内で完結できるような場合には、Activityのほうがいいのか。ただ、よくわからず、取得できる情報も大差ないならgetApplicationContextを使ったほうが良いだろう。っという結論になった。(3日ぐらいがんばったのに、こんな結論でいいのだろうか?)


コメント

  1. | |

    承認待ちコメント

    このコメントは管理者の承認待ちです

  2. | |

    承認待ちコメント

    このコメントは管理者の承認待ちです

コメントの投稿

(コメント編集・削除に必要)
(管理者にだけ表示を許可する)

トラックバック

この記事のトラックバックURL
http://individualmemo.blog104.fc2.com/tb.php/41-2c6d3c6c
この記事へのトラックバック



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。