注解&反射Android-Activity间传值

通过注解&反射实现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();
                }
            }
        }
    }
}

  

posted @ 2020-11-03 17:28  黑冰台  阅读(351)  评论(0)    收藏  举报