2015-06-15 1 views
4

Я ответил this question о том, почему setType() и setData() не работают вместе. Я до сих пор не могу найти причин, почему. Логика ускользает от меня.Android: что касается намерений, почему setType() и setData() аннулируют друг друга?

Из документации: Intent Documentation

Чтобы установить только данные URI, вызовите УстановитьДанные(). Чтобы установить только тип MIME, вызовите setType(). При необходимости вы можете установить оба значения с помощью setDataAndType().

Внимание! Если вы хотите установить тип URI и MIME, не вызывайте setData() и setType(), потому что каждый из них аннулирует значение другого. Всегда используйте setDataAndType() для установки типа URI и MIME.

ответ

2

Вам нужно будет прочитать исходный код, но это, скорее всего, из-за следующего.

setType(), setData() и setDataAndType() работают только в одном поле данных. Фактически поле представляет собой состав двух полей, типа и данных. Где тип занимает одну часть, а данные - другую. Итак, скажем, поле 16 бит, введите верхние 8 бит, данные - младшие 8 бит.

SetType() может сделать операцию так:

field = (type & 0x0F) << 8; 

Как вы можете видеть, это полностью перезаписывает поле. Так что независимо от того, что было раньше, оно теперь содержит только информацию о типе.

УстановитьДанные может сделать операцию так:

field = data & 0x0F; 

Как вы можете видеть, это тоже полностью перезаписывает поле.

setDataAndType(), то должен сделать что-то вроде:

field = ((type & 0x0F) << 8) || (data & 0x0F); 

Хотя это тоже полностью перезаписывает поле, это позволяет устанавливать данные и тип в одном вызове.

Относительно того, почему вещи так, как они - вероятно, одна из двух причин:

  1. Обратная совместимость. setType и setData были написаны, не предвидя, что кто-то может захотеть сделать оба одновременно (или даже быть прецедентом для этого). Когда-то в будущем это требование или прецедент изменились. Однако приложения уже писали, полагаясь на это поведение. Таким образом, чтобы не нарушать их, они вводили новый метод, а не перегружали существующие.
  2. Это лучше. setType() и setData() были преднамеренно разработаны, чтобы быть разрушительными, чтобы помешать пользователям случайно писать ошибки, которые трудно отследить и понять. Таким образом, кто-то не мог вызвать setType(), а затем указать несовместимые данные с помощью setData(), чтобы URI работал в одном контексте по строке, но неожиданно неожиданно появился позже. Вместо этого интерфейс заставляет пользователей быть явным о том, чего они хотят.
+1

невероятный ответ. спасибо – eBoody

+0

За исключением ни 'Data', ни' Type' не являются битовыми полями. «Данные» - это строка символов URI, возможно, 2000 символов. Также «дополнительные» не очищаются: http://stackoverflow.com/questions/4116110/clearing-intent. – ebyrob