2013-10-03 3 views
9

В чем разница между putExtra() и setData()? Я прочитал андроидные документы, но это не очень помогает. Также есть вопрос Intent.setData vs Intent.putExtra, но до сих пор неясно. Спасибо заранее.Разница между putExtra() и setData()

+2

проверьте документы http://developer.android.com/reference/android/content/Intent.html#setData(android.net.Uri) и этот http://developer.android.com/reference/android/ content/Intent.html # putExtra (java.lang.String, android.os.Bundle) – Raghunandan

ответ

4

putExtra позволяет вам добавлять примитивные (или дополнительные) пары ключ-значение. setData ограничивается пропусками Uri. setData обычно используется для случая запроса данных из другого источника, например, в startActivityForResult.

+0

, но uri можно также отправить через putextra. –

+0

Да, но get/setData не требует «ключа» - put/getExtra. set/getData - это просто сокращение от необходимости не придумывать этот ключ, о котором знают все приложения. – f2prateek

8

SetData()

Набор данных это намерение работает на. Этот метод автоматически очищает любой тип, который ранее был установлен setType (String) или setTypeAndNormalize (String).

Примечание: соответствие схемы в системе Android учитывает регистр, в отличие от формального RFC. В результате вы всегда должны писать свой Uri с нижестоящей схемой или использовать normalizeScheme() или setDataAndNormalize (Uri), чтобы убедиться, что схема преобразована в нижний регистр.

Параметры

данные: Ури данных это намерение теперь таргетирования.

Рекомендации предназначены для того, чтобы сигнализировать системе Android, что произошло определенное событие. В намерениях часто описывается действие, которое должно быть выполнено, и предоставлять данные, по которым такое действие должно быть выполнено. Например, ваше приложение может начать с намерения компонент браузера для определенного URL-адреса. Об этом свидетельствует следующий пример.

String url = "http://www.google.com"; 
    Intent i = new Intent(Intent.ACTION_VIEW); 
    i.setData(Uri.parse(url)); 
    startActivity(i); 

Но как система Android идентифицирует компоненты, которые могут реагировать на определенные намерения?

Для этого используется концепция целевого фильтра. Фильтр намерений определяет типы намерений, на которые может реагировать оператор, услуга или широковещательный приемник. Поэтому он заявляет о возможностях компонента.

Фильтры намерений регистрации компонентов Android либо статически в AndroidManifest.xml, либо в случае широковещательного приемника также динамически с помощью кода. Фильтр намерений определяется фильтрами категории, действия и данных. Он также может содержать дополнительные метаданные.

Если намерение отправлено в систему Android, платформа Android запускается с использованием данных, включенных в объект Intent, определения приемника. В этом он определяет компоненты, которые регистрируются для данных намерения. Если несколько компонентов зарегистрировались для одного и того же фильтра цели, пользователь может решить, какой компонент должен быть запущен.

putExtra()

Добавить расширенные данные намерения.

Параметры:

Имя: Название дополнительных данных.

Значение: Значение данных массива String.

Возвращает один и тот же объект Intent для объединения нескольких вызовов в один оператор.

+0

Не могли бы вы объяснить более подробно, что означает «установить данные, на которые нацелено это намерение»? –

+0

Я отредактировал мой ans, теперь попытаюсь понять –

+0

спасибо .. это очистило что-то несколько .. но предположим, что я хочу запустить явное намерение, тогда что установить в setData ?? В этом случае я могу использовать putextra для предоставления uri? –

2

взглянуть на источник:

/** 
* Set the data this intent is operating on. This method automatically 
* clears any type that was previously set by {@link #setType} or 
* {@link #setTypeAndNormalize}. 
* 
* <p><em>Note: scheme matching in the Android framework is 
* case-sensitive, unlike the formal RFC. As a result, 
* you should always write your Uri with a lower case scheme, 
* or use {@link Uri#normalizeScheme} or 
* {@link #setDataAndNormalize} 
* to ensure that the scheme is converted to lower case.</em> 
* 
* @param data The Uri of the data this intent is now targeting. 
* 
* @return Returns the same Intent object, for chaining multiple calls 
* into a single statement. 
* 
* @see #getData 
* @see #setDataAndNormalize 
* @see android.net.Uri#normalizeScheme() 
*/ 
public Intent setData(Uri data) { 
    mData = data; // private Uri mData 
    mType = null; // private String mType; 
    return this; 
} 

/** 
* Add extended data to the intent. The name must include a package 
* prefix, for example the app com.android.contacts would use names 
* like "com.android.contacts.ShowAll". 
* 
* @param name The name of the extra data, with package prefix. 
* @param value The String data value. 
* 
* @return Returns the same Intent object, for chaining multiple calls 
* into a single statement. 
* 
* @see #putExtras 
* @see #removeExtra 
* @see #getStringExtra(String) 
*/ 
public Intent putExtra(String name, String value) { 
    if (mExtras == null) { 
     mExtras = new Bundle(); 
    } 
    mExtras.putString(name, value); 
    return this; 
} 
1

setData() должен передать данные, на которых, действие должно быть принято; а putExtra() - отправить дополнительную информацию о действии.

Например, если вы начинаете деятельность по выполнению ACTION_CALL, то он должен установить номер для звонка в setData(). И если он хочет передать какую-либо другую дополнительную информацию, тогда он должен использовать putExtra().

+0

Непосредственно скопирован из Skillgun, но короткий и довольно точный: http://skillgun.com/question/449/android/basics/what-is-the- значение-на-putextra-метод-в-андроид-хау-это-это-разный-от-SetData-любой-путь-как-это-ближнего только данные, то-что-это-разностное – webgenius

Смежные вопросы