2010-08-30 16 views
12

Sono nuovo ad Android. Io cosa sapere la differenza tra Intent e BroadcastReceiver. Sono più confuso con BroadcastReceiver rispetto a Intent.Ricevitore Android-Broadcast

Please help me out. Il codice semplice sarà utile.

+0

** Vedi questo link ** https://stackoverflow.com/questions/15698790/broadcast-receiver-for-checking-internet-connection-in-android-app/44881551#44881551 –

risposta

30

Ok, lo spiegherò con un esempio.

Supponiamo di voler creare un'app per controllare lo stato della metropolitana dalla sua pagina web. Voglio anche una notifica di sistema se la metropolitana non funziona bene.

avrò:

  • Un Activity per mostrare i risultati.
  • A Service per verificare se la metropolitana funziona e mostrare una notifica se non funziona.
  • A Broadcast Receiver chiamato Alarm Receiver per chiamare il servizio ogni 15 minuti.

Mi permetta di mostrare un po 'di codice:

/* AlarmReceiver.java */ 
public class AlarmReceiver extends BroadcastReceiver { 
    public static final String ACTION_REFRESH_SUBWAY_ALARM = 
      "com.x.ACTION_REFRESH_SUBWAY_ALARM"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent startIntent = new Intent(context, StatusService.class); 
     context.startService(startIntent); 
    } 
} 

Spiegazione: Come si può vedere è possibile impostare un allarme. e quando viene ricevuto l'allarme, usiamo un intent per avviare service. Fondamentalmente il intent è un msg che può avere azioni, un materiale serializzato.

public class StatusService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mAlarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     Intent intentToFire = new Intent(AlarmReceiver.ACTION_REFRESH_ALARM); 
     mAlarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0); 
    } 

    @Override 
    public void onStart(Intent intent, int arg1) { 
     super.onStart(intent, arg1); 
     Log.d(TAG, "SERVICE STARTED"); 
     setAlarm(); 
     Log.d(TAG, "Performing update!"); 
     new SubwayAsyncTask().execute(); 
     stopSelf(); 
    } 

    private void setAlarm() { 
     int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
     mAlarms.setInexactRepeating(alarmType, SystemClock.elapsedRealtime() + timeToRefresh(), 
        AlarmManager.INTERVAL_HALF_DAY, mAlarmIntent); 
    } 

} 

Spiegazione:

I service si avvia e:

  • Impostare l'allarme per la chiamata successiva. (Controllare l'intento è usato solo un msg.)
  • chiama un AsyncTask che si occupa di aggiornare un notificare il Activity

Non ha senso per incollare il AsyncTask, ma quando è finito chiama:

private void sendSubwayUpdates(LinkedList<Subway> subways) { 
     Intent intent = new Intent(NEW_SUBWAYS_STATUS); 
     intent.putExtra("subways", subways); 

     sendBroadcast(intent); 
} 

questo modo si crea un nuovo Intent con una certa NEW_SUBWAYS_STATUS azione, mettere dentro l'intento metropolitane e sendBroadcast. Se qualcuno è interessato a ricevere queste informazioni, avrà un ricevitore.

Spero di essere stato chiaro.

PS: Alcuni giorni fa qualcuno ha spiegato broadcast e intenti in un modo molto interessante. Qualcuno vuole condividere la sua birra, quindi invia una trasmissione con l'intento di agire: "FREE_BEER" e con un extra: "Un bicchiere di birra".

+0

Sei sicuro che puoi testarlo con Subway Alarm? – Sayka

3

Gli stati API:

Un BroadcastReceiver è una classe di base per il codice che riceverà intenti inviati da sendBroadcast().

Un intento è una descrizione astratta di un'operazione da eseguire.

Quindi, un BroadcastReceiver è solo un'attività che risponde a Intenti. È possibile inviare le proprie trasmissioni o persino il dispositivo Android in grado di inviare queste trasmissioni a livello di sistema, incluse cose come la batteria scarica o il dispositivo appena avviato.

+0

Ritengo che BroadcastReceiver sia veramente confuso come parte dei servizi. Tuttavia, li ho usati alcune volte per avere messaggi di interattività semplici, come l'invio a uno nel back stack. Nessun servizio necessario per usarlo. "Ehi, c'è stato un cambio di utente. Rispondi ad esso!" –

+1

Un BroadcastReceiver non è un'attività! – Shatazone

Problemi correlati