¿Cómo mantener la CPU del teléfono Android siempre despierta?

He estado atrapado en esto por días. Necesito ejecutar una función cada minuto. Esta función realiza una llamada POST desde la aplicación al servidor y transfiere la ubicación del usuario por minuto. Las coordenadas de ubicación se transfieren durante unas pocas horas, sin embargo, después de unas horas, la transferencia de coordenadas de ubicación al servidor se detiene por sí sola. Estoy haciendo uso de WakefulBroadcastReceiver e IntentService para asegurarme de que la CPU permanezca despierta. También estoy haciendo uso de la alarma para asegurarme de que la función se ejecute cada minuto.

Así es como se ve mi WakefulBroadcastReceiver:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    // This is the Intent to deliver to our service.
    Intent service = new Intent(context, SimpleWakefulService.class);

    // Start the service, keeping the device awake while it is launching.
    Log.i("SimpleWakefulReceiver", "Starting service @ " +        
    SystemClock.elapsedRealtime());
    startWakefulService(context, service);
  }
}

Así es como se ve mi IntentService:

public class SimpleWakefulService extends IntentService {
public MainActivity obj;
public Alarm alarm; 
public SimpleWakefulService() {
    super("SimpleWakefulService");
}

@Override
protected void onHandleIntent(Intent intent) {

    boolean flag = true;
        while(flag){
        Log.i("SimpleWakefulService", "Running service ");

        alarm = new Alarm();
        alarm.SetAlarm(SimpleWakefulService.this);
        Log.i("Called alarm.SetAlarm","Called alarm.SetAlarm");

    }
    SimpleWakefulReceiver.completeWakefulIntent(intent);
   // wl.release();

  }
 }

Así es como se ve mi clase de alarma:

public class Alarm extends BroadcastReceiver 
{    
public MainActivity obj;
@Override
public void onReceive(Context context, Intent intent) 
{   
    PowerManager pm = (PowerManager)   
    context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = 
    pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();
    obj = new MMMainActivity();
    obj.UpdateData();

    Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); 
    wl.release();
}

public void SetAlarm(Context context)
{
    Log.i("Inside SetAlarm","Inside SetAlarm");
    AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 1, pi); // Millisec * Second * Minute


}

public void CancelAlarm(Context context)
{
    Intent intent = new Intent(context, Alarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
    }
 }

Así es como se ve la función (denominada UpdataData ()), que debe ejecutarse cada minuto:

public void UpdateData() {
    final boolean flag = true;
    Log.i("Inside Update Data", "Inside Update Data");

    Thread thread = new Thread(new Runnable() {
       @Override
        public void run() {

            for(int i=0; i<1; i++){
                try {

                    // Your code goes here
                    if (locationclient != null
                            && locationclient.isConnected()) {
                        loc = locationclient.getLastLocation();
                        lat = loc.getLatitude();
                        lng = loc.getLongitude();

                    }
                try { // Updating the latest location in the UI, just
                            // for convinience.
                        HttpClient httpClient = new DefaultHttpClient();
                        // Creating HTTP Post
                        HttpPost httpPost = new HttpPost(
                                "http://www.mywebsite.com/update");
                        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(
                                3);
                        // Building post parameters//
                        // key and value pair

                        Log.i("token", "token" + token);
                        Log.i("Latitude for III POST Call",
                                "Latitude for III POST Call" + lat);
                        Log.i("Longitude for III POST Call",
                                "Longitude for III POST Call" + lng);


                        nameValuePair.add(new BasicNameValuePair("token",
                                token));
                        nameValuePair.add(new BasicNameValuePair("lat",
                                Double.toString(lat)));
                        nameValuePair.add(new BasicNameValuePair("lng",
                                Double.toString(lng)));
                        Log.i("Made UpdateData Post Call",
                                "Made UpdateData Post Call");
                        // Url Encoding the POST parameters
                        try {
                            httpPost.setEntity(new UrlEncodedFormEntity(
                                    nameValuePair));
                        } catch (UnsupportedEncodingException e) {
                            // writing error to Log
                            e.printStackTrace();
                        }

                        // Making HTTP Request
                        try {
                            HttpResponse response = httpClient
                                    .execute(httpPost);

                            // writing response to log
                            Log.d("Http Response:", response.toString());
                            // Your code goes here
                        } catch (IOException e) {
                            // writing exception to log
                            e.printStackTrace();

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }// loop closed
           }
      });
    thread.start();
    }// UpdateData closed

¿Por qué es que incluso después de usar todo esto, UpdateData () no se puede ejecutar por un tiempo infinito, cada 60 segundos? Cualquier ayuda a este respecto sería muy apreciada. También tenga en cuenta que UpdateData () se ejecuta cada 60 segundos durante algunas horas, pero, después de un tiempo, su ejecución se detiene por sí sola y, por lo tanto, la transferencia de coordenadas de ubicación, desde la aplicación al servidor.

EDITAR: edité el SimpleWakefulService y agregué los cambios necesarios según lo sugerido por una de las respuestas. Las cosas funcionaron bien durante unas pocas horas, sin embargo, después de algunas horas, el servicio se canceló automáticamente. Creo que los servicios no están destinados a ser asesinados. ¿Alguien podría explicar esto? SimpleWakefulService:

public class SimpleWakefulService extends IntentService implements 
OnClickListener,ConnectionCallbacks, OnConnectionFailedListener, 
LocationListener,GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {


public static Location loc;
public static LocationClient locationclient;
public static double lat = 10, lng = 10;
public static String token; 

public Alarm alarm; 
public SimpleWakefulService() {
    super("SimpleWakefulService");

}


@Override
protected void onHandleIntent(Intent intent) {


    //Getting the value of token from another Class
    token = ConfirmToken.uvalue;
    Log.i("WakefulServiceutoken", "WakefulServicutoken" + token);

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();

        final boolean flag = true;

        while (flag) {
                    try {

                        // Your code goes here
                        if (locationclient != null
                                && locationclient.isConnected()) {
                            loc = locationclient.getLastLocation();
                            lat = loc.getLatitude();
                            lng = loc.getLongitude();

                        }

                      try { // Updating the latest location in the UI, just
                                // for convinience.
                            HttpClient httpClient = new DefaultHttpClient();
                            // Creating HTTP Post
                            HttpPost httpPost = new HttpPost(
                                    "http://www.mywebsite.com/update");
                            List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(
                                    3);
                            // Building post parameters//
                            // key and value pair
                            Log.i("token", "token" + token);
                            Log.i("Latitude for III POST Call",
                                    "Latitude for III POST Call" + lat);
                            Log.i("Longitude for III POST Call",
                                    "Longitude for III POST Call" + lng);


                            nameValuePair.add(new BasicNameValuePair("token",
                                    token));
                            nameValuePair.add(new BasicNameValuePair("lat",
                                    Double.toString(lat)));
                            nameValuePair.add(new BasicNameValuePair("lng",
                                    Double.toString(lng)));
                                                            // Url Encoding the POST parameters
                            try {
                                httpPost.setEntity(new UrlEncodedFormEntity(
                                        nameValuePair));
                            } catch (UnsupportedEncodingException e) {
                                // writing error to Log
                                e.printStackTrace();
                            }

                            // Making HTTP Request
                            try {
                                HttpResponse response = httpClient
                                        .execute(httpPost);

                                // writing response to log
                                Log.d("Http Response:", response.toString());
                                // Your code goes here
                            } catch (IOException e) {
                                // writing exception to log
                                e.printStackTrace();

                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        Thread.sleep(10000);
                    } catch (Exception e) {

                    }

                }// While closed


    //SimpleWakefulReceiver.completeWakefulIntent(intent);
    //wl.release();

}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub

}

@Override
public void onLocationChanged(Location arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub

}

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}

}

Respuestas a la pregunta(1)

Su respuesta a la pregunta