Връщане на резултати от дейности

Дейност, стартирана с метода startActivity, губи своята родителска зависимост и не връща никакви резултати, когато бъде затворена.

Можете да стартирате дейност като дъщерен обект, който е неразривно свързан с родителския екземпляр. Когато е затворена, дъщерната дейност задейства манипулатор вътре в родителската дейност. Този механизъм е идеален в ситуации, в които една дейност предоставя вход (като потребителят избира елемент от списък) на друга.

Детските дейности се различават от всички други по начина, по който се стартират. Те трябва да бъдат регистрирани в манифеста на приложението. Всъщност всяка дейност, спомената в манифеста, може да стане дете. Това се отнася както за системни, така и за дейности на трети страни.

Стартиране на дъщерни дейности.Методът startActivityForResult работи по същия начин като startActivity, но с една важна разлика. В допълнение към изричните или неявни намерения, използвани за определяне на желаната дейност, можете също да подадете код на заявка. Тази стойност по-късно се използва за уникално идентифициране на дъщерната дейност, която е върнала резултата.

Рамката за стартиране на дъщерна дейност е показана в списък 5.3.

Списък 5.3.Стартиране на дейност, която трябва да върне резултат

private static final int SHOW_SUBACTIVITY = 1;

Намерение за намерение = ново намерение (това, MyOtherActivity.class);

Детска дейност, както всяка друга, може да бъде стартирана изрично и косвено. Списък 5.4 използва имплицитно намерение за стартиране на дейност за избор на контакт.

Списък 5.4.Неявно стартиране на дейност, която трябва да върне резултат

private static final int PICK_CONTACT_SUBACTIVITY = 2;

Uri uri =Uri.parse("content://contacts/people"); Intent намерение = ново намерение (Intent.ACTION_PICK, uri); startActivityForResult(намерение, PICK_CONTACT_SUBACTIVITY);

Връщане на резултати.Когато дъщерната дейност е готова да върне резултат, извикайте метода setResult, преди да го прекратите с функцията за завършване. Той приема два параметъра: резултатния код и самия резултат, представен като намерение.

Полученият код ви казва с какво е завършил резултатът от дейността, като правило той е или Activity.RESULT_OK, или Activity.RESULT_CANCELED. В някои случаи трябва да използвате свой собствен код за връщане, за да управлявате специфични за приложението опции. Методът setResult поддържа всяка целочислена стойност.

Списък 5.5 е част от метода onCreate на дъщерната дейност и показва как бутоните OK и Cancel могат да върнат различни резултати към родителския компонент на приложението.

Списък 5.5.Създаване на нови общи настройки

Бутон okButton = (Бутон) findViewById(R.id.ok_button);

public void onClick (изглед на преглед)

Uri данни = Uri.parse("content://horses/" + selected_horse_id);

Резултат от намерение = ново намерение (нула, данни);

Списък 5.5(продължение)

result.putExtra(IS_INPUT_CORRECT, inputCorrect); result.putExtra(SELECTED_PISTOL, selectedPistol); setResult(RESULT_OK, резултат);

Бутон cancelButton = (Бутон) findViewById(R.id.cancel_button);

Ако дейността е била затворена от потребителя, когато е натиснат хардуерният бутон за връщане назад или ако методът за завършване е бил извикан преди setResult, полученият код ще бъде зададен на RESULT_CANCELED и върнатото намерение ще покаже нула.

Обработване на резултатите, върнати отдъщерни дейности.Когато дъщерна дейност е затворена вътре в родителския компонент, манипулаторът onActivityResult се задейства. Заменете този метод, за да обработвате резултатите, върнати от дъщерната дейност.

Манипулаторът onActivityResult приема няколко параметъра.

• Код за заявка.Кодът, използван за стартиране на дейността, която връща резултата.

• Код на резултата.Кодът на резултата, зададен от дъщерната дейност и указващ как е приключила. Тя може да бъде всяка целочислена стойност, но обикновено или дейност. RESULT_OK или Activity.RESULT_CANCELED.

ЗАБЕЛЕЖКА

Ако дъщерната дейност приключи неочаквано или ако не е зададен резултатен код преди затварянето й, този параметър ще стане Activity.RESULT_CANCELED.

• Данни.Намерението, използвано за пакетиране на върнатите данни. В зависимост от целта на дъщерната дейност, тя може да включва URI път, представляващ избраната част от съдържанието. Като алтернатива (или в допълнение), дъщерна дейност може да върне информация като прости стойности, обвити в допълнителни параметър Intent.

Листинг 5.6 показва рамка за внедряване на манипулатор на събития onActivityResult, поставен вътре в Activity.

Списък 5.6.Реализация на манипулатора onActivityResult

private static final int SHOW_SUB_ACTIVITY_ONE = 1;

private static final int SHOW_SUB_ACTIVITY_TWO = 2;

public void onActivityResult(int requestCode, int resultCode, Intent data)

super.onActivityResult(requestCode, resultCode, data);

boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT,

String selectedPistol =data.getStringExtra(SELECTED_PISTOL);

if (resultCode == Activity.RESULT_OK)

// TODO: Манипулиране с натискане на бутона OK.