Загальні відомості

Намір (Intent) - це механізм для опису однієї операції - обрати фотографію, відправити лист, зробити дзвінок, запустити браузер і перейти за вказаною адресою. В Android-додатках багато операцій працюють через наміри.

Найбільш поширений сценарій використання наміру - запуск іншої активності у своєму додатку.

Але це не єдиний варіант використання наміру. Також його можна використовувати для оголошення про запуск активності або сервісу, спрямованих на виконання яких-небудь дій (як правило, мова про роботу з певною частиною даних) або для передачі повідомлень про те, що відбулася якась подія (чи дія).

Наміри можуть застосовуватися для трансляції повідомлень по системі. Будь-який додаток здатний зареєструвати широкомовний приймач і відслідковувати ці наміри з можливістю на них реагувати. Це дозволяє створювати додатки, що використовують модель подій, в основі якої лежать внутрішні, системні або сторонні події, що передаються зовнішніми програмами.

Android транслює наміри для оголошення про системні події, наприклад про зміни в стані мережевого підключення або в рівні заряду батареї. Системні програми в Android, такі як програми дозвону або управління SMS, реєструють компоненти, які відстежують задані наміри, наприклад вхідний дзвінок або отримано нове SMS-повідомлення, і відповідним чином реагують на них.

Явні наміри

Згадаймо код для переходу на другу активність у своєму додатку:

Intent intent = new Intent(HelloWorld.this, AboutActivity.class);
startActivity(intent);

В намірі ми явно вказали ім'я класу активності у другому параметрі. Даний клас у нас прописаний в маніфесті, і система, переглядаючи маніфест, запустить потрібну активність. Ось чому у нас спочатку програма завершувалася з помилкою. Коли ми створили клас, але не прописали його в маніфесті, то система не розуміла, чого від неї хочуть.

Перший параметр – це Context. Активність є підкласом Context, тому ми можемо використовувати її як HelloWorld.this, або скорочений запис this.

Таким чином, ваш додаток може мати десять активностей, і ви можете викликати будь-яку з них, знаючи її ім'я класу. Це явний виклик. Тобто ви явно вказуєте ім'я класу для запуску.

Після виклику методу створиться нова активність, яка запуститься або відновить свою роботу, перемістившись на вершину стека активностей.

Також при переході на іншу активність ми можемо вказати якісь дані, а приймаюча активність повинна вміти обробити їх. Для цих цілей існують методи типу putXXX(). Наприклад, для передачі списку файлів з однієї активності в іншу:

// У першій активності
ArrayList<File> fileList = new ArrayList<File>();

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("FILES_LIST", fileList);
startActivity(intent);

// У другий активності
ArrayList<File> filelist = 
(ArrayList<File>)getIntent().getSerializableExtra("FILES_LIST");

За схожим сценарієм можна передати прості типи і рядки.

При роботі з діями, які повертають дані, можна використовувати метод startActivity(), оскільки він не повертає результат. Якщо ви хочете повернути дані, то можете використовувати метод startActivityForResult(), пристосований для роботи із зворотніми викликами.

Неявні наміри

Існує також неявний виклик активності. У цьому випадку при створенні наміру ми використовуємо не ім'я класу, а вказуємо параметри action, data, category з певними значеннями. Система аналізує, що ми тут такого понаписували і починає підбирати відповідний варіант для запуску. Наприклад, якщо вказали в параметрах адреса веб-сторінки, то швидше за все хочемо запустити браузер і прочитати новину.

 Комбінація значень, заданих як параметри визначають мету, яку ми хочемо досягти. Це може бути відкриття посилання, відправка листа, набір номера і т. п.

Ми також можемо прописати у своїй активності в фільтрах намірів (Intent Filter) набір тих же параметрів: action, data, category. І тоді у користувача може запуститися не тільки стандартний браузер, але і наша програма.

Іншими словами, якщо параметри наміру збігаються з умовами нашого фільтра, то наш додаток (активність) буде викликано. Система сканує активності всіх встановлених додатків, і якщо знаходиться декілька відповідних, то Android надає користувачеві вибір, якою саме програмою слід скористатися. Якщо знайдеться тільки одна підходяща активність, то ніякого діалогу для вибору не буде, і активність запуститься автоматично.

Неявні наміри — це механізм, що дозволяє запитувати анонімні компоненти додатків за допомогою дій. Ви можете попросити систему запустити активність, що виконує задану дію, не знаючи нічого ні про саму активность, ні про її додаток. Наприклад, ми вказуємо телефонний номер, але поняття не маємо, якими програмами дозвону користується користувач на своєму телефоні. Але це вже не наша проблема, нехай користувач сам обирає, як йому телефонувати за номером, який ми можемо йому надати.

Створюючи новий неявний намір для передачі в метод startActivity(), необхідно призначити дію, що має здійснитися, а також при бажанні вказати допоміжний шлях URI до тих даних, що потрібно обробити. Ви також можете передати дані додатку в іншу активність, використовуючи параметр наміру extras.

При застосуванні цього наміру для запуску активності система під час роботи додатка сама знайде клас компонента, який краще всього підходить для заданої дії, враховуючи зазначений тип даних. Це означає, що ви можете створювати проекти, використовуючи можливості інших програм і не знаючи при цьому, як вони називаються і яку функціональність надають.

Простий приклад створення наміру з визначеною дією ACTION_VIEW для запуску браузера і переходу на потрібну адресу:

Uri address = Uri.parse("http://primat.org/");
Intent openlinkIntent = new Intent(Intent.ACTION_VIEW, address);
startActivity(openlinkIntent);

В даному випадку дія ACTION_VIEW означає перегляд чого-небудь. Ми вказали необхідні дані (адреса), тому відбувається запуск нової активності (браузера). При цьому вихідна активність припиняється і переходить у фоновий режим. Коли користувач натискає на кнопку Back, то він повертається до вихідної активності. Зверніть увагу, що ми ніде не вказуємо конкретну програму-браузер типу Chrome, Opera і т. п.

У кожному разі Android знаходить відповідну активність, щоб відповісти на намір, ініціюючи її в разі необхідності.

Додатки можуть також створювати свої власні типи намірів і дозволяти іншим додаткам викликати їх.

Слід пам'ятати, що немає ніякої гарантії, що програма, здатна обробити ваш намір, буде встановлена і доступна на пристрої. Звичайно, ймовірність того, що у користувача не буде дзвонилки, достатня низька. А якщо додаток встановлено на планшеті без телефонного модуля? А якщо з'являться холодильники або пральні машини з Android на борту? Щоб дізнатися, чи буде запущена активність для вашого наміру, можна надіслати запит Менеджеру пакетів за допомогою методу resolveActivity().

Об'єкт Intent містить інформацію, що цікава для компонента, який отримує намір, і дані, які передаються цьому компоненту. Крім того, об'єкт Intent містить інформацію, цікаву для системи Android, ім'я компонента, який має намір обробити і набір параметрів запуску цього компонента. Як правило, об'єкт Intent може містити такі поля:

Ім'я компонента - ім'я, яке намір має обробити. Використовується об'єкт ComponentName, який є комбінацією повного імені класу цільового компонента (наприклад, "MainActivity") і набору імені пакета у файлі маніфесту додатку, де компонент постійно перебуває (наприклад, "com.samples.yourproject"). Складове ім'я є додатковим. Якщо воно встановлено, об'єкт Intent поставляє зразку класу, що визначаеться . Якщо ім'я не встановлено, Android використовує іншу інформацію в об'єкті Intent, щоб визначити місцезнаходження відповідного адресата. Складове ім'я встановлюється методами setComponent(), setClass() або setClassName() і читається методом getComponent();

Дія - визначає дію, яку буде виконано. Клас Intent містить безліч констант дії. Назва методу визначає ряд параметрів і значення, що повертається. Ви можете також визначити власні дії для активізації активності. У цьому випадку ви повинні включати ім'я пакету програми в якості префікса, наприклад com.samples.yourproject.CUSTOM_ACTiON. Дія в об'єкті Intent встановлюється в методі setAction() і читається методом getAction();

Дані - це URI даних і тип MIME для цих даних. Різні активності з'єднані з різними видами специфікацій даних;

Категорія - рядок, що містить додаткову інформацію про вигляд компонента, який має обробити намір. В об'єкт Intent можна помістити будь-яку кількість описів категорій. Клас Intent визначає кілька констант CATEGORY, наприклад, CATEGORY_BROWSABLE;

Доповнення - пари ключ-значення для додаткової інформації, яку потрібно надати компоненту, який спілкується з наміром. Наприклад, дія ACTION_TIMEZONE_CHANGED має додаток time-zone, який ідентифікує новий часовий пояс, ACTION_HEADSET_PLUG має додаток state, який вказує, чи включені навушники чи ні, а також додаток name для типу навушників. Об'єкт Intent має ряд методів put...() для вставки різних типів додаткових даних і подібного набору методів get...() для читання даних. Доповнення встановлюються і читаються як об'єкти Bundle з використанням методів putExtras() і getExtras();

Прапори - вказують системі, як запускати активність (наприклад, якому завданню має належати активність) і як обробити це після того, як активність запустили (наприклад, чи належить вона списку недавніх активностей). Всі прапори визначені в класі Intent.

Система і програми, які йдуть в комплекті з платформою, також використовують об'єкти Intent для активізації визначених системою компонентів (наприклад, різних додатків і служб при завантаженні системи).

Константи дії

ACTION_ANSWER — Відкриває активність, яка пов'язана з вхідними дзвінками. Ця дія обробляється стандартним екраном для прийому дзвінків;
ACTION_CALL — ініціалізує звернення по телефону;
ACTION_DELETE — Запускає активність, за допомогою якої можна видалити дані, зазначені в дорозі URI всередині наміру;
ACTION_EDIT — Відображає дані для редагування користувачем;
ACTION_INSERT — Відкриває активність для вставки у Курсор (Cursor) нового елемента, зазначеного за допомогою шляху URI. Дочірня активність, викликана з цією дією, повинна повернути URI, який посилається на вставлений елемент;
ACTION_HEADSET_PLUG - Підключення навушників;
ACTION_MAIN — Запускається як початкова активність завдання;
ACTION_PICK - Завантажує дочірню Активність, що дозволяє вибрати елемент із джерела даних, вказаний з допомогою шляху URI. При закритті повинен повертатися URI, який посилається на вибраний елемент. Активність, яка буде запущена, залежить від вибраного типу даних, наприклад при передачі шляху content://contacts/people викличеться системний список контактів;
ACTION_SEARCH — Запускає активність для виконання пошуку. Пошуковий запит зберігається у вигляді рядка в додатковому пункті наміру по ключу SearchManager.QUERY;
ACTION_SEND — Завантажує екран для відправки даних, зазначених у намірі. Контакт-отримувач повинен бути вибраний з допомогою отриманої активності. Використовуйте метод setType, щоб вказати тип MIME для переданих даних. Ці дані повинні зберігатися в параметрі наміру extras з ключами EXTRA_TEXT або EXTRA_STREAM, залежно від типу. У випадку з електронною поштою стандартний додаток в Android також приймає додаткові параметри по ключам EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC і EXTRA_SUBJECT. Використовуйте дію ACTION_SEND тільки в тих випадках, коли потрібно передати дані віддаленому адресату (а не іншій програмі на тому ж пристрої);
ACTION_SENDTO — Відкриває активність для надсилання повідомлення контакту, вказаного в шляху URI, який передається через намір;
ACTION_SYNC — Синхронізує дані сервера з даними мобільного пристрою;
ACTION_TIMEZONE_CHANGED - Зміна часового поясу;
ACTION_VIEW — Найбільш поширена загальна дія. Для даних, що передаються за допомогою шляху URI в намірі, шукається найбільш підходящий спосіб виводу. Вибір програми залежить від схеми (протоколу) даних. Стандартні адреси http: будуть відкриватися в браузері, адреси tel: — в додатку для дзвінка, geo: — у програмі Google Maps, а дані про контакт — перегляд в додатку для управління контактною інформацією;
ACTION_WEB_SEARCH — Відкриває активність, яка веде пошук в інтернеті, грунтуючись на тексті, переданому з допомогою шляху URI (як правило, при цьому запускається браузер).

Константи категорій

CATEGORY_BROWSABLE — активність може бути безпечно викликана браузером, щоб відобразити зразкові дані, наприклад, зображення або поштове повідомлення;
CATEGORY_HOME — активність відображає Home Screen, перший екран, який користувач бачить після включення пристрою і завантаження системи, або коли натискає клавішу HOME;
CATEGORY_LAUNCHER — активність може бути початковою діяльністю завдання зі списку додатків у групі Application Launcher пристрої.

Методи

Для роботи з категоріями в класі Intent визначена група методів:

addCategory() — поміщає категорію в об'єкт Intent;
removeCategory() — видаляє категорію, яка була додана раніше;
getCategories() — отримує набір всіх категорій, які перебувають на даний час в об'єкті Intent.

Фільтри намірів і запуск завдань

Якщо намір запитує виконання якої-небудь дії з певним набором даних, системі потрібно вміти вибрати додаток (або компонент) для обслуговування цього запиту. На допомогу приходять фільтри намірів, які використовуються для реєстрації активностей, сервісів і широкомовних приймачів в якості компонентів, здатних виконувати задані дії з конкретним видом даних. З допомогою цих фільтрів також реєструються широкомовні приймачі, налаштовані на трансляцію наміром заданої дії або події.

Задіюючи Фільтри намірів, додатки оголошують, що вони можуть відповідати на дії, необхідні будь-якій програмі, встановленої на вашому пристрої. Щоб зареєструвати компонент програми в якості потенційного обробника намірів, потрібно додати тег <intent-filter> у вузол компонента в маніфесті.

У фільтрі намірів декларується тільки три складових об'єкта Intent: дія, дані, категорія. Доповнення і прапори не відіграють ніякої ролі у прийнятті рішення, який компонент отримує намір.

Наприклад, в будь-якому додатку є головна активність, яка встановлюється як точка входу для завдання:

<activity
android:name=".HelloWorldActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"
<category android:name="android.intent.category.LAUNCHER"
</intent-filter>
</activity>

Фільтр такого виду в елементі <action> позначає активність, яка запускається за замовчуванням. Елемент <category> змушує значок і мітку для діяльності відображатися на панелі Application Launcher, даючи користувачам можливість запускати завдання і повертатися до цього завдання в будь-який час після того, як воно було запущено.

Усередині вузла Фільтра намірів можна використовувати такі теги (і відповідні атрибути).

  • action - Використовує атрибут android:name, щоб задати назву дії, яка буде обслуговуватися. Кожен фільтр намірів повинен мати один (і тільки один) тег action. Дії повинні бути представлені у вигляді унікальних рядків, які самі себе описують. Рекомендується обирати назви, базуючись на угоді про іменуванні пакетів в Java.
  • сategory - Використовує атрибут android:name, щоб вказати, за яких обставин повинно обслуговуватися дія. Кожен тег intent-filter здатний містити кілька тегів category. Ви можете задати власні категорії, або ж брати стандартні значення, що надаються системою:
  1. ALTERNATIVE - Наявність даної категорії свідчить про те, що дія повинна бути доступна в якості альтернативної тій, яка виконується за замовчуванням для елемента цього типу даних. Наприклад, якщо дія за умовчанням для контакту — перегляд, то в якості альтернативи його також можна редагувати.
  2. SELECTED_ALTERNATIVE - Те ж саме, що і ALTERNATIVE, але замість одиночної дії з використанням затвердження наміру, як описано вище, застосовується в тих випадках, коли потрібен список різних можливостей. Однією з функцій фільтра намірів може стати динамічне заповнення контекстного меню за допомогою дій.
  3. BROWSABLE - Говорить про те, що дія доступна з браузера. Коли намір спрацьовує в браузері, воно завжди містить дану категорію. Якщо ви хочете, щоб додаток реагував на дії, ініційовані браузером (такі як перехоплення посилань на конкретний сайт), то повинні додати в його маніфест категорію BROWSABLE.
  4. DEFAULT - Встановіть цю категорію, щоб зробити компонент обробником за замовчуванням для дії, виконуваної із зазначеним типом даних всередині Фільтра намірів. Це необхідно і для Активностей, які запускаються за допомогою явних Намірів.
  5. GADGET - Наявність цієї категорії вказує на те, що ця активність може запускатися всередині іншої активності.
  6. HOME - Встановлюючи цю категорію і не вказуючи при цьому дії, ви створюєте альтернативу для стандартного домашнього екрану.
  7. LAUNCHER - Використовуючи цю категорію, ви поміщаєте Активність у вікно для запуску додатків.
  • data - Цей тег надає можливість вказати тип даних, з якими може взаємодіяти ваш компонент. При необхідності можна задати кілька тегів data. Щоб вказати, які саме дані підтримує ваш компонент, використовуйте поєднання наступних атрибутів:
  1. android:host — задає доступне ім'я віддаленого сервера (наприклад, google.com);
  2. android:mimetype — дозволяє вказати тип даних, які ваш компонент здатний обробляти. Для прикладу: <type android: value="vnd.android.cursor.dir/*"/> відповідатиме будь-якому Курсору в Android;
  3. android:path — визначає доступні значення для шляху URI (наприклад, /transport/boats/);
  4. android:port — вказує доступні порти для заданого сервера;
  5. android:scheme — вимагає вказати конкретну схему (наприклад, content або http).

Принцип роботи фільтрів намірів

При використанні методу startActivity() переданий неявний намір, як правило, доходить лише до однієї активності. Якщо для виконання заданої дії із зазначеними даними підходять відразу кілька активностей, користувачеві надається список вибору. Процес, коли вирішується, яку активність краще запустити, називається Затвердженням намірів. Його мета — знайти найбільш відповідний фільтр намірів. В цілому весь алгоритм працює наступним чином.

  1. Android збирає список всіх доступних Фільтрів намірів з встановлених пакетів.
  2. Фільтри, які не відповідають дії або категорії Наміри, видаляються зі списку. Збіг відбувається тільки в тому випадку, якщо Фільтр намірів містить зазначену дію (або якщо дія для нього зовсім не задана). Збіг не відбудеться, тільки якщо жодна з дій Фільтра намірів не буде еквівалентна тим, які задані в Намірі. Для категорій процес відповідності більш суворий. Фільтр намірів повинен включати в себе всі категорії, визначені в отриманому Намірі. Фільтр, для якого категорії не вказані, може відповідати тільки таким же Намірам (немає категорій).
  3. Нарешті, кожна частина шляху URI з Наміру порівнюється з тегом data Фільтра намірів. Якщо у Фільтрі вказані схема (протокол), сервер/належність, шлях або тип MIME, всі ці значення перевіряються на відповідність шляху URI з Наміру. При будь-якій розбіжності Фільтр буде видалений зі списку. Якщо у Фільтрі намірів не вказано жодного параметра data, його дія буде поширюватися на будь-які дані.
  • MIME — тип даних, який повинен співпасти. При порівнянні типів даних ви можете використовувати маски, щоб охоплювати всі підтипи (наприклад, cats/*). Якщо у Фільтрі намірів вказаний тип даних, він повинен збігтися з тим, який значиться в намірі, при відсутності тега data підійде будь-який тип.
  • Схема — це протокольна частина шляху URI, наприклад http:, mailto: або tel:.
  • Ім'я сервера (або належність даних) — частина URI між схемою і самим шляхом (наприклад, www.google.com). Щоб збіглося ім'я сервера, схема Фільтра намірів також повинна підійти.
  • Після імені сервера йде шлях до даних (наприклад, /ig). Шлях пройде перевірку тільки після схеми та імені сервера, що містяться в тегу.

4. Коли ви неявним чином запускаєте Активність і вищеописаний процес повертає більше одного збігу, користувачеві виводиться список зі всіма варіантами.

Пошук і використання наміру, за допомогою якого була запущена активність

Коли програмний компонент запускається з допомогою неявного наміру, він повинен знайти дію, яку необхідно здійснити, і дані для неї.

Використовуйте метод getIntent() (як правило, усередині методу onCreate()), щоб отримати намір, з допомогою якого компонент запущений.

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.main);
Intent intent = getIntent();
}

Застосовуйте методи getAction() і getData(), щоб знайти дію і дані, пов'язані з наміром. Для отримання додаткової інформації, що зберігається в параметрі extras, використовуйте типізовані методи get<тип>Extra.

String action = intent.getAction();
Uri data = intent.getData();

Делегування відповідальності

Задійте метод startNextMatchingActivity() для делегування відповідальності за обробку дії наступному компоненту, який краще всього для цього підходить.

Intent intent = getIntent();
if (isDuringBreak)
startNextMatchingActivity(intent);

Це дозволяє додавати додаткові умови для компонентів, які обмежать сферу їх застосування рамками затвердження Намірів. В деяких випадках ваш компонент може виконати деякі операції або запропонувати користувачеві вибір, перш ніж передати Намір іншому компоненту.

ACTION_PICK

До сих пір ми в основному розглядали наміри або дії, які зазвичай активують іншу активність, не очікуючи отримати у відповідь результат. Тепер розглянемо більш складну дію, яка повертає значення після того, як буде активована. ACTION_PICK - це узагальнена назва для таких дій.

Принцип ACTION_PICK полягає в тому, щоб запустити активність, що відображає список елементів. Після цього активність повинна надавати користувачеві можливість вибору елемента з цього списку. Коли користувач обере елемент, активність поверне URI вибраного елемента викликаючій стороні. Таким чином, можна багаторазово використовувати функцію UI для вибору декількох елементів певного типу.

Наступний код виведе діалогове вікно зі списком всіх можливих програм, які можуть запустити активність з даними, так як ми не вказуємо конкретний тип (setType("*/*")):

// Показуємо всі програми для запуску
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("*/*");
startActivityForResult(intent, 1);

Якщо ми вкажемо конкретний тип даних, що нас цікавить, то список програм суттєво звузиться. Наприклад, якщо вказати intent.setType("image/*");, то можемо побачити тільки системну програму Галерея для перегляду картинок (можуть бути встановлені програми, які також призначені для перегляду картинок, тому перелік може відрізнятися).

ACTION_SEND

Дуже поширений намір. Використовуйте метод setType(), щоб вказати тип MIME для переданих даних. Ці дані повинні зберігатися в параметрі наміру extras з ключами EXTRA_TEXT або EXTRA_STREAM, залежно від типу. У випадку з електронною поштою стандартний додаток в Android також приймає додаткові параметри по ключам EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC і EXTRA_SUBJECT.

Якщо є встановлений додаток з фільтром, який відповідає ACTION_SEND і MIME-типу text/plain, система Android запустить його, а якщо буде знайдено більше одного додатка, то система відобразить діалог вибору, який дозволить користувачеві обрати програму.

Якщо ваша активність хоче обробляти подібні наміри, то вона повинна містити такі дані:

<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
 <data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>

Ім'я повідомляє Android, що активність може обробляти ACTION_SEND.

Фільтр повинен включати категорію DEFAULT, в іншому випадку він не зможе отримувати неявні наміри.

Вказуємо типи даних, які можуть оброблятися активністю.

ACTION_GET_CONTENT

Обрати файл

Якщо ви не хочете писати власний менеджер файлів, а готові використовувати готові програми для вибору файлу, то можете використовувати наступний код:

public class PickFileActivity extends Activity {
TextView textFile;
private static final int PICKFILE_RESULT_CODE = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.main);
Button buttonPick = (Button)findViewById(R. id.buttonpick);
textFile = (TextView)findViewById(R. id.textfile);
buttonPick.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent,PICKFILE_RESULT_CODE);
}});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
switch(requestCode) {
case PICKFILE_RESULT_CODE:
if(resultCode == RESULT_OK) {
String FilePath = data.getData().getPath();
textFile.setText(FilePath);
}
break;
} } }

Тільки ви повинні бути впевнені, що у користувача є програма, здатна працювати з файлами.

У коді ми отримуємо повний шлях до файлу через метод getPath(). Якщо вам потрібно отримати роздільно ім'я каталогу і ім'я файлу, то потрібна невелика модифікація:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
switch(requestCode) {
case PICKFILE_RESULT_CODE:
if(resultCode == RESULT_OK) {
String FilePath = data.getData().getPath();
String FileName = data.getData().getLastPathSegment();
int lastPos = FilePath.length() - FileName.length();
String Folder = FilePath.substring(0, lastPos);
textFile.setText("Full Path: \n" + FilePath + "\n");
textFolder.setText("Folder: \n" + Folder + "\n");
textFileName.setText("File Name: \n" + FileName + "\n");
}
break;
} }

Діалогове вікно вибору

При виборі зі списку програм користувач може обрати програму за замовчуванням, яка буде автоматично запускатися при вибраному намірі. У цьому випадку діалогове вікно виводитися не буде. Але можна примусово виводити діалогове вікно за допомогою методу createChooser() і користувачеві доведеться кожного разу обирати потрібну активність:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, messageText);
Intent chosenIntent = Intent.createChooser(intent, "Заголовок у діалоговому вікні");
startActivity(chosenIntent);

Якщо на пристрої не буде підходящих активностей для запуску, то createChooser() обробить дану ситуацію і виведе відповідне повідомлення. У цьому полягає його перевага. Якщо передати методу startActivity() намір, для якого не знайдеться відповідної активності, то виникне виняток ActivityNotFoundException. І вам доведеться перехоплювати його в блоці try/catch, щоб уникнути аварійного завершення програми.

На сторінці http://www.openintents.org/ зібрана інформація про доступні наміри в різних програмах.

Відкрити посилання в браузері

Uri address = Uri.parse("http://developer.alexanderklimov.ru/android");
Intent openlink = new Intent(Intent.ACTION_VIEW, address);
startActivity(openlink);

Даний код запустить браузер з зазначеним посиланням. Якщо посилання веде на YouTube, то відкриється стандартний додаток для YouTube. Також можна відкрити стандартний клієнт Android Market з посиланням на який-небудь додаток. Для цього необхідно в параметр URI передати посилання виду market://search?q=search query, де search query необхідно замінити відповідним пошуковим запитом.

YouTube

Можна запустити конкретно додаток YouTube.

// constant value of package & class name of YouTube app
public static final String YOUTUBE_PACKAGE_NAME = "com.google.android.youtube";
public static final String YOUTUBE_CLASS_NAME = "com.google.android.youtube.WatchActivity";
//Launch Youtube to watch an URL
public static void launchYoutube(Context context, String url) {
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(url)); 
intent.setClassName(YOUTUBE_PACKAGE_NAME, YOUTUBE_CLASS_NAME); 
context.startActivity(intent);
}

Пошуковий запит

Можна відправити пошуковий запит в Гугл:

public static void invokeWebSearch(Activity activity) {
String q = "математика";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
 intent.putExtra(SearchManager.QUERY, q);
activity.startActivity(intent);
}

Голосова команда

Intent intent = new Intent(Intent.ACTION_VOICE_COMMAND);
startActivity(intent);

Запустити Twitter

Twitter можна запустити через намір. Якщо на пристрої встановлено рідний додаток, то запуститься він, інакше запуститься веб-версія:

try {
startActivity(new Intent(
Intent.ACTION_VIEW,
Uri.parse("twitter://user?screen_name=" + twitter_user_name)));
} catch (Exception e) {
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://twitter.com/#!/" + twitter_user_name)));
}

Замість змінної twitter_user_name необхідно підставити потрібний обліковий запис.

Програти MP4-файл (ACTION_VIEW)

// файл, вибирається зі списку
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
//super.onListItemClick(l, v, position, id);
String uriString = l.getItemAtPosition(position).toString();
Uri intentUri = Uri.parse(uriString);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(intentUri, "video/mp4);
startActivity(intent);
}

Запустити музичний програвач

Запускаємо програму Музика:

if (android.os.Build.VERSION.SDK_INT >= 15) {
Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_MUSIC);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// Min SDK 15
startActivity(intent);
} else {
Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER); //"android.intent.action.MUSIC_PLAYER"
startActivity(intent);
}

До версії API 15 використовувався код з блоку else. У нових версіях потрібно використовувати більш складну конструкцію.

Налаштування

String settings1 = Settings.ACTION_APPLICATION_SETTINGS; // Додатки. Вкладка Сторонні додатки
String settings2 = Settings.ACTION_WIRELESS_SETTINGS; // Безпровідні мережі
String settings3 = Settings.ACTION_SETTINGS; // Основне вікно програми Установки
// Підставте потрібний рядок
startActivity(new Intent(settings1));

Вікторія Пряжнікова


2016-06-05 • Просмотров [ 51 ]