AndroidのnavigateUpToについて

Activityの`navigateUpTo`とNavUtilsの`navigateUpTo`の違いが分からなくて調べたまとめです。

# ActivityのnavigateUpTo
https://developer.android.com/reference/android/app/Activity.html#navigateUpTo

intentで指定されたアクティビティに移動し、アクティビティを閉じる
Android 4.1で追加された。

以下、`Activity.java`にある`navigateUpTo`のコード。

```java
// Activity.java

    public boolean navigateUpTo(Intent upIntent) {
        if (mParent == null) {
            ComponentName destInfo = upIntent.getComponent();
            if (destInfo == null) {
                destInfo = upIntent.resolveActivity(getPackageManager());
                if (destInfo == null) {
                    return false;
                }
                upIntent = new Intent(upIntent);
                upIntent.setComponent(destInfo);
            }
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (resultData != null) {
                resultData.prepareToLeaveProcess(this);
            }
            try {
                upIntent.prepareToLeaveProcess(this);
                return ActivityManagerNative.getDefault().navigateUpTo(mToken, upIntent,
                        resultCode, resultData);
            } catch (RemoteException e) {
                return false;
            }
        } else {
            return mParent.navigateUpToFromChild(this, upIntent);
        }
    }

    public boolean navigateUpToFromChild(Activity child, Intent upIntent) {
        return navigateUpTo(upIntent);
    }

```

# NavUtilsのnavigateUpTo
https://developer.android.com/reference/android/support/v4/app/NavUtils.html#navigateUpTo

そもそも、`NavUtils`とはAndroidのUIナビゲーションパターンを実装するためのクラス。
Support Packageに含まれているので、Android 1.6から使用することができる。
Android 4.1以降ではActivityのメソッドになっている。


以下、`NavUtils`の`navigateUpTo`のコード

```java
// NavUtils.java

    private static final NavUtilsImpl IMPL;
 
    static {
        final int version = android.os.Build.VERSION.SDK_INT;
        if (version >= 16) {
            IMPL = new NavUtilsImplJB();
        } else {
            IMPL = new NavUtilsImplBase();
        }
    }

    public static void navigateUpTo(Activity sourceActivity, Intent upIntent) {
        IMPL.navigateUpTo(sourceActivity, upIntent);
    }

    static class NavUtilsImplBase implements NavUtilsImpl {
        @Override
        public void navigateUpTo(Activity activity, Intent upIntent) {
            upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            activity.startActivity(upIntent);
            activity.finish();
        }
    }

    static class NavUtilsImplJB extends NavUtilsImplBase {
        @Override
        public void navigateUpTo(Activity activity, Intent upIntent) {
            NavUtilsJB.navigateUpTo(activity, upIntent);
        }
    }
```

```java
// NavUtilsJB.java

    public static void navigateUpTo(Activity activity, Intent upIntent) {
        activity.navigateUpTo(upIntent);
    }
```

# まとめ
APIレベル16以降(Android4.1以降)なら`NavUtils`の`navigateUpTo`はactivityの`navigateUpTo`を使用しています。
それより前のAPIレベルはintentのfragに`FLAG_ACTIVITY_CLEAR_TOP`を追加してstartActivityを実行し、finisしているのがコードから分かります。

Android4.1以降のみをサポートするなら、`Activity`の`navigateUpTo`を使用で良いのかなと思います。