Up-Navigationの遷移先の決定方法について
以下の質問で回答が得られないのでこちらでも質問させてください。
https://stackoverflow.com/questions/27767657/android-up-navigation-targetting
前提条件:画面
- ActivityA(Aa) : Activity
- ActivityB(Ab) : ViewPagerをもつActivity
- ActivityC(Ac) : URI schemeをもつActivity (myapp://foo)
- ActivityD(Ad) : Activity
- FragmentA(Fa) : ViewPager item 1
- FragmentB(Fb) : ViewPager item 2
- FragmentC(Fc) : ViewPager item 3
前提条件:画面遷移
Aa → Ab(Fa) → Ac : パターン1
↓↑
Ab(Fb) → Ad
↓↑
Ab(Fc) → Ac : パターン1
Notification → Ac : パターン2
外部アプリ → Ac : パターン2
質問:AcからUp-Navigationで遷移する画面について
パターン1の場合
遷移先を判別するための一般的な方法はあるのでしょうか?
現在の実装では以下のように遷移元を判別する値を渡しています。
しかし、Up-Navigationの対象画面が確定できない場合全てにおいてこのようなコードを書くのは冗長に感じます。
/* ActivityC.java */
public static void launch(Context context, String from) {
Intent intent = new Intent(context, ActivityC.class);
// from : ViewPagerの各アイテムごとにユニークな値
intent.putExtra(EXTRA_FROM, from);
context.startActivity(intent);
}
パターン2の場合
Up-Navigationの遷移先の判別方法は以下のようにしているのですが、本来はどのように
実装されるべきなのでしょうか?
ViewPager内やURI Schemeから遷移する画面が多い場合には以下の様なコードが増えてしまいます。
/* ActivityC.java */
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (!getIntent().hasExtra(EXTRA_FROM)) {
// NotificationかURI Scheme経由で遷移してきたとみなす
// Ab(Fa) かAb(Fc)のどっちに遷移するか分からないからAb(Fa)へ固定で
Intent upIntent = ActivityB.createIntent(this, null);
TaskStackBuilder.create(this)
.addNextIntent(ActivityA.createIntent(this))
.addNextIntent(upIntent)
.startActivities();
finish();
} else {
// このアプリ内から遷移してきたとみなす
String from = getIntent().getStringExtra(EXTRA_FROM);
Intent upIntent = ActivityB.createIntent(this, from);
NavUtils.navigateUpTo(this, upIntent);
}
}
return true;
}
質問に至った背景
当初はAndroidManifest.xmlに書くだけだから楽だと思っていたのですが、現実ではこのような画面遷移パターンに遭遇することが多く、ベストプラクティスはないのかと思い質問しました。