|
Página 1 de 1
|
[ 3 Mensagens ] |
|
[TUTO]Conexão bi-direcional, Activity-Service, via Listener
| Autor |
Mensagem |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 2023 Localização: São Paulo
|
 [TUTO]Conexão bi-direcional, Activity-Service, via Listener
Estou publicando uma serie de estudos no meu blog Agorandroid. Este tutorial é sobre uma cópia do projeto que publiquei lá, com a diferença de que o serviço de coleta aqui será feito por um service. O projeto é bem simples, o objetivo é mostrar a técnica de conexão. O app coleta os dados do provedor de GPs, essa coleta é feita por uma classe filha de service e transfere para a activity que mostra alguns campos do Location recebido. Isso é só para poder acompanhar visualmente. Normalmente gravariamos os dados num banco local ou remoto. Este tutorial trata da conexão entre Activity e Service. Mas não da maneira tradicional, vamos usar uma técnica muito usada no Android chamada de Listener. Com ela recebemos os avisos dos eventos ocorridos no service diretamente logo após ocorrerem. Como isso é feito? Primeiro pegamos uma referência do objeto que pretendemos ter acesso, depois, nos cadastramos para recebermos os retornos do objeto conectado. Para isso usaremos uma interface muito simples com apenas um método declarado. Nome: OnLocListener.java public interface OnLocListener { public abstract void onNewLocation(Location location); }
Através da implementação dessa interface na activity vamos receber os dados do service. Vamos usar um bound service, que é um serviço que fica conectado ao componente que o chamou através do bindService. Intent intent = new Intent (this, TesteGPS_xxService. class); bindService (intent, mConnection, Context. BIND_AUTO_CREATE); Não vou comentar muito sobre essa parte do bind porque isso está muito bem documentado no Dev Guide do Android. Os seguintes métodos do service são utilizados pela activity: startColeta, stopColeta e setOnLocListener. O fragmento de código seguinte lembra algum outro? mService.setOnLocListener(new OnLocListener() { @Override public void onNewLocation(Location location) { atualizaTela(location); } });
Registramos o listener logo após a conexão ser completada. Através dos botões fazemos start e stop da coleta dos dados do GPS. No service registramos o listener pelo nome da interface na variável: private OnLocListener onLocListener;
public void setOnLocListener(OnLocListener listener) { onLocListener = listener; }
E passamos os dados assim, usando o listener setado antes: OnNewLocation(mLocal);
private void OnNewLocation(Location location) { if (onLocListener != null) { onLocListener.onNewLocation(location); } }
Só para lembrar, o tutorial não é sobre o GPS. Ele foi usado devido ao fato de que serve muito bem ao propósito de mostrar os dados fluindo de um componente ao outro; sem ser de uma maneira artificial já que os dados são reais. Já que falei do GPS, não esqueçam de incluir a permissão no manifest. Vamos aos códigos. OnLocListener.java package br.com.agorandroid;
import android.location.Location;
public interface OnLocListener { public abstract void onNewLocation(Location location); }
TesteGPS_xxActivity.java package br. com. agorandroid; import java. text. SimpleDateFormat; import java. util. Date; import br. com. agorandroid. TesteGPS_xxService. LocalBinder; import android. app. Activity; import android. content. ComponentName; import android. content. Context; import android. content. Intent; import android. content. ServiceConnection; import android. location. Location; import android. os. Bundle; import android. os. IBinder; import android. view. View; import android. view. View. OnClickListener; import android. widget. Button; import android. widget. TextView; /** * @author A H Gusukuma * agorandroid.blogspot.com */public class TesteGPS_xxActivity extends Activity { private TesteGPS_xxService mService; boolean mBound = false; private TextView tv; private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); /** Called when the activity is first created. */ @Override public void onCreate (Bundle savedInstanceState ) { super. onCreate(savedInstanceState ); setContentView (R. layout. main); Button button = (Button)findViewById (R. id. start_alarm); button. setOnClickListener(mStartListener ); button = (Button)findViewById (R. id. stop_alarm); button. setOnClickListener(mStopListener ); tv = (TextView ) findViewById (R. id. status); } @Override protected void onStart () { super. onStart(); Intent intent = new Intent (this, TesteGPS_xxService. class); bindService (intent, mConnection, Context. BIND_AUTO_CREATE); } @Override public void onPause () { super. onPause(); tv. setText(""); if (mBound ) { mService. stopColeta(); } } @Override protected void onStop () { super. onStop(); if (mBound ) { unbindService (mConnection ); mBound = false; } } private OnClickListener mStartListener = new OnClickListener () { public void onClick (View v ) { if (mBound ) { tv. setText("Coleta iniciada"); mService. startColeta(); } } }; private OnClickListener mStopListener = new OnClickListener () { public void onClick (View v ) { if (mBound ) { tv. setText("Coleta finalizada"); mService. stopColeta(); } } }; private ServiceConnection mConnection = new ServiceConnection () { @Override public void onServiceConnected (ComponentName className, IBinder service ) { LocalBinder binder = (LocalBinder ) service; mService = binder. getService(); mService. setOnLocListener(new OnLocListener () { @Override public void onNewLocation (Location location ) { atualizaTela (location ); } }); mBound = true; } @Override public void onServiceDisconnected (ComponentName className ) { tv. setText("Coleta finalizada"); mBound = false; } }; private void atualizaTela (Location l ) { TextView tv1 = (TextView ) findViewById (R. id. textView1); tv1. setText("Lat: " + (double) l. getLatitude()); TextView tv2 = (TextView ) findViewById (R. id. textView2); tv2. setText("Long: " + (double) l. getLongitude()); TextView tv3 = (TextView ) findViewById (R. id. textView3); tv3. setText(sdf. format(new Date(l. getTime()))); TextView tv4 = (TextView ) findViewById (R. id. textView4); tv4. setText(l. getProvider()); }} TesteGPS_xxService.java /** * */package br. com. agorandroid; import android. app. Service; import android. content. Context; import android. content. Intent; import android. location. Location; import android. location. LocationListener; import android. location. LocationManager; import android. os. Binder; import android. os. Bundle; import android. os. IBinder; /** * @author A H Gusukuma * */public class TesteGPS_xxService extends Service { private final IBinder mBinder = new LocalBinder (); private LocationManager lm; private OnLocListener onLocListener; public class LocalBinder extends Binder { TesteGPS_xxService getService () { return TesteGPS_xxService. this; } } private LocationListener myLocationListener = new LocationListener () { public void onLocationChanged (Location location ) { Location mLocal = new Location (location ); OnNewLocation (mLocal ); } public void onProviderDisabled (String provider ) { } public void onProviderEnabled (String provider ) { } public void onStatusChanged (String provider, int status, Bundle extras ) { } }; private void OnNewLocation (Location location ) { if (onLocListener != null) { onLocListener. onNewLocation(location ); } } @Override public IBinder onBind (Intent intent ) { // TODO Auto-generated method stub lm = (LocationManager )getSystemService (Context. LOCATION_SERVICE); return mBinder; } public void setOnLocListener (OnLocListener listener ) { onLocListener = listener; } public void startColeta () { lm. requestLocationUpdates(LocationManager. GPS_PROVIDER, 0, 0, myLocationListener ); } public void stopColeta () { lm. removeUpdates(myLocationListener ); }} main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <TextView android:id="@+id/status" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text=""/>
<LinearLayout android:orientation="horizontal" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:id="@+id/start_alarm" android:layout_weight="1" android:text="Start" android:layout_height="wrap_content"></Button> <Button android:layout_width="wrap_content" android:id="@+id/stop_alarm" android:layout_weight="1" android:text="Stop" android:layout_height="wrap_content"></Button> </LinearLayout>
<View android:layout_height="2dip" android:layout_width="fill_parent" android:background="#ff909090" />
<LinearLayout android:orientation="vertical" android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow > <TextView android:id="@+id/textView1" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <TextView android:id="@+id/textView2" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </TableRow> <TableRow > <TextView android:id="@+id/textView3" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <TextView android:id="@+id/textView4" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </TableRow> </TableLayout> </LinearLayout> </LinearLayout>
Bons códigos!
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 18 Jan 2012, 05:17 |
|
 |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 2023 Localização: São Paulo
|
 Re: [TUTO]Conexão bi-direcional, Activity-Service, via Liste
Dei uma revisada no texto, estava meio ininteligível. hehehe
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 19 Jan 2012, 21:07 |
|
 |
|
Leandro-SP
What is Android?
Data de registro: 09 Jan 2012, 11:51 Mensagens: 4
|
 Re: [TUTO]Conexão bi-direcional, Activity-Service, via Liste
Muito bom o tuto!!! Está de parabéns! Obrigado!
|
| 19 Jan 2012, 23:53 |
|
|
|
Página 1 de 1
|
[ 3 Mensagens ] |
|
Quem está online |
Usuários vendo este fórum: (_FM_), abruzzi, ademilson, ademir.carvalhojr, aechiara, Alan Unger, alansousa, alberto, Alexsandro Tirloni, alfredo_ej, alineri, andepunk, andi, arilsonm, austonrd, Avelino Mateus Neto, Berbert, billsombrio, Bitetti, Bruno, bruno.abd, btleandro, caio, cassianotartari, Cassius, cesschneider, chunga, ciro, claudio, Clone Trooper, compto, craudiao, danilosouza, Darth Plagueis, dbispo, dchechetto, Deiapinh, Diego, dirceuconte, eferrari, emersonbarros, estratec, Flavio Alves, gamito, garretereis, geovanebg, HAMSES, helder84, humberto, Igor_M, jairom, jandersonjc, jasn, JeffCF, João Miguel Aguiar, juliancesar, Julio Assis, laurj, Legiao, Leonardo, leosl81, lfalcao, Liviosousa, lucianno, lucianoalves, Lucious, luiz.lago, luizfilipe, Mace Windu, madeinnordeste, marcosrogel, marlovich, mauriciobreide, Maxtremus, mcurtis, neuhaus, nivaldo, Odigooogle™, pabarbosa, PAMinhoto, Patricia, Patrick, pererinha, pmzara, pumadeejay, Ranieri, rayberg, reginaldo, regis.ror, rfrafael, ricdigital, rogeriokta, Samantha, sandro, scattonevi, SEO Crawler, Shmi Skywalker, Stormtrooper, Synoo [Bot], teamamus, thiago20, Tognoli, ttaranto, ubiratan, unnamedd, vandob, vanmars, Vector, vieira, voliverio, Webnet, XPTO, Yuri e 4 visitantes |
|
Você não pode criar novos tópicos neste fórum Você não pode responder tópicos neste fórum Você não pode editar suas mensagens neste fórum Você não pode excluir suas mensagens neste fórum Você não pode enviar anexos neste fórum
|
|