FC2ブログ

AndroidのIntentの引数

thisとgetApplicationContext()の違いって何?

Intentのコンストラクタで

Intent i =
    new Intent( this, xxxxx.class );


って、書かれたサンプルもあれば、

Intent i =
    new Intent( getApplicationContext(), xxxxx.class );


って、書かれたサンプルも有り、その違いが良く分からない・・・。


とりあえず、情報を集めてみる。


いずれもActivityを継承したクラス内での記述で、
Activityの継承関係は、
Object <- Context <- ContextWrapper
    <- ContextThemeWrapper <- Activity
となっているから、thisはContextそのものになる。

getApplicationContext()は、
Contextクラスでabstract宣言していて、
ContextWrapperクラスで、下記のようにOverrideしている。

public Context getApplicationContext() {
    return mBase.getApplicationContext();
}


mBaseもContextで、ContextWrapperクラスのコンストラクタか、
ContextWrapperのattachBaseContext()メソッドで設定している。

mBaseに設定しているContextの出所は分からないけど、
実際デバッガで追いかけてみると、
thisとgetApplicationContext()は異なっていた。
# mBaseは、thisでは無い。


Intentのコンストラクタを見たとき、

Intent i =
    new Intent( packageContext, cls );


という書き方は、

Intent i = new Intent( );
i.setComponent(
    new ComponentName( packageContext, cls ) );


に等しい。

ComponentNameのコンストラクタは、こんな感じ。
(mPackageは、String)

public ComponentName(Context pkg, Class cls) {
    mPackage = pkg.getPackageName();
    mClass = cls.getName();
}




なんとなく見えて来た気がする。


this.getPackageName();


と、

this.getApplicationContext().getPackageName();


って、実は同じなんじゃないかな?(同じアプリ内の話だし)


実際、デバッガで確認してみると同じでした^^

ってことは、thisで指定しても、
getApplicationContext()で指定しても同じってことで、
違いが無いというなら、それはそれでスッキリ!

スポンサーサイト



検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR