2013-06-17 17 views
7

Tôi đang nghĩ đến việc có hai báo động riêng biệt để thu thập dữ liệu vị trí của người dùng mỗi giờ, mỗi giờ mất 59 phút để "kết nối" máy khách và một giây để thực sự có được vị trí và sau đó ngắt kết nối máy khách.Cách tiếp cận sử dụng pin hiệu quả nhất khi sử dụng LocationClient để nhận các bản cập nhật định kỳ là gì?

Về tuổi thọ pin, có bất kỳ điều gì khác mà tôi nên cân nhắc khi thực hiện vị trí của người dùng sẽ là cống chính của ứng dụng không? Hoặc, có cách tiếp cận khác để có hai báo động không? Tôi ban đầu chỉ có một báo động duy nhất, nhưng thực hiện một (! MLocationClient.isConnected) sau đó kết nối kiểm tra không cung cấp cho khách hàng đủ thời gian để kết nối.

Cảm ơn thông tin chi tiết của bạn.

Hai báo động sẽ đi ra một cái gì đó như thế này:

private int PERIODIC_UPDATE = 60000*60; //gets location and disconnects every hour 
private int PERIODIC_RECONNECTION_UPDATE = 60000*59; //connects 1 minute before getLocation call 

    Timer toReconnect = new Timer(); 
    toReconnect.schedule(new TimerTask() { 

     @Override 
     public void run() { 
      mLocationClient.connect(); 
     } 
    }, 5000, PERIODIC_RECONNECTION_UPDATE); 

    Timer theTimer = new Timer(); 
    theTimer.schedule(new TimerTask(){ 
     @Override 
     public void run() { 
      try { 
       if(!mLocationClient.isConnected()) { 
        mLocationClient.connect(); 
        //This will not have much affect because cannot so quickly, will remove. 
       } 

       Location theLocation = mLocationClient.getLastLocation(); 
       if(theLocation!=null) { 
        checkPostLocation(theLocation); 

        mLocationClient.disconnect(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }}, 5000, PERIODIC_UPDATE); 
+0

Cách tiết kiệm pin nhất là tắt tất cả ứng dụng Messenger và để màn hình tắt. Sau đó, bạn có thể ghi lại GPS mỗi giây một lần trong hơn 8 giờ. – AlexWien

+0

@ jsc123 Lưu ý rằng việc sử dụng Nhà cung cấp vị trí hợp nhất với "getLastLocation()" không đảm bảo vị trí GPS - bạn có thể nhận được vị trí chủ yếu dựa trên cảm biến, WiFi hoặc kết nối di động. Ngoài ra, bạn không nhất thiết phải buộc một vị trí mới, vì vậy bạn có thể nhận được cùng một vị trí bạn nhận được lần cuối nếu không có ứng dụng nào khác, bao gồm cả Google Services, đã yêu cầu vị trí được cập nhật. –

+0

@SeanBarbeau, việc triển khai của tôi có tốt nhất không nếu tôi luôn cố gắng lấy vị trí chính xác nhất định kỳ, mặc dù nó là một cống lớn hơn? – NumenorForLife

Trả lời

2

Bạn có thực sự cần phải theo dõi người sử dụng?

Nếu nó chỉ là về giao diện người dùng, sau đó sử dụng getLastKnownLocation (PASSIVE_PROVIDER) và bạn sẽ nhận được một cái gì đó chính xác giả sử họ sử dụng dịch vụ định vị trên điện thoại của họ ở một nơi khác.

Nếu bạn cần thực sự triangulate người dùng, hãy nhận ra các nhà cung cấp khác nhau sử dụng pin khác nhau. Thụ động < Mạng < GPS.

Bạn càng định vị người dùng, càng có nhiều pin với GPS dùng nhiều pin và thời gian nhất.

Bắt đầu dịch vụ theo ý định một lịch biểu, 1 giờ hoặc bất kỳ điều gì, chỉ cần một dịch vụ cần thiết. Chỉ sống tối đa 1 phút (hoặc ít hơn), hãy lắng nghe trên tất cả các nhà cung cấp Vị trí. Sau khi phút hoặc độ chính xác đủ tốt, bạn lưu kết quả và tắt dịch vụ.

+0

Xin chào HaMMeReD, cảm ơn lời đề nghị của bạn. Tôi muốn sử dụng GPS càng chính xác càng tốt. Do đó, mã trên có ý nghĩa không? Để tiết kiệm pin, tôi ngắt kết nối ngay sau khi sử dụng vị trí. Điều này sẽ không giúp tiết kiệm pin, bởi vì thay vì kết nối liên tục, tôi chỉ có nó trong khoảng 1 phút. – NumenorForLife

+0

Vâng, chỉ cần ngắt kết nối sau khi bạn tam giác, nhưng giả sử GPS có thể không khóa trong một phút, vì vậy bạn có thể muốn sử dụng các nhà cung cấp khác trong trường hợp gps không thành công. – HaMMeReD

+0

Lưu ý rằng nếu muốn chỉ định nhà cung cấp, bạn không thể sử dụng Dịch vụ LocationClient và Google Play hoặc mã trong câu hỏi của mình - bạn sẽ phải sử dụng API vị trí Android gốc. LocationClient sử dụng nhà cung cấp hợp nhất và chỉ trả về các vị trí với getProvider() = "hợp nhất" –

3

Hãy xem phần "Nhận Location cập nhật" trên các tài liệu nhà phát triển Android cho một cuộc thảo luận chi tiết về chủ đề này với Fused LocationProvider mới:

http://developer.android.com/training/location/receive-location-updates.html

này cung cấp cho bạn tùy chọn để đăng ký Intent với một LocationListener đến LocationProvider hợp nhất được tự động kích hoạt bởi khung công tác Google Services bên trong khi nó được coi là "hiệu quả" để làm như vậy. Tôi tin tưởng rằng khung công tác này có tiềm năng lớn hơn nhiều để tối ưu hóa việc sử dụng năng lượng, vì nó có nhiều kiến ​​thức hơn về những gì khác đang xảy ra trong hệ thống so với Timer được đăng ký ứng dụng.

Dưới đây là lựa chọn của bạn cho đăng ký người nghe với mức độ ưu tiên công suất khác nhau, điều này sẽ dẫn đến mức độ khác nhau của cống pin, được liệt kê trong các tài liệu trên:

  • PRIORITY_BALANCED_POWER_ACCURACY - Được sử dụng với setPriority (int) để yêu cầu độ chính xác mức "chặn". Độ chính xác mức khối được xem là chính xác khoảng 100 mét. Sử dụng độ chính xác thô như thế này thường tiêu thụ ít năng lượng hơn.
  • PRIORITY_HIGH_ACCURACY - Được sử dụng với setPriority (int) để yêu cầu các vị trí chính xác nhất hiện có. Điều này sẽ trả về vị trí tốt nhất có sẵn (và tiềm năng lớn nhất cho việc tiêu hao năng lượng).
  • PRIORITY_NO_POWER - Được sử dụng với setPriority (int) để yêu cầu độ chính xác cao nhất có thể với mức tiêu thụ điện năng không thêm. Sẽ không có địa điểm nào được trả lại trừ khi một khách hàng khác yêu cầu cập nhật vị trí trong trường hợp này yêu cầu này sẽ hoạt động như một người nghe thụ động đến các địa điểm đó.
Các vấn đề liên quan