410013796724260
• Webmoney
R335386147728
Z369087728698
Объект намерения IntentПри рассмотрении жизненных циклов двух активностей был использован объект Intent. С помощью данного объекта выполнялся переход из одной активности в другую и обратно. В данной статье рассматривается объект намерений Intent. Intent представляет собой объект описания операции, которую необходимо выполнить через систему Android. Т.е. необходимо сначала описать некоторую операцию в виде объекта Intent, после чего отправить её на выполнение в систему вызовом одного из методов активности Activity. Объекты Intent в основном используются в трёх операциях : 1. Старт операции Если необходимо получить результат выполнения операции, то следует использовать метод startActivityForResult(), который вернет отдельный объект Intent в обратном вызове метода onActivityResult(). 2. Запуск сервиса Если сервис имеет интерфейс типа клиент-сервер, то можно с ним установить связь через вызов метода bindService(), с передачей ему в качестве параметра объекта Intent. 3. Рассылка широковещательных сообщений Типы объектов IntentСуществует два типа объектов Intent : явные и неявные. Явные объекты IntentЯвные объекты Intent , как правило, используются для запуска компонента из собственного приложения, где известно наименование запускаемых классов и сервисов. В примере рассмотрения жизненных циклов двух активностей был использован следующий вызов 2-ой активности : Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); В качестве первого параметра конструктора Intent указывается Context. Поскольку активность является наследником Context, то можно использовать укороченную запись this или полную как Class_name.this. Во втором параметре конструктора указывается наименование класса активности. Этот класс зарегистрирован в манифесте приложения. Таким образом, приложение может иметь несколько активностей, каждую из которых можно вызвать по наименованию класса. После вызова метода startActivity будет создана новая активность, которая запустится или возобновит свою работу, переместившись на вершину стека активностей. Пример старта сервисаЕсли в приложении был создан какой-либо сервис, например ServiceDownload для загрузки файлов из Интернета, то для запуска этого сервиса можно использовать следующий код : // url определяет некоторый файл в интернете String url = "http://www.example.com/image.png"; . . . Intent intentDownload; intentDownload = new Intent(this, ServiceDownload.class); intentDownload.setData(Uri.parse(url)); startService(intentDownload); Неявные объекты IntentНеявные объекты Intent не содержат имени конкретного класса. Вместо этого они включают действие (action), которое требуется выполнить. Неявный Intent может включать дополнительно наименование категории (category) и тип данных (data). Такой набор параметров позволяют компоненту из другого приложения обработать этот запрос. Например, если необходимо пользователю показать место на карте, то с помощью неявного объекта Intent можно попросить это сделать другое приложение, в котором данная функция предусмотрена. Когда android получает неявный объект Intent для выполнения, то система ищет подходящие компоненты путем сравнения содержимого Intent с фильтрами Intent других приложений, зарегистрированных в файлах манифестов. Если параметры объекта Intent совпадают с параметрами одного из фильтров Intent, то система запускает этот компонент и передает ему объект Intent. При наличии нескольких подходящих фильтров система открывает диалоговое окно, где пользователь может выбрать подходящее приложение. Фильтр Intent представляет собой секцию в файле манифеста приложения, описывающее типы объектов Intent, которые компонент мог бы выполнить. Таким образом, наличие фильтра Intent в описании активности в манифесте позволяет другим приложениям напрямую запускать данную операцию с помощью некоторого объекта Intent. Если фильтр Intent не описан, то операцию можно будет запустить только с помощью явного объекта Intent. Механизм использования неявных объектов Intent для вызова компонентов других приложений напоминает вызовы API. Основное отличие между вызовами компонентов и вызовами API заключается в том, что вызовы компонентов с помощью неявных Intent являются асинхронными, а API-вызовы являются синхронными. Привязка API-вызовов выполняется на этапе компиляции, тогда как вызовы неявных намерений являются привязкой ко время выполнения. Намерение, которое работает синхронно и имеет привязку к конкретной активности, становится явным. В случае, если система не сможет выполнить неявное намерение при вызове метода startActivity или startActivityForResult, то приложение завершится с ошибкой. Чтобы не допустить этого следует использовать метод намерения resolveActivity для проверки возможности выполнения заданного действия. Пример использования метода resolveActivity рассмотрен на странице описания взаимодействия с AlarmClock. Фильтры намерений IntentВ секциях фильтров намерений в файле манифеста можно объявить только три составляющих объекта Intent : действие, данные, категория. Рассмотрим пример описания фильтров намерений для приложения работы с социальными сетями. <activity android:name="MainActivity"> <!-- This activity is the main entry, should appear in app launcher --> <intent-filter> <action android:name= "android.intent.action.MAIN" /> <category android:name= "android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ShareActivity"> <!-- This activity handles "SEND" actions with text data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name= "android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <action android:name= "android.intent.action.SEND_MULTIPLE"/> <category android:name= "android.intent.category.DEFAULT"/> <data android:mimeType= "application/vnd.google.panorama360+jpg"/> <data android:mimeType="image/*"/> <data android:mimeType="video/*"/> </intent-filter> </activity> Первая активность (MainActivity), открывающаяся при старте приложения, является главной точкой входа. Действие «android.intent.action.MAIN» говорит о том, что это основная точка входа в приложение и не требуется ожидания никаких объектов Intent. Категория «android.intent.category.LAUNCHER» указывает на то, что значок данной активности следует поместить в средство запуска приложений системы. Если элемент <activity> не содержит указаний на конкретный значок с помощью тега icon, то система воспользуется значком из элемента манифеста <application>. Вторая активность (ShareActivity) предназначена для упрощения обмена текстовым и мультимедийным контентом. Несмотря на то, что пользователи могут входить в эту активность из MainActivity, они также могут открыть ShareActivity напрямую из другого приложения, которое создаст неявный объект Intent, соответствующий одному из двух фильтров Intent. Действие намерения, actionДействие action объекта Intent определяет, что нужно выполнить, например просмотр фото (view) или выбор фото (pick). В значительной степени действие определяет, каким образом описана остальная часть намерения Intent, в частности, что именно содержится в разделе данных. Действие для объекта Intent можно указать методом setAction() или определить в конструкторе Intent. Если Вы определяете собственные действия, то необходимо использовать наименование пакета приложения. Например : static final String ACTION_TRAVEL = "com.actions.TRAVEL"; Рассмотрим простой пример формирования неявного намерения для открытия определенной страницы сайта : String url = "http://java-online.ru/android.xhtml"; Uri address = Uri.parse(url); Intent urlIntent = new Intent(Intent.ACTION_VIEW, address); if (urlIntent.resolveActivity(getPackageManager())!=null) startActivity(urlIntent); else Log.d("Intent", "Intent (ACTION_VIEW) не обработан!"); В данном примере создается намерение с действием ACTION_VIEW, означающим просмотр чего-либо. При вызове данного намерения текущая активность приостанавливает своё действие и переходит в фоновый режим. При нажатии пользователем кнопки Back исходная активность восстанавливется. Некоторые константные значения действий, используемые в java-коде, представлены в следующей таблице :
Действие, определяемое в манифесте, включает наименование пакета и не используют префикс "ACTION_", например, «android.intent.action.SEND». С другими константными действиями можно познакомиться в справочнике Intent. Категория намерения, categoryКатегория – это строка, содержащая дополнительные сведения о том, каким компонентом должна выполняться обработка объекта Intent. В объект Intent можно поместить любое количество категорий. Однако большинству объектов Intent описание категории не требуется. Класс Intent для работы с категориями имеет группу методов :
При описании категории в файле манифеста используются стандартные значения, предоставляемые системой :
Константные наименования категории, используемые в java-коде, имеют префикс "CATEGORY_". С другими константными категориями можно познакомиться в справочнике Intent. Данные намеренияПри создании объекта Intent в некоторых случая необходимо определить данные (data). Например, для действия ACTION_EDIT, данные должны включать URI документа, который требуется отредактировать. Объект Uri ссылается на данные и/или тип этих данных MIME. Так, например, операция, которая выводит на экран изображения, скорее всего, не сможет воспроизвести аудио/видео файл, даже если и у тех, и у других данных будут одинаковые форматы URI. Поэтому указание типа данных MIME помогает системе Android найти наиболее подходящий компонент для выполнения объекта Intent. Чтобы задать только URI данных, используйте метод setData(). Чтобы определить только тип MIME, вызовите setType(). При необходимости определения обоих параметров можно вызвать метод setDataAndType(). Примечание : чтобы определить URI и тип MIME следует использовать метод setDataAndType(). Не вызывайте методы setData() и setType() поочередно, поскольку каждый из этих методов аннулирует результат выполнения другого. В файле манифеста данные в фильтре определяются в виде атрибутов тега <data>. При необходимости можно определить несколько тегов data. Чтобы указать, какие именно данные поддерживает компонент, используются следующие атрибуты :
В файле манифеста наряду с фильтрами намерений Intent настраиваются и другие параметры приложения. О том, как настроить атрибут configChanges, чтобы приложение реагировало на изменение ориентации устройста (portrait|landscape) или на изменение размера экрана можно прочитать здесь. Дополнительные данныеДанные, содержащие дополнительную информацию, необходимую для выполнения запрошенного действия, определяются в виде пары "ключ-значение". Добавлять дополнительные данные можно с помощью различных методов putExtra(), каждый из которых принимает два параметра : имя и значение ключа. Также можно создать объект Bundle с дополнительными данными и вставить его в Intent с помощью метода putExtras(). Например, для отправки сообщения электронной почты адрес получателя можно указать с помощью ключа EXTRA_EMAIL, а тему сообщения ― с помощью ключа EXTRA_SUBJECT. Класс Intent имеет несколько констант EXTRA_* для стандартных типов данных. Если необходимо использовать собственные дополнительные ключи для объектов Intent, которые принимает только ваше приложение, обязательно указывайте в качестве префикса имя пакета своего приложения. Например : static final String EXTRA_WATT = "com.example.EXTRA_WATT"; Определение намерения, запустившего активностьПри старте активности с помощью неявного намерения необходимо определить действие, которое следует выполнить, и данные для этого действия. Метод getIntent активности позволяет получить объект намерения : @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = getIntent(); } Методы getAction() и getData() позволяют определить действие и данные, связанные с намерением. Для получения дополнительной информации, хранящейся в параметре extras, используйте типизированные методы get<Type>Extra. String action = intent.getAction(); Uri data = intent.getData(); Связанные страницы
Intent взаимодействия с AlarmClock Пример создания многоэкранного Android приложения из двух активностей представлен здесь. |