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のメソッドになっている。
以下、NavUtils
のnavigateUpTo
のコード
// 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以降)ならNavUtils
のnavigateUpTo
はactivityのnavigateUpTo
を使用しています。
それより前のAPIレベルはintentのfragにFLAG_ACTIVITY_CLEAR_TOP
を追加してstartActivityを実行し、finisしているのがコードから分かります。
Android4.1以降のみをサポートするなら、Activity
のnavigateUpTo
を使用で良いのかなと思います。