【问题标题】:Service is off when screen is turns off屏幕关闭时服务关闭
【发布时间】:2015-02-05 13:44:54
【问题描述】:

我对服务的行为有点困惑。我创建了一个服务类,只要我的设备的纬度和经度发生变化,就会通过电子邮件发送我的位置。当我的手机屏幕显示时,服务运行良好已打开,但一旦手机屏幕关闭,该服务就不会更新我的新位置。我在 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) {

    }
    }
    }

这是将我的设备位置更新到我的电子邮件的服务类。请告诉我如何使它工作,即使屏幕关闭。

【问题讨论】:

  • 尽量让你的服务实现WAKE_LOCK权限。

标签: android android-service android-wake-lock


【解决方案1】:

您应该在以下主题中查看此问题的答案:How can I keep my Android service running when the screen is turned off?。可能,您需要一个部分 WakeLock,即使屏幕关闭也能保持 CPU 运行。您还应该查看 Android API 中 PowerManager 的文档,其中解释了唤醒锁的行为。

【讨论】:

  • 是的,我需要部分唤醒锁,但我不知道如何获取这个。我已经阅读了这个线程。也尝试实现这个,但我没有工作。
【解决方案2】:

您可以像这样获取唤醒锁: 创建一个 Globals 类并将唤醒锁声明为静态变量

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

现在在你的服务类中声明这些:

   PowerManager.WakeLock wakeLock ;
   PowerManager pm;

现在你可以有两个唤醒锁的功能:

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 方法中,您可以使用以下命令获取唤醒锁:

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

这将处理 CPU 是否被其他活动和服务占用。您将能够将 cpu 分配给您的服务类。 你也可以使用

   wakelock.acquire(time in milliseconds)

如果您知道您的服务需要处理的时间。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多