5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidのnavigateUpToについて

Posted at

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

ActivityのnavigateUpTo

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

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

// 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

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

以下、NavUtilsnavigateUpToのコード

// 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);
        }
    }
// NavUtilsJB.java

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

まとめ

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

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?