SlideShare uma empresa Scribd logo
PROGRAMAÇÃO PARA
DISPOSITIVOS MÓVEIS
Service
Objetivos da aula
 Service
O que é Service?
Uma classe responsável por executar
uma determinada tarefa em segundo
plano, sem que o usuário perceba.
Precisa uma interface gráfica?
Precisa uma interface gráfica?
Não!
O sistema operacional que cuida da
tarefa sendo executada em segundo
plano. Ele finalizará o serviço caso
precise (muito) liberar memória.
Porque Service ao invés de Thread?
Thread não faz parte do ciclo de vida
do Android. Service tem prioridade
máxima sobre qualquer outro
processo em segundo plano.
Mesmo que um Service seja
encerrado pelo SO, o Android tentará
reiniciá-lo assim que as condições de
memória se normalizem.
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).
Para iniciá-lo, podemos utilizar os
métodos: startService(intent) ou
bindService(intent, con, flags).
Qual a diferença?
Entre startService() e bindService()?
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().
Em outras palavras, se a Activity que
chamou startService() for finalizada,
o serviço continuará sendo executado
em segundo plano.
bindService() inicia um serviço caso
ainda não esteja em execução ou
simplesmente se conecta a ele.
Ao conectarmos ao serviço com
bindService() podemos obter uma
referência para manipulá-lo.
Enquanto mantivermos a referência,
estaremos conectados.
Aula 05/06 (Service)
Activity para testes...
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);
}
});
}
}
Service registrado...
<?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>
NossoServico!
public class NossoServico extends Service implements Runnable {
public void onCreate() {
}
public IBinder onBind(Intent intent) {
return null;
}
public void run() {
}
}
public class NossoServico extends Service implements Runnable {
public void onCreate() {
new Thread(this).start();
}
public IBinder onBind(Intent intent) {
return null;
}
public void run() {
}
}
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++;
}
}
}
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 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;
}
}
Crie uma tela com os botões iniciar e
parar. Associe a tela à Activity. Faça
testes e acompanhe o LogCat.
Aula 05/06 (Service)
Perceberam que iniciamos o serviço
com startService()?
E o bindService()?
Utilizamos o bindService()
principalmente para nos conectarmos
e manipularmos um serviço, através
da interface android.os.IBinder.
Para nos conectarmos ao serviço,
precisamos implementar
corretamente o método onbind(),
que deixamos retornando nulo.
Vamos alterar o exemplo anterior
para que seja possível recurar o valor
do contador.
Precisamos da interface de comunicação,
por enquanto com um método.
public interface Contador {
int count();
}
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.
Refatorando nosso serviço...
public class NossoServicoComConexao extends NossoServico {
public IBinder onBind(Intent intent) {
return null;
}
}
public class NossoServicoComConexao extends NossoServico implements Contador {
public IBinder onBind(Intent intent) {
return null;
}
}
public class NossoServicoComConexao extends NossoServico implements Contador {
public IBinder onBind(Intent intent) {
return null;
}
public int count() {
return count;
}
}
public class NossoServicoComConexao extends NossoServico implements Contador {
private final IBinder conexao;
public IBinder onBind(Intent intent) {
return null;
}
public int count() {
return count;
}
}
public class NossoServicoComConexao extends NossoServico implements Contador {
private final IBinder conexao;
public IBinder onBind(Intent intent) {
return conexao;
}
public int count() {
return count;
}
}
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 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 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() {
}
}
}
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;
}
}
}
Registrando este novo serviço no
AndroidManifest.xml
<?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>
Criando um novo botão na tela para
obter o valor do contador...
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();
}
});
}
}
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();
}
});
}
}
...continuação...
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;
}
}
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;
}
}
É comum iniciarmos o serviço com
startService() e após conectarmos
com bindService().
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.
Até a próxima!

Mais conteúdo relacionado

Mais procurados (20)

ODP
Mantendo a Sanidade com o Glade
Marcelo Lira
 
PPTX
Aplicações Android Real-Time com Firebase
Ygor César
 
PDF
Android: Intent, Broadcast Receiver e Notifications
Gustavo Henrique Rodrigues Pinto Tomas
 
ODP
Mini-tutorial de GTK+
Marcelo Lira
 
ODP
Desenvolvendo GUI com GTK+ - Frederico Schardong
Tchelinux
 
PPTX
Clean Code
Rodrigo Branas
 
PPT
Fazendo Injeção de dependência com Unity 1.2
Giovanni Bassi
 
PDF
One Language to Rule Them All: TypeScript
Loiane Groner
 
PDF
Secomp 2018 - DO Ruby ao Elixir
Rodrigo Long Chen Kashiwakura
 
PPTX
Grails
Alex Guido
 
PPTX
Trabalhando de Forma Assíncrona com JavaScript
Lucas Anderson
 
PDF
Java script - funções
Cristiano Pires Martins
 
ODP
VRaptor4
Renan Montenegro
 
PDF
Java script aula 09 - JQuery
Cristiano Pires Martins
 
PDF
Acessando banco de dados remoto com android
Leonardo Moreira Dos Santos
 
PDF
Java script aula 10 - angularjs
Cristiano Pires Martins
 
ODP
Groovy grails
Lucas Aquiles
 
PPTX
Fragmentos
Natanael Fonseca
 
PPTX
XML Free Programming - Brazil
Stephen Chin
 
Mantendo a Sanidade com o Glade
Marcelo Lira
 
Aplicações Android Real-Time com Firebase
Ygor César
 
Android: Intent, Broadcast Receiver e Notifications
Gustavo Henrique Rodrigues Pinto Tomas
 
Mini-tutorial de GTK+
Marcelo Lira
 
Desenvolvendo GUI com GTK+ - Frederico Schardong
Tchelinux
 
Clean Code
Rodrigo Branas
 
Fazendo Injeção de dependência com Unity 1.2
Giovanni Bassi
 
One Language to Rule Them All: TypeScript
Loiane Groner
 
Secomp 2018 - DO Ruby ao Elixir
Rodrigo Long Chen Kashiwakura
 
Grails
Alex Guido
 
Trabalhando de Forma Assíncrona com JavaScript
Lucas Anderson
 
Java script - funções
Cristiano Pires Martins
 
Java script aula 09 - JQuery
Cristiano Pires Martins
 
Acessando banco de dados remoto com android
Leonardo Moreira Dos Santos
 
Java script aula 10 - angularjs
Cristiano Pires Martins
 
Groovy grails
Lucas Aquiles
 
Fragmentos
Natanael Fonseca
 
XML Free Programming - Brazil
Stephen Chin
 

Destaque (20)

PDF
Introduction Android - C.E.S.A.R
Renato
 
PPT
Android Palestra
Renato
 
PDF
Pomodoro agil
Renato
 
PPSX
Aula 5 - 24/04 (Landscape / Portrait)
Ricardo Longa
 
PPSX
Aula 17 04 (Exercícios e ScrollView)
Ricardo Longa
 
PPTX
Android na prática - USCS
Renato
 
PPSX
Aula 05/06 (Notification)
Ricardo Longa
 
PPSX
Aula 22/05 (Handler)
Ricardo Longa
 
PPSX
Aula 10 04 (Gerenciadores de layouts)
Ricardo Longa
 
PPTX
android_overview
Renato
 
PPSX
Aula 10 04 (intents)
Ricardo Longa
 
PPSX
Aula 12/06 (SQLite)
Ricardo Longa
 
PPTX
Aula04 android intents
Roberson Alves
 
PPSX
Aula 6 - 08/05 (SharedPreferences)
Ricardo Longa
 
PPTX
Oficina Sesc Android - V1
Odair Bonin Borges
 
PPSX
Aula 6 - 08/05 (Menu)
Ricardo Longa
 
PDF
K19 k41 Desenvolvimento Mobile com Android
Aline Diniz
 
PPSX
Aula 29/05 (AlarmManager)
Ricardo Longa
 
PPTX
Atividades e Intenções (Android)
Natanael Fonseca
 
PDF
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Ricardo Longa
 
Introduction Android - C.E.S.A.R
Renato
 
Android Palestra
Renato
 
Pomodoro agil
Renato
 
Aula 5 - 24/04 (Landscape / Portrait)
Ricardo Longa
 
Aula 17 04 (Exercícios e ScrollView)
Ricardo Longa
 
Android na prática - USCS
Renato
 
Aula 05/06 (Notification)
Ricardo Longa
 
Aula 22/05 (Handler)
Ricardo Longa
 
Aula 10 04 (Gerenciadores de layouts)
Ricardo Longa
 
android_overview
Renato
 
Aula 10 04 (intents)
Ricardo Longa
 
Aula 12/06 (SQLite)
Ricardo Longa
 
Aula04 android intents
Roberson Alves
 
Aula 6 - 08/05 (SharedPreferences)
Ricardo Longa
 
Oficina Sesc Android - V1
Odair Bonin Borges
 
Aula 6 - 08/05 (Menu)
Ricardo Longa
 
K19 k41 Desenvolvimento Mobile com Android
Aline Diniz
 
Aula 29/05 (AlarmManager)
Ricardo Longa
 
Atividades e Intenções (Android)
Natanael Fonseca
 
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Ricardo Longa
 
Anúncio

Semelhante a Aula 05/06 (Service) (20)

PDF
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Felipe Silveira
 
PPTX
Aula_4_com_codigo_completo_comentado.pptx
testepro286
 
PPTX
Services.pptx
pedro960295
 
PDF
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Josué Rockefeller
 
PDF
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Josué Rockefeller
 
PDF
Android Core Aula 6 - Desenvolvimento de aplicações Android
Felipe Silveira
 
PPT
Introdução ao Google TV
Aécio Costa
 
PDF
Data Binding Para Vinculo de Dados na UI Android
Vinícius Thiengo
 
PPTX
google maps api - v1
Lucas Aquiles
 
PDF
2017 08-11 - Androidos V - Minicurso - Introdução ao android
Messias Batista
 
PDF
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
Alisson Solitto
 
ODP
Comunidades Baseadas Em Subsites
alessandrolandim
 
PPTX
Aula 7.0 android 02 - primeiro programa calculadora
Othon Santos Medeiros
 
PPTX
Desenvolvimento de Aplicações para Dispositivos Móveis - Android Studio - Par...
Elmano Cavalcanti
 
PPTX
dfghfhfgjghjghjgjdu6ry6rtuyfdjugjghjghjhfgjfghj
testepro286
 
PPTX
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Stefanini
 
PDF
Apresentação Google Android
Rodrigo Cascarrolho
 
PDF
SESTINFO 2011 Apresentacao Android
Rafael Sakurai
 
PDF
Introdução ao Android (minicurso 4h)
Rodrigo Rocha
 
PDF
Android Aula 5
Erisvaldo Junior
 
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Felipe Silveira
 
Aula_4_com_codigo_completo_comentado.pptx
testepro286
 
Services.pptx
pedro960295
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Josué Rockefeller
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Josué Rockefeller
 
Android Core Aula 6 - Desenvolvimento de aplicações Android
Felipe Silveira
 
Introdução ao Google TV
Aécio Costa
 
Data Binding Para Vinculo de Dados na UI Android
Vinícius Thiengo
 
google maps api - v1
Lucas Aquiles
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
Messias Batista
 
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
Alisson Solitto
 
Comunidades Baseadas Em Subsites
alessandrolandim
 
Aula 7.0 android 02 - primeiro programa calculadora
Othon Santos Medeiros
 
Desenvolvimento de Aplicações para Dispositivos Móveis - Android Studio - Par...
Elmano Cavalcanti
 
dfghfhfgjghjghjgjdu6ry6rtuyfdjugjghjghjhfgjfghj
testepro286
 
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Stefanini
 
Apresentação Google Android
Rodrigo Cascarrolho
 
SESTINFO 2011 Apresentacao Android
Rafael Sakurai
 
Introdução ao Android (minicurso 4h)
Rodrigo Rocha
 
Android Aula 5
Erisvaldo Junior
 
Anúncio

Mais de Ricardo Longa (7)

PPSX
Adopt a JSR
Ricardo Longa
 
PPSX
JSR 339 - Java API for RESTful Web Services
Ricardo Longa
 
PPSX
JBoss Forge 2
Ricardo Longa
 
PPSX
Android - Programação para dispositivos móveis (Aula 1)
Ricardo Longa
 
PPT
Da introdução à prática no desenvolvimento Android
Ricardo Longa
 
PPSX
Open Networking
Ricardo Longa
 
PPS
Da introdução à prática com Drools Expert e Drools Flow
Ricardo Longa
 
Adopt a JSR
Ricardo Longa
 
JSR 339 - Java API for RESTful Web Services
Ricardo Longa
 
JBoss Forge 2
Ricardo Longa
 
Android - Programação para dispositivos móveis (Aula 1)
Ricardo Longa
 
Da introdução à prática no desenvolvimento Android
Ricardo Longa
 
Open Networking
Ricardo Longa
 
Da introdução à prática com Drools Expert e Drools Flow
Ricardo Longa
 

Último (6)

PDF
Apresentação de Manipulação de strings em Python .pdf
Gabriel Vitor
 
PPTX
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
PPTX
Gestão de Mudanças - O que é e como é implementada
Gateware Group
 
PDF
SENAC Modelagem de Dados - Aula02 curso de ADS.pdf
JhonataLamim1
 
PDF
Apresentação sobre Funções Matemáticas e o módulo.pdf
Gabriel Vitor
 
PDF
SENAC Modelagem de Dados - Aula01 do curso de ADSpdf
JhonataLamim1
 
Apresentação de Manipulação de strings em Python .pdf
Gabriel Vitor
 
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
Gestão de Mudanças - O que é e como é implementada
Gateware Group
 
SENAC Modelagem de Dados - Aula02 curso de ADS.pdf
JhonataLamim1
 
Apresentação sobre Funções Matemáticas e o módulo.pdf
Gabriel Vitor
 
SENAC Modelagem de Dados - Aula01 do curso de ADSpdf
JhonataLamim1
 

Aula 05/06 (Service)

  • 3. O que é Service?
  • 4. Uma classe responsável por executar uma determinada tarefa em segundo plano, sem que o usuário perceba.
  • 6. Precisa uma interface gráfica? Não!
  • 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. Porque Service ao invés de Thread?
  • 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. Mesmo que um Service seja encerrado pelo SO, o Android tentará reiniciá-lo assim que as condições de memória se normalizem.
  • 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. Para iniciá-lo, podemos utilizar os métodos: startService(intent) ou bindService(intent, con, flags).
  • 14. Entre startService() e bindService()?
  • 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. Em outras palavras, se a Activity que chamou startService() for finalizada, o serviço continuará sendo executado em segundo plano.
  • 17. bindService() inicia um serviço caso ainda não esteja em execução ou simplesmente se conecta a ele.
  • 18. Ao conectarmos ao serviço com bindService() podemos obter uma referência para manipulá-lo. Enquanto mantivermos a referência, estaremos conectados.
  • 21. 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); } }); } }
  • 23. <?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>
  • 25. public class NossoServico extends Service implements Runnable { public void onCreate() { } public IBinder onBind(Intent intent) { return null; } public void run() { } }
  • 26. public class NossoServico extends Service implements Runnable { public void onCreate() { new Thread(this).start(); } public IBinder onBind(Intent intent) { return null; } public void run() { } }
  • 27. 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++; } } }
  • 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(); } }
  • 29. 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; } }
  • 30. Crie uma tela com os botões iniciar e parar. Associe a tela à Activity. Faça testes e acompanhe o LogCat.
  • 32. Perceberam que iniciamos o serviço com startService()?
  • 34. Utilizamos o bindService() principalmente para nos conectarmos e manipularmos um serviço, através da interface android.os.IBinder.
  • 35. Para nos conectarmos ao serviço, precisamos implementar corretamente o método onbind(), que deixamos retornando nulo.
  • 36. Vamos alterar o exemplo anterior para que seja possível recurar o valor do contador.
  • 37. Precisamos da interface de comunicação, por enquanto com um método. public interface Contador { int count(); }
  • 38. 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.
  • 40. public class NossoServicoComConexao extends NossoServico { public IBinder onBind(Intent intent) { return null; } }
  • 41. public class NossoServicoComConexao extends NossoServico implements Contador { public IBinder onBind(Intent intent) { return null; } }
  • 42. public class NossoServicoComConexao extends NossoServico implements Contador { public IBinder onBind(Intent intent) { return null; } public int count() { return count; } }
  • 43. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao; public IBinder onBind(Intent intent) { return null; } public int count() { return count; } }
  • 44. public class NossoServicoComConexao extends NossoServico implements Contador { private final IBinder conexao; public IBinder onBind(Intent intent) { return conexao; } public int count() { return count; } }
  • 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; } }
  • 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 { } }
  • 47. 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() { } } }
  • 48. 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; } } }
  • 49. Registrando este novo serviço no AndroidManifest.xml
  • 50. <?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>
  • 51. Criando um novo botão na tela para obter o valor do contador...
  • 52. 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(); } }); } }
  • 53. 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(); } }); } }
  • 55. 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; } }
  • 56. 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; } }
  • 57. É comum iniciarmos o serviço com startService() e após conectarmos com bindService().
  • 58. 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.