2015-02-05 199 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) 

如果你知道你的服務需要處理的時間。 :)