C'è un modo per un Activity
per scoprire chi (nome della classe) ha inviato uno Intent
? Sto cercando un modo generico per il mio Activity
per rispondere a un intento ricevuto inviandone uno al mittente, chiunque sia.Come ottenere il mittente di un intent?
risposta
Potrebbe esserci un altro modo, ma l'unica soluzione che so è che l'attività A ha richiamato l'attività B tramite startActivityForResult()
. Quindi l'attività B può utilizzare getCallingActivity()
per recuperare l'identità dell'Attività A.
Generalmente non è necessario saperlo. Se l'attività di chiamata utilizza startActivityForResult(Intent, int)
, il destinatario può utilizzare setResult(int, Intent)
per specificare un intent da inviare al chiamante. Il chiamante riceverà questo intento nel suo metodo onActivityResult(int, int, Intent)
.
L'intento di 'setResult' viene inviato solo quando l'attività figlio è chiusa. Mi piacerebbe essere in grado di rinviare arbitrariamente gli intenti all'attività dei genitori mentre l'attività dei bambini è operativa. – zer0stimulus
Questo non è incredibilmente diretto ma è possibile ottenere un elenco delle attività recenti da ActivityManager. Quindi il chiamante sarebbe essenzialmente il compito prima del tuo e tu puoi recuperare informazioni su quell'attività.
Esempio di utilizzo:
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED);
È possibile che questo restituirà un elenco di tutti i compiti dalla più recente (il vostro) per il limite specificato. Vedere i documenti here per il tipo di informazioni che è possibile ottenere da un oggetto RecentTaskInfo.
getRecentTasks è obsoleto in API 21 e non funzionerà più per gli stack che non appartengono alla tua app. Vedere http://developer.android.com/reference/android/app/ActivityManager.html#getRecentTasks(int, int) –
Una tecnica che uso è richiedere all'applicazione di inviare l'Intent rilevante per aggiungere un PendingIntent come extra Parcelable; il PendingIntent può essere di qualsiasi tipo (servizio, trasmissione, ecc.). L'unica cosa che fa il mio servizio è chiamare PendingIntent.getCreatorUid() e getCreatorPackage(); questa informazione viene popolata quando PendingIntent viene creato e non può essere falsificato dall'app in modo da ottenere le informazioni sul mittente di Intent. Solo l'avvertenza è che la soluzione funziona solo da Jellybean e in seguito, che è il mio caso. Spero che questo aiuti,
Come si richiede loro di inviare un PendingIntent? Non vedo un'opzione intent-filter per questo. Ti basta inserire intenti che non ne hanno uno come extra? – TBridges42
Sembra una cattiva idea a prima vista. Un'app malevola non potrebbe falsificare il 'PendingIntent'? Certo, 'PendingIntent' non ha un costruttore pubblico ma' readPendingIntentOrNullFromParcel' sembra che potrebbe fare il trucco, no? – Giszmo
@Giszmo bene i documenti getCreatorUid() dichiarano che non può essere falsificato. Non sei sicuro di come viene gestita la serializzazione, ma devono esserci alcune misure di sicurezza speciali, come la firma dei contenuti serializzati con una chiave privata di proprietà del creatore. Detto questo, come sottolineano i documenti getCreatorUid(), devi comunque stare attento a questa strategia. Solo perché alcuni pacchetti X hanno un PendingIntent creato da Y non significa che X == Y. Y potrebbe aver inviato il PendingIntent a X per scopi non correlati. E Y inviando un PendingIntent a X significa che Y si fida di X con quella particolare azione, non in generale. –
Sulla base alla tua domanda, dal momento che si desidera inviare un intento torna al startSubActivity mittente è una scelta migliore di quello che sto per suggerire. Ma avevo bisogno di avviare l'attività B quando l'utente ha fatto clic su una notifica ed eseguire del codice nell'attività B solo se l'attività del mittente è l'attività A. Ecco come l'ho fatto in modo molto semplice.
All'interno Attività 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);
All'interno Attività 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");
}
}
}
}
E 'un app esterna si riceve l'intento da? È possibile utilizzare il metodo della classe di attività
Un semplice esempiogetReferrer()
: Ho aperto Google Map app per condividere alcune posizione con la mia app utilizzando l'opzione quota di google maps. Poi la mia app si apre e questa chiamata di metodo nella attività:
this.getReferrer().getHost()
tornerà:
com.google.android.apps.maps
vedere la documentazione qui: https://developer.android.com/reference/android/app/Activity.html#getReferrer()
Si noti che questo richiede API 22.Per le versioni precedenti di Android vedere la risposta di ajwillliams
Cosa succede se la tua app è già stata aperta e rimane in background mentre usi la funzione di condivisione in google maps. Restituirà ancora il packagename di google maps? – mathew11
getReferrer() richiede API22 (Android 5.1). Cosa fare nelle versioni inferiori come 4.4? –
Alcuni codici per verificare l'API22: String startedFrom = null; if (android.os.Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP_MR1) { startedFrom = this.getReferrer(). GetHost(); } – FrankKrumnow
- 1. Come determinare il mittente di Broadcast Intent
- 2. android: convalidare l'identità del mittente di intent
- 3. come ottenere mittente di TouchableHighlight onPress
- 4. Come ottenere il contesto in un servizio Intent
- 5. Android: come ottenere il numero di telefono del mittente e del destinatario da sms primari
- 6. mittente all'interno di un futuro
- 7. Come ottengo il valore di tag dal mittente
- 8. Come iniziare un intent da un ResolveInfo
- 9. Come passare un URI a un intent?
- 10. Creazione di eventi personalizzati - Mittente oggetto o Mittente digitato?
- 11. JavaScript: come ottenere il valore dell'elemento di input del mittente dall'evento keyup?
- 12. Come si imposta il mittente sull'azione di NSMenuItem?
- 13. Perché il metodo onNewIntent (Intent intent) viene chiamato due volte?
- 14. come mantenere attivo un servizio Intent
- 15. Come recuperare l'attività richiesta da parte di un Intent
- 16. BroadcastReceiver come avviare un nuovo intent
- 17. PHP mail() come impostare mittente di posta
- 18. Impossibile ottenere l'indirizzo email del mittente con l'API Java EWS
- 19. Perché Intent servizio deve essere esplicita Intent
- 20. iOS: include il mittente nella dichiarazione IBAction?
- 21. Il mittente UITapGestureRecognizer è il gesto, non l'oggetto ui
- 22. Geo: intent con un placeid
- 23. mittente di statica evento EventHandler
- 24. C# Come ottenere l'indirizzo di posta elettronica del mittente nel componente aggiuntivo di Outlook
- 25. prepareForSegue e PerformSegueWithIdentifier mittente
- 26. Come determinare quale tipo di oggetto è il mittente di un evento?
- 27. Come impostare il nome del mittente Devo per l'e-mail?
- 28. Come impostare il percorso di ritorno su un indirizzo e-mail diverso dall'indirizzo mittente utilizzando JavaMail?
- 29. Come aprire un album nell'app Galleria utilizzando un intent
- 30. Exim - Un sacco di messaggi congelati senza mittente
Stiamo lavorando su una libreria per verificare il mittente e il destinatario di 'Intent's che utilizza questa tecnica per iniziare, dal momento che è la più semplice. Puoi trovare ulteriori informazioni qui https://dev.guardianproject.info/projects/trustedintents/wiki –
Come utilizzare getCallingActivity()? Ho provato ad usarlo per impostare il testo in questo modo: 'txt.setText (getCallingActivity());' ma mostra 'null'. Cosa posso fare per farlo mostrare il nome dell'attività di chiamata? –