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

Как получить отправителя намерения?

Есть ли способ для Activity узнать, кто (то есть имя класса) отправил Intent? Я ищу общий способ для моего Activity ответить на полученное намерение, отправив его обратно отправителю, кем бы это ни было.

4b9b3361

Ответ 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");
                }
            }
        }
    }