Activity跳转最佳实践

Activity跳转最佳实践

学习Android-CleanArchitecture时, 注意到它用了一个Navigator类统一管理Activity跳转, 统一管理的好处相信不用我多说, 让我们一起来学习一个.

传统写法

跳转不需要参数时:

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

跳转需要参数那就是

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("key","someValue");
startActivity(intent);

这样写可能会发生一不小心写错了key, 或者传递的数据需要修改时, 改动的地方较多. 而统一使用一个类控制, 会干净舒服很多.

干净的写法

SecondActivity中定义静态方法

public static Intent getCallingIntent(Context context){
    Intent callingIntent = new Intent(context, SecondActivity.class);
    return callingIntent;
}

创建Navigator类, 控制跳转

public enum Navigator {

    INSTANCE;
    
    public void navigateToSecond(Context context){
        if(context != null){
            Intent callingIntent = SecondActivity.getCallingIntent(context);
            context.startActivity(callingIntent);
        }
    }
}

Tips: 此处使用枚举实现单例, 枚举实现单例是单例的最佳实践, 参见What is an efficient way to implement a singleton pattern in Java?, 或者看Effective Java第三条

调用方式:

Navigator.INSTANCE.navigateToSecond(this);

同理, 如果是需要传值, SecondActivity中:

private static String EXTRA_KEY = "key";

public static Intent getCallingIntent(Context context, String value){
    Intent callingIntent = new Intent(context, SecondActivity.class);
    callingIntent.putExtra(EXTRA_KEY, value);
    return callingIntent;
}

将extra的key与需要该值的Activity写在一起, 而不是与跳转逻辑写在一起, 减少出错的可能.

Navigator改为

public enum Navigator {
    INSTANCE;
    public void navigateToSecond(Context context, String value){
        if(context != null){
            Intent callingIntent = SecondActivity.getCallingIntent(context, value);
            context.startActivity(callingIntent);
        }
    }
}

总结

这样的写法将Activity跳转逻辑抽取了出来, 减少了人为犯错的可能, 还是值得大家在项目中实际使用的.

参考链接

Android-CleanArchitecture Navigator.java

What is an efficient way to implement a singleton pattern in Java?

你可能感兴趣的:(Activity跳转最佳实践)