(Android) Servicio rompe cuando cuando se cierra la app

Hola a todos espero que podáis echarme una mano alguno

Estoy intentando hacer una aplicación la cual activa desactiva la conexión 3G del teléfono.

Para realizar esta tarea tengo un servicio impelmentado el cual con ayuda de un Timer y dos TimerTask se encarga de desactivar/activar el Internet cada cierto timepo.

El servicio funciona correctamente; pero el problema reside en que ese servicio es lanzado desde una una activity, hasta aquí todo bien.

Pero si salgo de la activity y luego con el administrador de tareas de Android "cierro" la app entonces es cuando falla.

Este es el código de el servicio:
package com.birik.habilitadordatos;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Timer;
import java.util.TimerTask;


/**
* Created by miguel on 13/07/13.
*/
public class ServicioEncendidoApagadoDatos extends Service {
    Timer timer = new Timer();

    private int Chi=0;

    Context context = this;
    private long TIEMPO_PARA_ENCENDER = 0;
    private long TIEMPO_ENCENDIDO = 0;

   // hiloApagarEncerDatosImpl hilo ;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        startForeground(0, null);
        try {
            Bundle recivido = intent.getExtras();


            double encen = Double.parseDouble( recivido.get("Encendido").toString());
            double paraEncen = Double.parseDouble(recivido.get("ParaEncender").toString());


            long Encendido = (new Double(encen * 1000)).longValue();
            long ParaEncender = (new Double(paraEncen * 1000)).longValue();

            TIEMPO_ENCENDIDO = Encendido;
            TIEMPO_PARA_ENCENDER= ParaEncender;

        }catch (Exception ex){
            Log.w("Info", ex.getMessage());
        }
        if(TIEMPO_ENCENDIDO != 0 & TIEMPO_PARA_ENCENDER != 0){
            crearTareaDeEncendidoDatos();
        }else{
            Toast.makeText( context,"Debes pasar unos valores diferentes de 0",Toast.LENGTH_LONG).show();
            onDestroy();
        }



        return START_STICKY;
    }


    private void crearTareaDeEncendidoDatos(){


        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                setMobileDataEnabled(getApplicationContext(),true);
                Log.w("Info","Internet Activado");
                       }
        },0 ,TIEMPO_PARA_ENCENDER + TIEMPO_ENCENDIDO);

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                setMobileDataEnabled(getApplicationContext(),false);
                Log.w("Info","Internet Apagado");
            }
        },TIEMPO_ENCENDIDO ,  TIEMPO_PARA_ENCENDER + TIEMPO_ENCENDIDO);



    }

    @Override
    public void onDestroy() {

        setMobileDataEnabled(getApplicationContext(), true);
        if (timer != null) {
            timer.cancel();
        }
        super.onDestroy();
        Toast.makeText(this, "Servicion Terminado", Toast.LENGTH_SHORT).show();
    }

    private void setMobileDataEnabled(Context context, boolean enabled) {

        try {
            final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final Class conmanClass = Class.forName(conman.getClass().getName());
            final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
            iConnectivityManagerField.setAccessible(true);
            final Object iConnectivityManager = iConnectivityManagerField.get(conman);
            final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
            final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
            setMobileDataEnabledMethod.setAccessible(true);

            setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {

        }
    }


}


Y este el manifest con la declaracion del servicio:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.birik.habilitadordatos"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="16" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.birik.habilitadordatos.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

       <!-- <service android:name=".ServicioEncendidoApagadoDatos" /> -->

        <service
                android:name="ServicioEncendidoApagadoDatos"
                android:process=":my_process"
                >
        </service>
    </application>

</manifest>



Es pero que alguno me pueda ayudar


Saludos y gracias
Hola,

Que el servicio sea lanzado desde una activity no debería ser un problema. Lo que tienes que mirar es si al salir de la activity quieres que el servicio se siga ejecutando o quieres pararlo. Porque el hecho de salir de la activity no implica que el servicio se pare. Tu puedes salir de una aplicación pero los servicios que se han arrancado no tienen por qué pararse.

No tienes ninguna forma de ver el error que lanza la app cuando falla? A través de log, DDMS, con el emulador o enchufando el móvil al pc...

Un saludo
Sisi, el error que lo puedo ver, ahora no lo puedo poner por que no estoy en casa en cuanto llegue lo subo.

Aún así el servicio no se cierra cuando salgo de la aplicación sino cuando cierro la aplicación desde el administrador de tareas de android. Ese que sale cuando pulsas el botón home.

entonces es cuando rompe,sino la cierro desde el administrador la aplicación funciona correctamente.

Saludos y gracias
2 respuestas