Un service ti serve per effettuare operazioni in background, e non necessita di interfaccia grafica. Se i dati da scaricare li utilizza solo la tua Activity potresti fare un metodo che crea un nuovo thread e finirla li. Ma se l'operazione può servire ad altre Activity della tua app ritengo sia molto più pulito creare un service con un thread che gestisca queste operazioni, rende la struttura più modulare ed evita la ridondanza del codice.
Nel caso in cui volessi una interazione tra la tua activity ed il service lo avvi come bound service, con il comando bindService() e setti una connessione (ti rimando alla documentazione per questa parte
Service | Android Developers). Così potrai richiamare tu stesso i metodi del service es:
mService.downloadData();In ogni caso essendo il download di dati una operazione long-running di durata indefinita non potrai mai sapere quando finirà di scaricare i dati, quindi ti consiglio di implementare anche un broadcast receiver nell'activity che riceverà un intent dal service non appena avrà finito il download, in questo modo avrai la certezza che i dati siano arrivati ed eviterai una marea di NullPointerException.
L'oggetto application non l'ho mai utilizzato, mi sembra una soluzione sporca per estendere la visibilità di alcuni dati a tutta l'applicazione, aspetterei qualcuno più esperto per sentire cosa ne pensa.
Buon lavoro
