Come get il mittente di un intento?

C'è un modo per un'attività per scoprire chi (cioè nome di class) ha inviato un Intent ? Sto cercando un modo generico per la mia Activity per rispondere ad un intento ricevuto inviandolo nuovamente al mittente, chiunque sia.

  • Come impostare un carattere personalizzato nel titolo ActionBar?
  • Recupera le coordinate X & Y di un button in android?
  • android google map trovando la distanza
  • Disabilitazione di EditText in android
  • Come posso specificare la width e l'altezza delle celle Android GridLayout in misure relative?
  • NoClassDefFoundError con le librerie in Android Studio
  • 6 Solutions collect form web for “Come get il mittente di un intento?”

    Può essere un altro modo, ma l'unica soluzione che so di avere attività A invoca l'attività B tramite startActivityForResult() . Quindi l'attività B può utilizzare getCallingActivity() per recuperare l'identity framework; di attività A.

    È un'applicazione esterna che ricevi l'intento? È ansible utilizzare il metodo getReferrer() della class attività

    Un esempio semplice : ho aperto l'app Google Maps per condividere alcune località con la mia applicazione utilizzando l'opzione di condivisione di Google Maps. Allora la mia applicazione si apre e questo metodo chiama nell'attività:

      this.getReferrer().getHost() 

    sarà di return:

      com.google.android.apps.maps 

    vedere la documentazione qui: https://developer.android.com/reference/android/app/Activity.html#getReferrer ()

    Questo non è incredibilmente diretto, ma è ansible get un elenco delle attività recenti da ActivityManager. Quindi il chiamante sarebbe essenzialmente l'attività prima del tuo e puoi recuperare informazioni su quel task.

    Esempio di utilizzo:

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

    Quanto sopra restituirà un elenco di tutti i compiti dal più recente (il tuo) al limite specificato. Vedere i documenti qui per il tipo di informazioni che è ansible get da un object RecentTaskInfo.

    Una tecnica che uso è quella di richiedere all'applicazione di submit l'intento appropriato per aggiungere un PendingIntent come un extra parcelable; il PendingIntent può essere di qualsiasi tipo (servizio, trasmissione, ecc.). L'unica cosa che il mio servizio è è call PendingIntent.getCreatorUid () e getCreatorPackage (); queste informazioni vengono popolate quando il PendingIntent viene creato e non può essere forgiato dall'applicazione in modo da poter get le informazioni su un mittente di Intent. Soltanto caveat è che la soluzione funziona solo da Jellybean e più tardi che è il mio caso. Spero che questo ti aiuti,

    Generalmente non c'è bisogno di sapere questo. Se l'attività di chiamata utilizza startActivityForResult(Intent, int) , callee può utilizzare setResult(int, Intent) per specificare setResult(int, Intent) per submit di nuovo al chiamante. Il chiamante riceverà questo intento nel suo onActivityResult(int, int, Intent) .

    Sulla base della tua domanda, poiché si desidera submit un intento al mittente startActivityForResult è una scelta migliore di quello che intendo suggerire. Ma avrei dovuto avviare l'attività B quando una notifica viene cliccata dall'utente e eseguire un codice nell'attività B solo se l'attività del mittente è attività A. In questo modo ho fatto semplicemente.

    Attività all'interno di:

     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); 

    Attività interna 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"); } } } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.