public void store(Context context, Bundle outState) {
    synchronized (this) {
      List<State> list = mSaveStates.get(context);
      if (list == null) return;

      for (State state : list) {
        Class<?> type = state.field.getType();
        Dispatcher dispatcher;
        if (Parcelable.class.isAssignableFrom(type))
          dispatcher = sDispatchers.get(Parcelable.class);
        else if (Parcelable[].class.isAssignableFrom(type))
          dispatcher = sDispatchers.get(Parcelable[].class);
        else if (Serializable.class.isAssignableFrom(type))
          dispatcher = sDispatchers.get(Serializable.class);
        else if (SparseArray.class.isAssignableFrom(type))
          dispatcher = sDispatchers.get(SparseArray.class);
        else dispatcher = sDispatchers.get(type);

        if (dispatcher == null) throw new ProvisionException("Unsupported type: " + type.getName());

        Object value = InjectorUtils.getField(state.receiver, state.field);
        dispatcher.dispatch(outState, key(state.receiver, state.field), value);
      }
    }
  }
  private void restore(Context context, Object receiver, Field field) {
    Bundle bundle = mSavedStateBundles.get(context);
    if (bundle == null) return;

    Object value = bundle.get(key(receiver, field));
    if (value == null) return;

    InjectorUtils.setField(receiver, field, value);
  }
  public void registerSavedStateBundle(Context context, Bundle bundle) {
    synchronized (this) {
      mSavedStateBundles.put(context, bundle);
      List<State> list = mSaveStates.get(context);
      if (list == null) return;

      for (State state : list) {
        Object value = bundle.get(key(state.receiver, state.field));
        if (value == null && state.field.getType().isPrimitive()) continue;

        InjectorUtils.setField(state.receiver, state.field, value);
      }
    }
  }