Répondre

2

Si votre service est seulement appelé à partir de votre application, et vous pouvez en faire un singleton, essayez ceci:

public class FileDownloaderService extends Service implements FileDownloader { 
    private static FileDownloaderService instance; 

    public FileDownloaderService() { 
     if (instance != null) { 
      throw new IllegalStateException("This service is supposed to be a singleton"); 
     } 
    } 

    public static FileDownloaderService getInstance() { 
     // TODO: Make sure instance is not null! 
     return instance; 
    } 

    @Override 
    public void onCreate() { 
     instance = this; 
    } 

    @Override 
    public IBinder onBind(@SuppressWarnings("unused") Intent intent) { 
     return null; 
    } 

    @Override 
    public void downloadFile(URL from, File to, ProgressListener progressListener) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // Perform the file download 
      } 
     }).start(); 
    } 
} 

Maintenant, vous pouvez appeler directement les méthodes sur votre service. Appelez simplement downloadFile() pour que le service fonctionne.

À propos de votre réel question de la façon de mettre à jour l'interface utilisateur. Notez que cette méthode reçoit une instance ProgressListener. Il pourrait ressembler à ceci:

public interface ProgressListener { 
    void startDownloading(); 
    void downloadProgress(int progress); 
    void endOfDownload(); 
    void downloadFailed(); 
} 

Maintenant, vous mettez à jour juste l'interface utilisateur de l'activité (pas de service, qui ne connaît toujours pas la façon dont l'interface ressemble).

+0

Je pense que le constructeur 'public FileDownloaderService()' devrait être 'private'. C'est comme ça que Singletons devrait fonctionner ;-) – damienix

+0

C'est marrant de voir votre propre code d'il y a quelques mois, et il vous semble déjà moche: -O. Tu as raison, ça devrait être privé. Mais je crois que cela ne marchera pas (ni mon code dans la réponse), parce que le système d'exploitation va utiliser le constructeur sans argument pour créer le service. Droite? – espinchi

+0

C'était une petite suggestion seulement. Je suis plutôt Android Noob;) mais quel est le problème dans la création de Sevice en utilisant le constructeur sans argument? Comme je le sais, 'onProgressUpdate' de' AsyncTask' peut mettre à jour l'interface utilisateur, peut-être que ce serait une meilleure solution. – damienix