Есть ли способ для Activity
узнать, кто (то есть имя класса) отправил Intent
? Я ищу общий способ для моего Activity
ответить на полученное намерение, отправив его обратно отправителю, кем бы это ни было.
Как получить отправителя намерения?
Ответ 1
Может быть другой способ, но единственным решением, которое я знаю, является то, что Activity A вызывает Activity B через startActivityForResult()
. Затем Activity B может использовать getCallingActivity()
для получения идентификатора активности A.
Ответ 2
Это внешнее приложение, от которого вы получаете намерение? Вы можете использовать метод getReferrer()
класса активности
Простой пример. Я открыл приложение карты Google для совместного использования своего местоположения с моим приложением, используя параметр общего доступа к картам google. Затем открывается мое приложение, и этот метод вызывает в Activity:
this.getReferrer().getHost()
вернется:
com.google.android.apps.maps
см. документацию здесь: https://developer.android.com/reference/android/app/Activity.html#getReferrer()
Обратите внимание, что для этого требуется API 22. Для более старых версий Android см. ответ от ajwillliams
Ответ 3
Это не невероятно прямо, но вы можете получить список последних задач из ActivityManager. Таким образом, вызывающая сторона будет по существу быть перед вами, и вы можете получить информацию об этой задаче.
Пример использования:
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED);
Вышеприведенный вернет список всех задач от последних (ваших) до указанного предела. См. Docs здесь для типа информации, которую вы можете получить из объекта RecentTaskInfo.
Ответ 4
Используемая мной техника заключается в том, чтобы потребовать, чтобы приложение отправило соответствующее намерение, чтобы добавить PendingIntent в качестве дополнительной возможности; PendingIntent может быть любого типа (услуга, трансляция и т.д.). Единственное, что делает моя служба, это вызвать PendingIntent.getCreatorUid() и getCreatorPackage(); эта информация заполняется при создании PendingIntent и не может быть подделана приложением, поэтому я могу получить информацию об отправителе Intent. Только оговорка заключается в том, что это решение работает только от Jellybean, а позже это мой случай. Надеюсь, это поможет,
Ответ 5
Как правило, вам не нужно это знать. Если вызывающая деятельность использует startActivityForResult(Intent, int)
, вызываемый может использовать setResult(int, Intent)
, чтобы указать намерение отправить обратно вызывающему абоненту. Вызывающий абонент получит это намерение в методе onActivityResult(int, int, Intent)
.
Ответ 6
Исходя из вашего вопроса, так как вы хотите отправить намерение обратно отправителю startActivityForResult, это лучший выбор, чем я предлагаю. Но мне нужно было начать работу B, когда пользователь нажимает на уведомление и выполняет какой-то код в действии B только в том случае, если активность отправителя является активностью A. Именно так я сделал это довольно просто.
Внутри действия A:
String senderName = this.getClass().getSimpleName();
Intent clickIntent = new Intent(ActivityA.this, ActivityB.class);
clickIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
clickIntent.putExtra("SENDER_CLASS_NAME", senderName);
//I use PendingIntent to start Activity B but you can use what you like such as this.startActivity(clickIntent);
PendingIntent.getActivity(ActivityA.this, NOTIFICATION_ID, clickIntent, PendingIntent.FLAG_ONE_SHOT);
Внутри Activity B:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
if(bundle.containsKey("SENDER_CLASS_NAME")){
String senderName = bundle.getString("SENDER_CLASS_NAME");
//Execute some code
Log.d("GCM", "Notifications clicked");
}
}
}
}