Ответ 1
Лучшим способом сделать это будет использование дополнительных опций Intent для передачи параметров получателю.
Возможный дубликат:
Android: Как получить отправителя намерения?
Есть ли способ в android найти исходную активность, которая запускает INTENT (в целевой активности)?
Сценарий: у меня есть два вида действий A и B. Оба огня нацелены на вызов активности C. Активность C отображает дополнительную информацию на основе ее источника. Например. Если вызов происходит от A, то C отображает только 2 текстовых изображения, тогда как в случае намерения, активированного B, активность C отображает 3 текстовых изображения (в основном больше информации, основанной на том, кто является вызывающим).
Чтобы установить это, я должен знать, кто уволил цель, называя C. Как это сделать?
Лучшим способом сделать это будет использование дополнительных опций Intent для передачи параметров получателю.
Если мы посмотрим на класс 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;
Я не думаю, что любой из этих членов включает информацию отправителя, отвечая на вопрос №. Вы не могли бы сделать это для произвольного намерения.
Можно ли считать это обходным способом?
Попросите A и B вызвать startActivityForResult
вместо startActivity
, затем вы можете вызвать getCallingActivity().getClassName()
для извлечения источника.
Если приложение 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, вы можете заставить их вызвать результат, как уже упоминалось.