我对服务的行为感到困惑。我创建了一个服务类,一旦我的设备的纬度和经度发生变化,就会通过电子邮件发送我的位置。我的手机屏幕上的服务工作正常虽然手机屏幕关闭服务并没有更新我的新位置。我已经在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) {
}
}
}
这是将我的设备位置更新为我的电子邮件的服务类。请告诉我即使屏幕关闭也能让它工作。
答案 0 :(得分:0)
您应该在以下主题中查看此问题的答案:How can I keep my Android service running when the screen is turned off?。可能需要一个部分WakeLock,即使屏幕关闭也会保持CPU运行。您还应该检查Android API中PowerManager的文档,它解释了唤醒锁的行为。
答案 1 :(得分:0)
您可以像这样获取唤醒锁: 创建一个Globals类并将wakelock声明为静态变量
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)
如果您知道服务需要处理的时间。 :)