Главная » Разработка для Android » Поиск и использование Намерения, с помощью которого была запущена Активность

0

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

Используйте метод getIntent (как  правило,  внутри  метода onCreate), чтобы извлечь  Намерение, с помощью которого  компонент  запущен.  Этот процесс показан в листинге 5.8.

Листинг 5.8. Поиск исходного Намерения в дочерней Активности

@Override

public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main);

Intent intent = getIntent();

}

Применяйте методы getAction и getData, чтобы найти действие и дан- ные, связанные с Намерением. Для извлечения дополнительной информа- ции, хранящейся в параметре extras, используйте типизированные методы get<тип>Extra.

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

Делегирование ответственности

Как показано в листинге 5.9, задействуйте метод startNextMatchingActivity для делегирования ответственности за обработку действия следующему компоненту,  который лучше всего для этого подходит.

Листинг 5.9. Передача обязанностей по обработке действия  другому Приемнику намерений

Intent intent = getIntent();

if (isDuringBreak)

startNextMatchingActivity(intent);

Это позволяет  добавлять  дополнительные условия  для компонентов, которые ограничат сферу их применения рамками утверждения На- мерений.

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

Пример приложения для выбора контактов

ПРИМЕЧАНИЕ

Класс SimpleCursorAdapter позволяет назначать данные Курсора, ис- пользуемые Источником данных, для Представлений. Здесь он при- водится без дополнительных комментариев, но позже в этой главе вы рассмотрите его более подробно.

final Uri data = Uri.parse(dataPath + "people/");

final Cursor c = managedQuery(data, null, null, null);

String[] from = new String[] {People.NAME};

int[] to = new int[] { R.id.itemTextView };

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.

listitemlayout,

c, from, to);

ListView lv = (ListView)findViewById(R.id.contactListView);

lv.setAdapter(adapter);

4.2.Добавьте обработчик  onItemClickListener для ListView. При вы- боре контакта  из списка в родительскую Активность должен воз- вращаться путь к выбранному элементу:

lv.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {

// Переместите Курсор к выбранному элементу. c.moveToPosition(pos);

// Извлеките идентификатор строки.

int rowId = c.getInt(c.getColumnIndexOrThrow("_id"));

// Соберите воедино результирующий путь URI.

Uri outURI = Uri.parse(data.toString() + rowId); Intent outData = new Intent(); outData.setData(outURI); setResult(Activity.RESULT_OK, outData);

finish();

}

});

4.3.Закройте метод onCreate:

}

5. Отредактируйте манифест приложения, заменив тег intent-filter для Активности и добавив поддержку действия  ACTION_PICK, при- менимого к контактным данным:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.paad.contactpicker">

<application android:icon="@drawable/icon">

<activity android:name="ContactPicker" android:label="@string/app_

name">

<intent-filter>

<action android:name="android.intent.action.PICK"></action>

<category android:name="android.intent.category.DEFAULT"></ca-

tegory>

<data android:path="contacts" android:scheme="content"></data>

</intent-filter>

</activity>

</application>

</manifest>

6. На этом заканчивается работа с дочерней  Активностью. Чтобы  про- верить ее, создайте новую тестовую Активность ContentPickerTester, новый ресурс для разметки  contentpickertester.xml, содержа- щий элемент TextView для отображения выбранного контакта, а также кнопку Button, чтобы запустить дочернюю Активность.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

android:layout_width="fill_parent" android:layout_height="fill_parent"

<TextView android:id="@+id/selected_contact_textview" android:layout_width="fill_parent" android:layout_height="wrap_content"

/>

<Button android:id="@+id/pick_contact_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pick Contact"

/>

</LinearLayout>

7. Переопределите метод onCreate из класса ContentPickerTester, до- бавив в него реализацию OnClickListener для элемента  Button, что- бы при нажатии  запускалась новая дочерняя  Активность с действием ACTION_PICK и путем URI к базе данных, содержащей контактную информацию (content://contacts/).

package com.paad.contactpicker;

import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri;

import android.os.Bundle;

import android.provider.Contacts.People;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class ContentPickerTester extends Activity {

public static final int PICK_CONTACT = 1;

@Override

public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.contentpickertester);

Button button = (Button)findViewById(R.id.pick_contact_button);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View _view) {

Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/"));

startActivityForResult(intent, PICK_CONTACT);

}

});

}

}

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

@Override

public void onActivityResult(int reqCode, int resCode, Intent data) {

super.onActivityResult(reqCode, resCode, data);

switch(reqCode) {

case (PICK_CONTACT) : {

if (resCode == Activity.RESULT_OK) {

Uri contactData = data.getData();

Cursor c = managedQuery(contactData, null, null, null);

c.moveToFirst();

String name = c.getString(c.getColumnIndexOrThrow(People.NAME)); TextView tv = (TextView)findViewById(R.id.selected_contact_

textview);

tv.setText(name);

}

break;

}

}

}

9. Закончив с тестовой Активностью, внесите ее в манифест своего приложе- ния. Вам также необходимо добавить полномочие READ_CONTACTS внутри тега uses-permission, чтобы открыть приложению доступ к базе данных контактов.

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.paad.contactpicker">

<application android:icon="@drawable/icon">

<activity android:name=".ContactPicker" android:label="@string/app_

name">

<intent-filter>

<action android:name="android.intent.action.PICK"></action>

<category android:name="android.intent.category.DEFAULT"></

category>

<data android:path="contacts" android:scheme="content"></data>

</intent-filter>

</activity>

<activity android:name=".ContentPickerTester" android:label="Contact Picker Test">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

<uses-permission android:name="android.permission.READ_CONTACTS"/>

</manifest>

Запустите Активность и нажмите кнопку. При этом должна появиться

Активность ContactPicker, как показано на рис. 5.1.

После  того, как выберете  контакт,  родительская Активность  должна отобразить  его имя, выйдя на передний план, как показано на рис. 5.2.

Рис. 5.1.

Рис. 5.2.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии