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?