Вам нужно будет прочитать исходный код, но это, скорее всего, из-за следующего.
setType(), setData() и setDataAndType() работают только в одном поле данных. Фактически поле представляет собой состав двух полей, типа и данных. Где тип занимает одну часть, а данные - другую. Итак, скажем, поле 16 бит, введите верхние 8 бит, данные - младшие 8 бит.
SetType() может сделать операцию так:
field = (type & 0x0F) << 8;
Как вы можете видеть, это полностью перезаписывает поле. Так что независимо от того, что было раньше, оно теперь содержит только информацию о типе.
УстановитьДанные может сделать операцию так:
field = data & 0x0F;
Как вы можете видеть, это тоже полностью перезаписывает поле.
setDataAndType(), то должен сделать что-то вроде:
field = ((type & 0x0F) << 8) || (data & 0x0F);
Хотя это тоже полностью перезаписывает поле, это позволяет устанавливать данные и тип в одном вызове.
Относительно того, почему вещи так, как они - вероятно, одна из двух причин:
- Обратная совместимость. setType и setData были написаны, не предвидя, что кто-то может захотеть сделать оба одновременно (или даже быть прецедентом для этого). Когда-то в будущем это требование или прецедент изменились. Однако приложения уже писали, полагаясь на это поведение. Таким образом, чтобы не нарушать их, они вводили новый метод, а не перегружали существующие.
- Это лучше. setType() и setData() были преднамеренно разработаны, чтобы быть разрушительными, чтобы помешать пользователям случайно писать ошибки, которые трудно отследить и понять. Таким образом, кто-то не мог вызвать setType(), а затем указать несовместимые данные с помощью setData(), чтобы URI работал в одном контексте по строке, но неожиданно неожиданно появился позже. Вместо этого интерфейс заставляет пользователей быть явным о том, чего они хотят.
невероятный ответ. спасибо – eBoody
За исключением ни 'Data', ни' Type' не являются битовыми полями. «Данные» - это строка символов URI, возможно, 2000 символов. Также «дополнительные» не очищаются: http://stackoverflow.com/questions/4116110/clearing-intent. – ebyrob