2015-02-05 177 views
1

我对服务的行为有点困惑。我创建了一个服务类,在我的设备的经度和纬度发生变化后立即通过电子邮件发送我的位置。服务是当我的手机屏幕打开时工作完美,但一旦手机屏幕关闭服务没有更新我的新位置。我已经读过SO关于唤醒锁的某处。我不知道如何实现唤醒锁在我服务,甚至我不知道它是否会工作或not.Please指导我怎样才能获得唤醒锁在我的服务类 代码为我服务类:当屏幕关闭时服务关闭

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) { 

    } 
    } 
    } 

这是服务类正在更新loc将我的设备连接到我的电子邮件。请告诉我即使屏幕关闭,我如何使其工作。

+0

试着让你的服务实现'WAKE_LOCK'权限。 – 2015-02-06 12:33:21

回答

0

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

+0

是的,我需要部分唤醒锁定,但我不知道如何获得这个。我已经读过这个线程。也试图实现这一点,但我没有工作。 – 2015-02-05 14:57:47

0

可以AQUIRE之后锁定这样的: 做一个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(); 
     } 

现在在你身边[R onCreate方法你可以用这个唱诗班激活锁定:

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

这会照顾CPU是否被其他活动和服务,举办或not.And你将能够给CPU到您的服务队的类。 你也可以使用

wakelock.acquire(time in milliseconds) 

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