2013年4月26日金曜日

onNewIntent()

android.app.Activityクラス
protected void onNewIntent(Intent intent)
startActivity()を呼んだときに、これはlaunchModeに"simgleTop"と設定したアクティビティへ、あるいはFLAG_ACTIVITY_SINGLE_TOPフラグをつかったクライアント、呼ばれる。
onNewIntent()はアクティビティを再起動するために使用されたIntentとともに既存のインスタンス上で呼び出される。
アクティビティは常に新しいインテントを受信する前に一時停止されるので、このメソッドの後にonResume()が呼ばれることを期待できる。
getIntent()はまだオリジナルのインテントを返すことに注意せよ。setInent()で新しいインテントに更新することができる。
引数
intent アクティビティに向けてスタートさせられた新しいアクティビティ

startActivity()で新しいアクティビティが作られるのではなく既存のアクティビティが使われる場合にこのメソッドが呼ばれる。
AndroidManifest.xmlのactivity要素のlaunchMode属性の値によって、新しいアクティビティのインスタンスが作られてインテントを処理するのか、既存のアクティビティがインテントを処理するのかが決まる。
リファレンスのメソッドの説明では"singleTop"しか書かれていないが、singleTaskとsingleInstanceの場合もこのメソッドが呼ばれる場合がある。
下記の参考ページで非常にわかりやすく説明されている。

本に載っていたTwitterクライアントでは、launchModeはsingleInstanceになっていた。
アプリの動きは
WebViewでTwitterの認証画面を表示
->認証に通ったら"myapp://mainactivity"というURLデータを持ったIntentがこのクライアントに投げられる(startActivity()が呼ばれる)。
->このクライアントのインスタンスのonNewIntent()が投げられたIntentを処理する。
となっていると推測している。
#きちんと調べてないので推測でしかない。

AndroidManifest.xmlのactivity要素。
<activity>
android:label="@string/app_name"
android:name=".Twinto"
android:launchMode="singleInstance" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="mainactivity" />
</intent-filter>
</activity>
デバッグログの出力
xx-xx xx:xx:xx.xxx: V/TEST(xxx): onNewIntent():action=android.intent.action.VIEW,category=[android.intent.category.BROWSABLE],uri=myapp://mainactivity?oauth_token=xxxxxxxxxx&oauth_verifier=xxxxxxxxxx

0 件のコメント:

コメントを投稿