Служба отключена, когда экран выключается

Я немного запутался в поведении службы. Я создал класс службы, который отправляет мое местоположение по электронной почте, как только широта и долгота моего устройства меняются. Служба работает отлично, когда экран моего телефона включен, но как только экран телефона отключается, служба не обновляет меня для новых местоположений. Я где-то читал в SO о блокировке пробуждения. Я не знаю, как я могу реализовать блокировку пробуждения в своей службе, и даже я не знаю, это будет работать или нет. Пожалуйста, объясните мне, как я могу получить блокировку пробуждения в моем классе обслуживания. Код для моего класса обслуживания:

public class LocationUpdater extends Service {
private LocationManager lm;
private LocationListener locationListener;
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
           Toast.makeText(getApplicationContext(), "Location updater started",Toast.LENGTH_LONG).show();
    locationListener = new MyLocationListener();
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,0,
                locationListener);
    } else {
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0,
                locationListener);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0, 0,
                locationListener);
    }


    return START_STICKY;
}

@Override
public void onDestroy() {
    lm.removeUpdates(locationListener);
    super.onDestroy();
}
@Override
public void onCreate() {
    Toast.maketext(getApplicationContext,"Updater Serive Created",Toast.LENGTH_LONG).show;


    } 
private class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location loc) {

        if (loc != null) {
         String latitude=loc.getLatitude();
         Striing longitude=loc.getLongitude();
         emailMyLocation(latitude,longitude);
         }
        }
       @Override
       public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
    }
    }

Это класс обслуживания, который обновляет местоположение моего устройства на мою электронную почту. Пожалуйста, скажите, как я могу заставить его работать, даже если экран выключен.


person Prince Gehlot    schedule 05.02.2015    source источник
comment
Попробуйте сделать так, чтобы ваш сервис реализовал разрешение WAKE_LOCK.   -  person Anggrayudi H    schedule 06.02.2015


Ответы (2)


Вы должны проверить ответ на этот вопрос в следующем потоке: Как я могу поддерживать работу службы Android, когда экран выключен?. Вероятно, вам нужен частичный WakeLock, который будет поддерживать работу процессора даже при выключенном экране. Вы также должны проверить документацию по PowerManager в Android API, которая объясняет поведение кильватерных замков.

person Piotr Wittchen    schedule 05.02.2015
comment
Да, мне нужна частичная блокировка пробуждения, но я не знаю, как ее получить. Я уже читал эту ветку. Я также пытался реализовать это, но у меня не получилось. - person Prince Gehlot; 05.02.2015

Вы можете получить блокировку пробуждения следующим образом: Создайте класс Globals и объявите блокировку пробуждения как статическую переменную.

 public class Globals {
          public static PowerManager.WakeLock wakelock;
 }

Теперь в вашем классе обслуживания объявите это:

   PowerManager.WakeLock wakeLock ;
   PowerManager pm;

Теперь у вас может быть две функции для wakelocks:

public void acquirewakeLock() {
         if(Globals.wakelock!=null){
         Globals.wakelock.release();
         Globals.wakelock=null;
         }
    pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
    "TrackerService");
    wakeLock.acquire();
    Globals.wakelock=this.wakeLock;  
}
public void releaseWakelock() {
      wakeLock.release();
      }

Теперь в вашем методе onCreate вы можете запросить wakelock следующим образом:

    @Override
    public void onCreate() {
       acquirewakeLock()
     }

Это позаботится о том, занят ли ЦП другими действиями и службами или нет. И вы сможете предоставить ЦП своему классу обслуживания. Вы также можете использовать

   wakelock.acquire(time in milliseconds)

если вы знаете время, необходимое вашему сервису для обработки. :)

person user3788866    schedule 06.02.2015