Usuario:ManuelRomero/Android2/PrimerPrograma/Servicios

De WikiEducator
Saltar a: navegación, buscar
Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg




Qué es un Service

  • Es una aplicación que se ejecuta en background y no tiene ninguna ventana asociada como en el caso de las activity.
  • Un servicio se ejecuta en el mismo hilo o thread que la activity que lo invoca.
  • El usuario gráficamente no ve que se está ejecutando
  • El usuario no puede interactuar con el service
  • Para inciar un Service se invoca al método startService() - stopService()
  • Otra forma de hacerlo es con Context.bindService() Context.unbindService()
    • En este caso la activity puede interactuar con el service y retornarle un objeto de tipo IBinder
  • Existen muchos servicios del sistema que podemos utilizar
getSystemService()
  • aqui un ejemplo de como usar un servicio para hacer usar el GPS
http://www.sgoliver.net/blog/?p=1887
  • También podemos crear uno nosotros con new Service() o heredando de la clase Service
  • Haremos un ejemplo

Cuál es el ciclo de vida de un service

  • El ciclo de vida de una Service es diferente al de un Activity
context.startService() |  onCreate() - >onStartCommand() [Servicio ejecutandose]
context.stopService() |   onDestroy() [servicio parado]
context.onBindService() | ->onCreate() [servicio creado]

CicloVidaServico.png

Un pequeños ejemplo

  • Creamos una aplicación que arranque y pare un servicio que va a hacer sonar una canción
Creamos nuestra nueva aplicación como siempre
Creamos una interfaz con dos botones Start Stop
<Button
        android:id="@+id/btnstart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start" 
        android:onClick="clickBtnStart"/>
 
    <Button
        android:id="@+id/btnstop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="clickBtnStop"
        android:text="Stop" />
Creamos una clase para el Servicio
package com.example.servicios;
 
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
 
public class Servicios extends Service {
	private static final String TAG = "MyService";
	MediaPlayer player;
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	@Override
	public void onCreate() {
		Toast.makeText(this, "Servicio Creado", Toast.LENGTH_LONG).show();
		Log.d(TAG, "onCreate");
		player = MediaPlayer.create(this, R.raw.braincandy);
		player.setLooping(false); // Set looping
	}
 
	@Override
	public void onDestroy() {
		Toast.makeText(this, "Servicio parado", Toast.LENGTH_LONG).show();
		Log.d(TAG, "onDestroy");
		player.stop();
	}
 
	@Override
	public void onStart(Intent intent, int startid) {
		Toast.makeText(this, "Servicio arrancado", Toast.LENGTH_LONG).show();
		Log.d(TAG, "onStart");
		player.start();
	}	
 
}
En nuestro programa principal de la activity

Idioma no válido.

Necesita especificar un idioma como esto: <source lang="html4strict">...</source>

lenguajes soportados para sintaxis remarcada:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


package com.example.servicios;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainServicios extends Activity {
	private static final String TAG = "SERVICIOS";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_servicios);
    }
 public void clickBtnStart(View v){
	 Log.d(TAG,"start servicio");
	 startService(new Intent (this,Servicios.class));
	
 }
 
 public void clickBtnStop(View v){
	 Log.d(TAG,"stop servicio");
	 stopService(new Intent (this,Servicios.class));
 }
    
}
Decimos que tenemos un servicio en el Manifest
...
 </activity>
    <service android:enabled="true" android:name=".MyService" />
  </application>
...