Services vs IntentServices - Android
Autor: Felipe Bonezi | Publicado: 2013-12-05T00:31:00-03:00


 
  A arquitetura Android possui várias "maravilhas" e facilidades que auxiliam os desenvolvedores na hora de criar aplicativos robustos e versáteis. Duas dessas "maravilhas" são as classes Service e IntentService, onde cada uma possui sua particulariedade, vantagens e metodologias de implementação.
  Para tanto, é necessário saber quando devemos utilizar uma classe ou outra a fim de não fazer uma escolha errônea, afinal, quanto menos manutenção em nosso código fizermos, MENOS DOR DE CABEÇA! :-)
 

 
  Para exemplificarmos melhor, trago abaixo uma pequena tabela compartiva para que vocês analisem e escolham qual classe implementar em seu projeto.

  
   
    
    Service.class
    IntentService.class
   
   
    Quando usar?
    Tarefas sem conteúdos visuais (UI), mas sem excesso de tempo de execução. Caso for utilizar em longos processos, utilize em conjunto com Threads.
    Geralmente, efetua longos processos sem comunicação com a UIThread. Caso seja necessário, recomendo utilizar Handlers ou Broadcast Intents.
   
   
    Como usar?
    Utilizando a chamada para startService(...), bindService(...) através do método onStartCommand(...).
    Utilizando Intent apenas.
   
   
    Executada a partir de qual Thread?
    Qualquer Thread - com Context.
    Apenas na UIThread uma vez que Intent's são utilizadas na UIThread, mas geram outras WorkerThreads.
   
   
    Funciona em qual Thread?
    UIThread ou Remote (Implementando o AIDL).
    Em uma WorkerThread separada.
   
   
    Desvantagens
    Pode travar a UIThread, se mal implementada.
    Não executa tarefas paralelas e caso seja necessário rodar múltiplas instâncias do IntentService, será gerado uma Fila - Queue - na mesma WorkerThread.
   
  
 

 
  
   Service.class
  
  
   public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
     return new MyServiceBinder();
    }

    ...

    public int onStartCommand(Intent intent, int flags, int startId) {
     Log.d("Tag", "Service executado com sucesso!");
     return super.onStartCommand(intent, flags, startId);
    }

    private class MyServiceBinder extends Binder {

     public MyService getService() {
      return MyService.this;
     }

    }

   }
  

  
   IntentService.class
  
  
   public class MyIntentService extends IntentService {

    private static final String TAG = "myIntentServiceTag";

    public MyIntentService() {
     super(TAG);
    }

    ...

    public void onHandleIntent(Intent intent) {
     Bundle extras = intent.getExtras();
     if (extras.containsKey("pergunta")) {
      String pergunta = extras.getString("pergunta");
      Log.d("Tag-IntentService", "A pergunta foi: " + pergunta);
     }
    }

   }
  

  Activity
  
   public class MainActivity extends Activity {

    ...

    private ConnectionService mConn;

    ...

    public void startService() {
      // Executando um Service...
      Intent intent = new Intent(this, MyService.class);
      startService(intent);
    }

    public void bindService() {
     if (mConn == null) {
      mConn = new ServiceConnection() {

       @Override
       public void onServiceConnected(ComponentName name, IBinder service) {
        MyService myService = ((MyService) service).getService();
        // Você pode chamar o método manualmente!
        myService.onStartCommand(...);
       }

       @Override
       public void onServiceDisconnected (ComponentName name) {
        // unbind(...) foi chamado! :-)
       }

      };
     }

     Intent intent = new Intent(this, MyService.class);
     bindService(intent, mConn, Context.BIND_AUTO_CREATE);
    }

    public void startIntentService() {
     Intent intent = new Intent(this, MyIntentService.class);
     intent.putExtra("pergunta", "IntentService foi executado?");
     startService(intent);
    }

    @Override
    public void onDestroy() {
     super.onDestroy();

     // Não esqueça!
     if (mConn != null) {
      unbindService(mConn);
     }
    }

   }
  
 

 
  Pense direito antes de implementar o tipo de Service que você deseja, ambos possuem suas vantagens e desvantagens!
  Espero que ajude, abraço.