2012-01-30 19 views
12

ho incontrato qualcosa di simile nel AndroidManifest.xml:Android BroadcastReceiver senza alcun intento filtro

<receiver android:name="com.testco.test.TestReceiver"/> 

Quanto sopra è TestReceiver estende la classe BroadcastReceiver. Ho pensato che il destinatario ricevesse tutti gli intenti, ma a quanto pare non lo fa, e non funziona a meno che non aggiunga tag filtro intent-in. Quindi cosa fa se non ha un filtro intent? È un errore di battitura o fa davvero qualcosa?

UPDATE: ho pensato che questo fuori con l'aiuto di questo link Trying to have a Broadcast Receiver with No filter

Invece di chiamare una trasmissione con il solito identificatore di stringa, è possibile impostare una stringa di azione per l'intento, poi trasmesso esso. Esempio di codice di riferimento:

Intent notifyIntent = new Intent(getApplicationContext(), TestReceiver.class); 
notifyIntent.setAction("RECEIVE"); 
sendBroadcast(notifyIntent); 

La gestione al BroadcastReceiver è la stessa.

+0

Chiunque abbia scritto quel codice, dice loro che il loro stile di azione non segue lo standard. Dovrebbe seguire com.packagename.intent.messagehere, questo è lo standard che è stato inserito e come tale dovrebbe essere seguito. – JoxTraex

risposta

6

Un filtro Intento è necessario in caso di intent impliciti e, se non viene specificato un filtro intent, deve essere richiamato esplicitamente. Quindi, per invocare questo ricevitore si avrebbe bisogno di richiamare:

Intent intent = new Intent(getApplicationContext(), com.testco.test.TestReceiver.class); 
sendBroadcast(intent);` 
+0

Ehi, Alex, è da un po '. Ho una breve domanda sulla tua risposta. Quando dici implicito, questo significa quando potrebbero esserci più azioni diverse da intraprendere? – Andy

+0

Gli intent impliciti sono gli intenti in cui non si specifica esplicitamente il componente di destinazione, il componente di destinazione viene deciso dal sistema attraverso i filtri di intent. – jeet

2

Dal documentation:

Android: esportati: Se o non il ricevitore di broadcast può ricevere messaggi provenienti da fonti esterne sua applicazione - "veri", se può, e "falsi" in caso contrario. Se "falso", gli unici messaggi che il ricevitore di broadcast può ricevere sono quelli inviati dai componenti della stessa applicazione o dalle applicazioni con lo stesso ID utente.

Il valore predefinito dipende dal fatto che il ricevitore di trasmissione contenga filtri di intent. L'assenza di filtri significa che può essere invocato solo da oggetti Intent che specificano il suo nome esatto della classe. Ciò implica che il ricevitore è inteso solo per uso interno all'applicazione (dato che altri normalmente non conoscono il nome della classe). Quindi in questo caso, il valore predefinito è "falso". D'altro canto, la presenza di almeno un filtro implica che il destinatario della trasmissione sia destinato a ricevere intenti trasmessi dal sistema o da altre applicazioni, pertanto il valore predefinito è "true".

Così il ricevitore catturerà solo gli Intenti trasmessi dall'applicazione.

0

È necessario registrare il proprio ricevitore specificando le intenzioni che si desidera ricevere e se si desidera ricevere tutte le intenzioni poi parlarne.

I filtri Intent e Intent sono chiaramente menzionati nell'API come funzionano. Il concetto di tutti gli effetti non è supportato nell'API pubblica.

Nota: È ancora possibile utilizzare questo tipo di ricevitore all'interno della vostra app inviando trasmissione all'interno della vostra app.

0

<receiver android:name="com.testco.test.TestReceiver"/> tag dirà ad androidososososososososono che è così. non dirà per quale evento è destinato ad ascoltare. Il tuo filtro di intenti definirà, per quale evento stai elencando. ad esempio,

<receiver android:name="com.testco.test.TestReceiver"/> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

questo codice dice ad android os che, sono ricevitore e sto elencando per avviare l'evento.Quindi, quando l'utente riavvia il telefono, verrà chiamato questo ricevitore brodcast.

Problemi correlati