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()で指定しても同じってことで、
違いが無いというなら、それはそれでスッキリ!

スポンサーサイト



onActivityResult()が呼ばれない (2)

onActivityResult()がCallBackされないコード

Intent intent = new Intent( this, NextActivity.class );
startActivityForResult( intent , -1 );



startActivity(Intent intent)のコードを覗いてみると、

public void startActivity(Intent intent) {
    startActivityForResult(intent, -1);
}


となっていて、
問題のコードはstartActivity()を呼び出しているのに等しかった。

で、startActivityForResult()のコードを辿っていくと、
Instrumentation.execStartActivity()の呼び出しが有る。

この戻り値は、

return requestCode >= 0 ? am.getResult() : null;


のようになっていて、
どうもActivityの実行結果を得ているみたい。

execStartActivity()の戻り値がnullで無い場合に、
ActivityThread.sendActivityResult()を呼び出していて、
名前からして、
これがonActivityResult()をCallBackするトリガーじゃないのかな?

requestCode は、startActivityForResult()の第二引数だから、
onActivityResult()がCallBackされるには、0以上で定義しなければ
ならないんだと思う。

最初は、Intentの第一引数の指定が誤っているんだと思ったけど、
startActivityForResult()の第二引数を0にしたら、
Intentの第一引数がthisでも、getApplicationContext()でも、
どちらもonActivityResult()が呼ばれた。


そうすると、
Intentの第一引数(Context)の存在が良く分からない・・・。
thisとgetApplicationContext()の使い分けってなんだろ?

onActivityResult()が呼ばれない

呼び元のActivityで下記のように記述したら、onActivityResult()呼ばれない。

Intent intent = new Intent( this, NextActivity.class );



Intentの作成を下記のようにしたら、呼ばれるようになった。

Intent intent = new Intent( getApplicationContext(), NextActivity.class );
startActivityForResult( intent , -1 );



詳しく調べてないけど、呼び元のActivityのカテゴリーがLAUNCHERでは無いからかな?



どうもデバッグ中に修正しながら確認したのがまずかった・・・。
コード修正が反映されていなかったっぽい。

intentの第一引数を getApplicationContext() にすることで解決はしていなくて、別の誤りだった。

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

この人とブロともになる

QRコード
QR