Подтвердить что ты не робот

Как найти источник намерений в Android?

Возможный дубликат:
Android: Как получить отправителя намерения?

Есть ли способ в android найти исходную активность, которая запускает INTENT (в целевой активности)?

Сценарий: у меня есть два вида действий A и B. Оба огня нацелены на вызов активности C. Активность C отображает дополнительную информацию на основе ее источника. Например. Если вызов происходит от A, то C отображает только 2 текстовых изображения, тогда как в случае намерения, активированного B, активность C отображает 3 текстовых изображения (в основном больше информации, основанной на том, кто является вызывающим).

Чтобы установить это, я должен знать, кто уволил цель, называя C. Как это сделать?

4b9b3361

Ответ 1

Лучшим способом сделать это будет использование дополнительных опций Intent для передачи параметров получателю.

Ответ 2

Если мы посмотрим на класс Intent.java, мы увидим, что члены включали только

private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private HashSet<String> mCategories;
private Bundle mExtras;

Я не думаю, что любой из этих членов включает информацию отправителя, отвечая на вопрос №. Вы не могли бы сделать это для произвольного намерения.

Ответ 3

Можно ли считать это обходным способом?

Попросите A и B вызвать startActivityForResult вместо startActivity, затем вы можете вызвать getCallingActivity().getClassName() для извлечения источника.

Ответ 4

Если приложение C имеет разрешение GET_TASKS, вы можете увидеть, какая была последняя задача.

ActivityManager man = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> list = man.getRecentTasks(1, 0);
//You might want to check if(list.size() > 0)

Intent caller = list.get(0).baseIntent;
//look at caller.getComponent() for the package and class

В моем тестировании я обнаружил, что baseIntent в верхней части последнего стека задач был самым надежным идентификатором. Существует больше дискуссий о том, почему вы не захотите сделать это в fooobar.com/info/163227/...

Я полагаю, что если у вас есть контроль над A и B, вы можете заставить их вызвать результат, как уже упоминалось.