2011-10-03 101 views
3

我以前使用位置偵聽器編寫了一個應用程序,但沒有訪問真實設備。現在我有一個薑餅手機(2.3.3),正如預期的那樣,我的應用程序是一個電池殺手。requestLocationUpdates對薑餅設備沒有任何影響的參數

我開始檢查更新時間和最小距離參數對requestLocationUpdates的影響,因爲文檔說這些會影響電池消耗。

我想知道如何調整這些參數可能會影響電池的消耗,據我所知,GPS將不得不繼續,以便知道設備已移動的距離,只有通知實際過程應用程序會改變,而芯片繼續使用電源。

這篇文章Understanding the LocationListener in Android提出了一個可信的解釋,表明狀態將變爲「暫時不可用」,並且GPS圖標將從屏幕上消失一段時間,直到根據需要再次打開爲止。到指定的更新週期。

這不會發生在我的手機上 - 即使更新週期爲90秒,GPS圖標也會保持不變,並且我不會發生狀態變化,根據文章末尾的一些帖子,其他人發現一樣。

  • SO上的任何用戶在2.3.3上遇到同樣的事情嗎?

  • 或者讓Android放棄管理GPS芯片,並期望用戶爲GPS編寫自己的電池管理制度?

對於信息我最少的代碼來演示此行爲如下所示:

public class GpsTimeOutTestActivity extends Activity implements 
     LocationListener { 

    private LocationManager mLocMgr; 
    private long mUpdatePeriod = 90000; // 90 seconds 
    private float mMinDistance = 10.0f; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
       mUpdatePeriod, mMinDistance, (LocationListener) this); 
    } 

    @Override 
    protected void onPause() { 
     mLocMgr.removeUpdates((LocationListener) this); 
     super.onPause(); 
    } 

    @Override 
    public void onLocationChanged(Location loc) { 
     String str = null; 
     NumberFormat formatter = new DecimalFormat("##0.000"); 
     String fLat = formatter.format(loc.getLatitude()); 
     String fLon = formatter.format(loc.getLongitude()); 
     String provider = loc.getProvider(); 
     provider = (provider == null) ? "No provider" : provider; 
     str = "Locn chg " + provider + " Lat/Lon " + fLat + "/" + fLon; 
     if (loc.hasAccuracy()) 
      str+= " accy " + loc.getAccuracy(); 

     showSomeOutput(str); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     String str = "Prov disabled " + provider; 
     showSomeOutput(str); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     String str = "Prov enabled " + provider; 
     showSomeOutput(str); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     String str = "Status chg " + provider; 
     switch (status) { 
     case android.location.LocationProvider.OUT_OF_SERVICE: 
      str+= " OUT OF SERVICE"; 
      break; 
     case android.location.LocationProvider.AVAILABLE: 
      str+= " AVAILABLE"; 
      break; 
     case android.location.LocationProvider.TEMPORARILY_UNAVAILABLE: 
      str+= " TEMPORARILY UNAVAILABLE"; 
      break; 
     default: 
      str+= " UNKNOWN STATUS"; 
     } 
     showSomeOutput(str); 
    } 

    private void showSomeOutput(String str) { 
     Log.d("GPSTEST", str); 
     EditText et = (EditText) findViewById(R.id.editText1); 
     Editable existingText = et.getText(); 
     existingText.append("\n" + str); 
    } 
} 

所有評論將受到歡迎。

回答

5

如果您深入瞭解GPS provider的內部結構,您會發現Android會告訴本地驅動程序最低更新時間。然後本地車手可以決定做什麼 - 根據我的經驗,他們都忽視了這一點並繼續全速前進。

這是惱人的,但並不完全違反javadocs

的通知的頻率可以使用minTime和minDistance纔會參數來控制。如果minTime大於0時,的LocationManager 可能潛在休息位置更新之間minTime毫秒,以節省電力

(強調)

的解決方案是根據需要只註冊LocationListener的。如果您在添加requestSingleUpdate之前需要定位API,則必須註冊偵聽器,然後在對位置質量滿意時取消註冊。這將關閉GPS並節省電力。

+0

感謝您的鏈接。這是有道理的,因爲我可以調和我看到的行爲與我給出的鏈接所報告的行爲。實質上,我想有些設備的司機會採取(或接受)該爭論的注意,其他人則不會。如果requestLocationUpdates(..)返回一個結果代碼讓你知道參數是否被忽略,那本來會很好。看起來我自己當時必須寫一些生態友好的制度。 – NickT

0

如果您正在收聽gps,無論您設置的時間間隔是多少,該圖標都會出現在菜單欄中。假設設置通知時間和距離只會在滿足這些閾值時提醒您的應用程序,這是正確的。該芯片不得不繼續提醒你的變化。

你的應用程序需要什麼需要不斷更新gps?我通常使用requestSingleUpdate函數來獲取gps位置。

+0

它看起來像現在一直在呆,但這不符合我給出的鏈接報告的行爲。如果它始終在運行,那麼說明更新時間和距離影響電池使用的文檔就是錯誤的。我希望我的應用的行爲與其他所有不需要requestSingleUpdate的GPS應用程序相同,這些應用程序僅在API9中提供。我希望我的應用在API7上運行 – NickT

相關問題