Виклик стандартних Activity для додатку
Для виклику системних компонентів в класі Intent визначено набір констант Standard Activity Actions, що визначають дії запуску стандартних Activity. Наприклад, дія ACTION_DIAL ініціалізує звернення по телефону у вигляді вікна набору телефонного номера, а в класах MediaStore та MediaStore.Audio.Media визначені константи дії для запуску вікон з медіаплеєром, пошуку музики та запису з мікрофону; в класах DownloadManager – завантаження файлів через Інтернет, RingtoneManager – для запуску вікна, що встановлює режим дзвінка та ін. Викликати стандартне Activity можна наступним чином:
Intent intent = new Intent(“Intent.ACTION_DIAL”);
startActivity(intent);
4.6 Обмін даними між Activity
Інколи є потреба повернути результат Activity, коли він закривається. Для того щоб запустити Activity та отримати результат його виконання, необхідно викликати метод startActivityForResult(Intent, int) зі другим параметром, який ідентифікує запит. Результат повертається через метод onActivityResult(int, int, Intent), що визначений в батьківському Activity.
Крім того, можна передавати додаткові параметри (extra-параметри) у викликаємий Activity. Це пари ключ-значення для інформації, яку треба надати викликаємому компоненту. Об’єкт Intent має ряд методів put…() для вставки різного типу додаткових даних та аналогічного набору методів get…() для читання даних. Extra-параметри встановлюються та читаються як об’єкти класу Bundle із використанням методів putExtras() і getExtras().
Наприклад, запустити Activity с ім’ям класу EditContactActivity та передати йому два додаткових параметра із головного вікна зі списком контактів ContactListActivity можна наступним чином:
// ідентифікатор запиту
private static final int IDM_EDIT = 102;
private long mId = -1;
…
// в класі ContactItem визначений список контактів з
// полями NAME та PHONE, а також визначені методи
// getName(),getPhone(),setName(String),setPhone(String)
ArrayList<ContactItem> mList;
private ListAdapter mAdapter;
…
mList = new ArrayList<ContactItem> ();
…
mId=this.getSelectedItemId();
ContactItem mItem = mList.get((int)mId);
Intent intent = new Intent();
// додавання extra-параметрів
intent.putExtra(ContactItem.NAME, mItem.getName());
intent.putExtra(ContactItem.PHONE, mItem.getPhone());
// визначення класу запускає мого Activity
intent.setClass(this, EditContactActivity.class);
// виклик Activity
startActivityFotrResult(intent, IDM_EDIT);
Коли дочірній Activity закриється, в ньому можна викликати метод setResult(int), для того щоб повернути дані в батьківський Activity. Цей метод повертає код результату закриття Activity, який може бути стандартним результатом, що визначений константами RESULT_CANCELE, RESULT_OK або RESULT_FIRST_USER.
private EditText mName;
private EditText mPhone;
…
Intent t = new Intent();
// вставляємо ім’я та телефон людини
t.putExtra(ContactItem.NAME,mName.getText().toString());
t.putExtra(ContactItem.PHONE,mPhone.getText().toString());
// повертаємо результат у викликающий Activity
setResult(RESULT_OK, t);
finish();
Крім того, дочірній Activity довільно повернути об’єкт Intent, який містить будь-які додаткові дані. Вся ця інформація в батьківському Activity з’явиться через метод зворотного виклику Activity.onActivityResult(), разом із ідентифікатором, який було передано в метод startActivityForResult() при виклику Activity:
protected void onActivityResult( int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK){
Bundle extras = data.getExtras();
switch(requestCode){
case IDM_ADD:
mList.add(new ContactItem(
extras.getString(ContactItem.NAME),
extras.getString(ContactItem.PHONE)));
break;
case IDM_EDIT:
mList.set((int)mId, new ContactItem(
extras.getString(ContactItem.NAME),
extras.getString(ContactItem.PHONE)));
break;
}
…
}}
Треба зауважити, що для коректної взаємодії Activity, в файлі маніфесту необхідно додати окрім головного Activity інші Activity, додавши атрибути android:name,android:label:
<application …>
<activity android:name=”.ContactListActivity”
android:label=”@string/app_name”>
…
</activity>
<activity android:name=”.NewContactActivity”
android:label=”@string/title_add”>
</activity>
<activity android:name=”.EditContactActivity”
android:label=”@string/title_edit”>
</activity>
</application>
4.7 Intent-фільтри та запуск завдань
Intent-фільтри декларують обмеження компонента по прийому неявних об’єктів Intent, які він має змогу обробляти. Якщо компонент не має жодних фільтрів, він може приймати тільки явні об’єкти Intent. Компонент з фільтрами може приймати як явні так і неявні Intent. В Intent декларуються тільки три складові об’єкту Intent: дія, дані та категорія. Наприклад, в будь-якому додатку є головний Activity, який встановлюється як точка входу для завдання:
<activity
android:name=”.ContactListActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.
LAUNCHER” />
</intent-filter>
</activity>
Для того щоб Intent запустив компонент, котрому належить фільтр, він повинен чітко пройти всі три тести. Проте, якщо у об’єкта є декілька Intent-фільтра, то у випадку не проходження одного з них, проходить перевірку на наступний Intent-фільтр.
Наприклад, створимо окремий додаток для виклику попереднього додатку ContactListActivity з прикладу, описаного у пункті 4.6, та зробимо зміни в файлі маніфесту:
<activity
android:name=”.ContactListActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.
LAUNCHER” />
</intent-filter>
<intent-filter>
<action android:name=” com.samples.app.contact.
VIEW_CONTACTS” />
<category android:name=”android.intent.category.
DEFAULT” />
</intent-filter>
</activity>
В коді класу нового проекту буде створюватися об’єкт Intent з визначеною дією: startActivity(new Intent(“com.samples.app.contact.VIEW_ CONTACTS”));
Дата добавления: 2014-12-24; просмотров: 771;