通过注解&反射实现Android两个Activity间传值,不在Activity中使用getXXXExtra()
1.在Activity中的应用
//传值Activity
public class RejectFirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reject_first);
Intent intent = new Intent(this, RejectSecondActivity.class);
intent.putExtra("name", "Jake");
intent.putExtra("num", 1);
intent.putExtra("contain", true);
startActivity(intent);
}
}
//接收Activity
public class RejectSecondActivity extends AppCompatActivity {
//不设定注解值,直接通过属性名获取
@AutoWired
private String name;
@AutoWired(value = "num")
private int num;
//注解值和属性名不一样,去掉注解,将得到默认值false
@AutoWired(value = "contain")
private boolean contained;
private static final String TAG = "feng";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reject_second);
InjectUtils.injectExtra(this);
Log.d(TAG, "onCreate: name = " + name);
Log.d(TAG, "onCreate: num = " + num);
Log.d(TAG, "onCreate: contained = " + contained);
}
}
2.注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoWired {
String value() default "";
}
3.反射
public class InjectUtils {
public static void injectExtra(Activity activity) {
Class extends Activity> clazz = activity.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if (field.isAnnotationPresent(AutoWired.class)) {
AutoWired annotation = field.getAnnotation(AutoWired.class);
String value = annotation.value();
if (value == null || "".equals(value)) {
value = field.getName();
}
Object result = null;
Class> type = field.getType();
if (type == String.class) {
result = activity.getIntent().getStringExtra(value);
} else if (type == int.class || type == Integer.class) {
result = activity.getIntent().getIntExtra(value, 0);
} else if (type == boolean.class || type == Boolean.class) {
result = activity.getIntent().getBooleanExtra(value, false);
} else {
//Todo 其他类型,暂不处理
}
field.setAccessible(true);
try {
field.set(activity, result);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
本文分享 CNBlog - 黑冰台。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。