Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Aula 05/06 (Service)

581 views

Published on

Um resumo sobre Service em Android.

  • Be the first to comment

Aula 05/06 (Service)

  1. 1. PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Service
  2. 2. Objetivos da aula  Service
  3. 3. O que é Service?
  4. 4. Uma classe responsável por executar uma determinada tarefa em segundo plano, sem que o usuário perceba.
  5. 5. Precisa uma interface gráfica?
  6. 6. Precisa uma interface gráfica? Não!
  7. 7. O sistema operacional que cuida da tarefa sendo executada em segundo plano. Ele finalizará o serviço caso precise (muito) liberar memória.
  8. 8. Porque Service ao invés de Thread?
  9. 9. Thread não faz parte do ciclo de vida do Android. Service tem prioridade máxima sobre qualquer outro processo em segundo plano.
  10. 10. Mesmo que um Service seja encerrado pelo SO, o Android tentará reiniciá-lo assim que as condições de memória se normalizem.
  11. 11. Para criar um serviço, precisamos estender a classe android.app.Service e mapeá-lo no AndroidManifest. Obrigatóriamente precisamos sobreescrever o método IBinder onBind(intent).
  12. 12. Para iniciá-lo, podemos utilizar os métodos: startService(intent) ou bindService(intent, con, flags).
  13. 13. Qual a diferença?
  14. 14. Entre startService() e bindService()?
  15. 15. startService() faz com que o serviço inicie e execute independente do processo que o criou. Até que o stopService(intent) seja chamado ou até que o próprio serviço chame stopSelf().
  16. 16. Em outras palavras, se a Activity que chamou startService() for finalizada, o serviço continuará sendo executado em segundo plano.
  17. 17. bindService() inicia um serviço caso ainda não esteja em execução ou simplesmente se conecta a ele.
  18. 18. Ao conectarmos ao serviço com bindService() podemos obter uma referência para manipulá-lo. Enquanto mantivermos a referência, estaremos conectados.
  19. 19. Activity para testes...
  20. 20. public class TesteNossoServicoActivity extends Activity { public void onCreate(Bundle savedInstanceState) { ... final Intent intent = new Intent("INICIAR_SERVICO"); Button iniciar = (Button) findViewById(R.id.iniciar); iniciar.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { startService(intent); } }); Button parar = (Button) findViewById(R.id.parar); parar.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { stopService(intent); } }); } }
  21. 21. Service registrado...
  22. 22. <?xml version="1.0" encoding="UTF-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="br.senai.sc” android:versionCode="1”> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".service.TesteNossoServicoActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".service.NossoServico" > <intent-filter> <action android:name="INICIAR_SERVICO" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> </application> </manifest>
  23. 23. NossoServico!
  24. 24. public class NossoServico extends Service implements Runnable { public void onCreate() { } public IBinder onBind(Intent intent) { return null; } public void run() { } }
  25. 25. public class NossoServico extends Service implements Runnable { public void onCreate() { new Thread(this).start(); } public IBinder onBind(Intent intent) { return null; } public void run() { } }
  26. 26. public class NossoServico extends Service implements Runnable { private static final int MAX = 10; protected int count; public void onCreate() { new Thread(this).start(); } public IBinder onBind(Intent intent) { return null; } public void run() { while(count < MAX) { Log.i("exemplo", "NossoServico em execucao..." + count); Thread.sleep(1000); count++; } } }
  27. 27. public class NossoServico extends Service implements Runnable { private static final int MAX = 10; protected int count; private boolean ativo; public void onCreate() { ativo = true; new Thread(this).start(); } public IBinder onBind(Intent intent) { return null; } public void run() { while(ativo && count < MAX) { Log.i("exemplo", "NossoServico em execucao..." + count); Thread.sleep(1000); count++; } stopSelf(); } }
  28. 28. public class NossoServico extends Service implements Runnable { private static final int MAX = 10; protected int count; private boolean ativo; public void onCreate() { ativo = true; new Thread(this).start(); } public IBinder onBind(Intent intent) { return null; } public void run() { while(ativo && count < MAX) { Log.i("exemplo", "NossoServico em execucao..." + count); Thread.sleep(1000); count++; } stopSelf(); } public void onDestroy() { ativo = false; } }
  29. 29. Crie uma tela com os botões iniciar e parar. Associe a tela à Activity. Faça testes e acompanhe o LogCat.
  30. 30. Perceberam que iniciamos o serviço com startService()?
  31. 31. E o bindService()?
  32. 32. Utilizamos o bindService() principalmente para nos conectarmos e manipularmos um serviço, através da interface android.os.IBinder.
  33. 33. Para nos conectarmos ao serviço, precisamos implementar corretamente o método onbind(), que deixamos retornando nulo.
  34. 34. Vamos alterar o exemplo anterior para que seja possível recurar o valor do contador.
  35. 35. Precisamos da interface de comunicação, por enquanto com um método. public interface Contador { int count(); }
  36. 36. Precisamos da interface de comunicação, por enquanto com um método. public interface Contador { int count(); } Nosso serviço que deverá implementar esta interface.
  37. 37. Refatorando nosso serviço...
  38. 38. public class NossoServicoComConexao extends NossoServico { public IBinder onBind(Intent intent) { return null; } }
  39. 39. public class NossoServicoComConexao extends NossoServico implements Contador { public IBinder onBind(Intent intent) { return null; } }
  40. 40. public class NossoServicoComConexao extends NossoServico implements Contador { public IBinder onBind(Intent intent) { return null; } public int count() { return count; } }
  41. 41. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao; public IBinder onBind(Intent intent) { return null; } public int count() { return count; } }
  42. 42. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao; public IBinder onBind(Intent intent) { return conexao; } public int count() { return count; } }
  43. 43. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao = new LocalBinder(); public IBinder onBind(Intent intent) { return conexao; } public int count() { return count; } }
  44. 44. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao = new LocalBinder(); public IBinder onBind(Intent intent) { return conexao; } public int count() { return count; } public class LocalBinder extends Binder { } }
  45. 45. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao = new LocalBinder(); public IBinder onBind(Intent intent) { return conexao; } public int count() { return count; } public class LocalBinder extends Binder { public Contador getContador() { } } }
  46. 46. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao = new LocalBinder(); public IBinder onBind(Intent intent) { return conexao; } public int count() { return count; } public class LocalBinder extends Binder { public Contador getContador() { return NossoServicoComConexao.this; } } }
  47. 47. Registrando este novo serviço no AndroidManifest.xml
  48. 48. <?xml version="1.0" encoding="UTF-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="br.senai.sc” android:versionCode="1”> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".service.TesteNossoServicoActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".service.NossoServicoComConexao“ /> </application> </manifest>
  49. 49. Criando um novo botão na tela para obter o valor do contador...
  50. 50. public class TesteNossoServicoActivity extends Activity implements ServiceConnection { private Contador contador; public void onCreate(Bundle savedInstanceState) { ... final ServiceConnection conexao = this; ((Button) findViewById(R.id.iniciar)).setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { bindService(new Intent(TesteNossoServicoActivity.this, NossoServicoComConexao.class), conexao, Context.BIND_AUTO_CREATE); } }); ((Button) findViewById(R.id.parar)).setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { unbindService(conexao); } }); ((Button) findViewById(R.id.visualizar)).setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { int count = contador.count(); Toast.makeText(TesteNossoServicoActivity.this, “C: " + count, Toast.LENGTH_LONG).show(); } }); } }
  51. 51. public class TesteNossoServicoActivity extends Activity implements ServiceConnection { private Contador contador; public void onCreate(Bundle savedInstanceState) { ... final ServiceConnection conexao = this; ((Button) findViewById(R.id.iniciar)).setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { bindService(new Intent(TesteNossoServicoActivity.this, NossoServicoComConexao.class), conexao, Context.BIND_AUTO_CREATE); } }); ((Button) findViewById(R.id.parar)).setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { unbindService(conexao); } }); ((Button) findViewById(R.id.visualizar)).setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { int count = contador.count(); Toast.makeText(TesteNossoServicoActivity.this, “C: " + count, Toast.LENGTH_LONG).show(); } }); } }
  52. 52. ...continuação...
  53. 53. public class TesteNossoServicoActivity extends Activity implements ServiceConnection { private Contador contador; // ocultado o onCreate()... public void onServiceConnected(ComponentName name, IBinder service) { LocalBinder binder = (LocalBinder) service; contador = binder.getContador(); } public void onServiceDisconnected(ComponentName name) { contador = null; } }
  54. 54. public class TesteNossoServicoActivity extends Activity implements ServiceConnection { private Contador contador; // ocultado o onCreate()... public void onServiceConnected(ComponentName name, IBinder service) { LocalBinder binder = (LocalBinder) service; contador = binder.getContador(); } public void onServiceDisconnected(ComponentName name) { contador = null; } }
  55. 55. É comum iniciarmos o serviço com startService() e após conectarmos com bindService().
  56. 56. Evite deixar serviços executando continuamente para não consumir muitos recursos. Reflita sobre AlarmManager ou Handler para agendar ou repetir as execuções dos serviços.
  57. 57. Até a próxima!

×