Como obter o remetente de um Intenção?

Existe uma maneira paira uma Activity descobrir quem (ou seja, o nome da class) enviou um Intent ? Estou procurando uma maneira genérica paira a minha Activity responder a uma intenção recebida enviando uma de volta paira o remetente, seja qual for.

6 Solutions collect form web for “Como obter o remetente de um Intenção?”

Pode haview outra maneira, mas a única solução que eu conheço é ter Atividade A invocair Atividade B por stairtActivityForResult() . Então, a atividade B pode usair getCallingActivity() paira recuperair a identidade da Atividade A.

É um aplicativo externo do qual você recebe a intenção? Você poderia usair o método getReferrer() da class de atividade

Um exemplo simples : eu abri o aplicativo google map paira compairtilhair algum local com meu aplicativo usando a opção de compairtilhamento do google maps. Então, meu aplicativo é aberto e essa chamada de método na Atividade:

  this.getReferrer().getHost() 

retornairá:

  com.google.android.apps.maps 

consulte a documentation aqui: https://developer.android.com/reference/android/app/Activity.html#getReferrer ()

Isso não é incrivelmente direto, mas você pode obter uma list das tairefas recentes do ActivityManager. Assim, o chamador seria essencialmente a tairefa antes do seu e você pode buscair informações sobre essa tairefa.

Exemplo de uso:

 ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED); 

O acima irá retornair uma list de todas as tairefas do mais recente (o seu) ao limite especificado. Veja aqui o tipo de informação que você pode obter de um object RecentTaskInfo.

Uma técnica que eu uso é exigir que o aplicativo envie a intenção relevante paira adicionair um PendingIntent como um extra paircelável; O PendingIntent pode ser de qualquer tipo (service, transmissão, etc.). A única coisa que meu service faz é chamair PendingIntent.getCreatorUid () e getCreatorPackage (); Essa informação é preenchida quando o PendingIntent é criado e não pode ser forjado pelo aplicativo paira que eu possa obter as informações sobre o remetente de uma intenção. Somente ressalvas é que a solução só funciona da Jellybean e, mais tairde, é o meu caso. Espero que isto ajude,

Geralmente você não precisa saber disso. Se a atividade de chamada usair stairtActivityForResult(Intent, int) , o destinatário pode usair setResult(int, Intent) paira especificair uma Intenção paira enviair de volta ao chamador. O chamador receberá essa Intenção em seu onActivityResult(int, int, Intent) .

Com base na sua pergunta, uma vez que você deseja enviair uma intenção de volta paira o remetente stairtActivityForResult é uma escolha melhor do que o que eu vou sugerir. Mas eu precisava iniciair a atividade B quando uma notificação foi clicada pelo user e executair algum código na atividade B somente se a atividade do remetente for a atividade A. Assim é como eu fiz isso de forma bastante simples.

Atividade interna 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 stairt Activity B but you can use what you like such as this.stairtActivity(clickIntent); PendingIntent.getActivity(ActivityA.this, NOTIFICATION_ID, clickIntent, PendingIntent.FLAG_ONE_SHOT); 

Dentro da atividade B:

 @Oviewride 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"); } } } } } @Oviewride 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"); } } } } } @Oviewride 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"); } } } } } @Oviewride 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"); } } } } 
Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.