使用LocationListener(使用谷歌播放服务)作为服务消耗太多电池(Android 4.4.2)

时间:2014-02-12 03:23:15

标签: gps android-location

我的服务每30秒返回一次当前位置,我的问题是该服务消耗了大约40%的电池。即使我增加时间间隔,GPS图标也始终处于活动状态。我在Nexus 4 android 4.4.2中看到了这个问题。一旦调用了回调OnLocationChanged,GPS就会一直处于唤醒状态,这会占用整个电池。使用我的其他手机Nexus One android 2.2.3,我没有看到这个问题,GPS每30秒开启一次并关闭。我没有电池消息。该服务使用位置请求,具有.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY),除了使用GPS和网络之外,情况并非如此。我认为android 4.4.2存在问题,或者是谷歌播放服务

这是我的服务代码:

public class MyServiceGpsDebug extends Service implements       
 GooglePlayServicesClient.ConnectionCallbacks,    
 GooglePlayServicesClient.OnConnectionFailedListener,LocationListener 
 {

     IBinder mBinder = new LocalBinder();

      private LocationClient mLocationClient;
      private LocationRequest mLocationRequest;
      // Flag that indicates if a request is underway.
      private boolean mInProgress;

      private Boolean servicesAvailable = false;

      public class LocalBinder extends Binder 
      {
            public MyServiceGpsDebug getServerInstance() 
            {
                return MyServiceGpsDebug.this;
            }
      }

      @Override
      public void onCreate() 
      {
          super.onCreate();

          mInProgress = false;
          // Create the LocationRequest object
          mLocationRequest = LocationRequest.create();
          // Use high accuracy
          mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
          // Set the update interval to 5 seconds
          mLocationRequest.setInterval(Constants.UPDATE_INTERVAL);
          // Set the fastest update interval to 1 second
          mLocationRequest.setFastestInterval(Constants.FASTEST_INTERVAL);

          servicesAvailable = servicesConnected();
          mLocationClient = new LocationClient(this, this, this);   
      }

          private boolean servicesConnected() 
      {

          // Check that Google Play services is available
          int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

          // If Google Play services is available
          if (ConnectionResult.SUCCESS == resultCode) 
          {
              return true;
          } 
          else
          {
              return false;
          }
      }

      public int onStartCommand (Intent intent, int flags, int startId)
      {
          super.onStartCommand(intent, flags, startId);

          if(!servicesAvailable || mLocationClient.isConnected() || mInProgress)
            return START_STICKY;

          setUpLocationClientIfNeeded();
          if(!mLocationClient.isConnected() || !mLocationClient.isConnecting() && !mInProgress)
          {
            appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Started", Constants.LOG_FILE);
            mInProgress = true;
            mLocationClient.connect();
          }

          return START_STICKY;
      }

      private void setUpLocationClientIfNeeded()
      {
            if(mLocationClient == null) 
                  mLocationClient = new LocationClient(this, this, this);
      }

          @Override
      public void onLocationChanged(Location location) 
      {
          // Report to the UI that the location was updated
          String msg = Double.toString(location.getLatitude()) + "," + Double.toString(location.getLongitude());
          Log.d("debug", msg);
          // Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
          appendLog(msg, Constants.LOCATION_FILE);
      }

      @Override
      public IBinder onBind(Intent intent) 
      {
            return mBinder;
      }

      public String getTime() 
      {
            SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return mDateFormat.format(new Date());
      }

      public void appendLog(String text, String filename)
      {       
             File logFile = new File(filename);
             if (!logFile.exists())
             {
                try
                {
                   logFile.createNewFile();
                } 
                catch (IOException e)
                {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
                }
             }
             try
             {
                //BufferedWriter for performance, true to set append to file flag
                BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
                buf.append(text);
                buf.newLine();
                buf.close();
             }
             catch (IOException e)
             {
                // TODO Auto-generated catch block
                e.printStackTrace();
             }
      }

      @Override
      public void onDestroy()
      {
          // Turn off the request flag
          mInProgress = false;
          if(servicesAvailable && mLocationClient != null)
          {
                mLocationClient.removeLocationUpdates(this);
                // Destroy the current location client
                mLocationClient = null;
          }
          // Display the connection status
          // Toast.makeText(this, DateFormat.getDateTimeInstance().format(new Date()) + ": Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show();
          appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Stopped", Constants.LOG_FILE);
          super.onDestroy();  
      }


      @Override
      public void onConnected(Bundle bundle) 
      {

          // Request location updates using static settings
          mLocationClient.requestLocationUpdates(mLocationRequest, this);
          appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Connected", Constants.LOG_FILE);

      }

      @Override
      public void onDisconnected() 
      {
          // Turn off the request flag
          mInProgress = false;
          // Destroy the current location client
          mLocationClient = null;
          // Display the connection status
          // Toast.makeText(this, DateFormat.getDateTimeInstance().format(new Date()) + ": Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show();
          appendLog(DateFormat.getDateTimeInstance().format(new Date()) + ": Disconnected", Constants.LOG_FILE);
      }


      @Override
      public void onConnectionFailed(ConnectionResult connectionResult) 
      {
        mInProgress = false;

          if (connectionResult.hasResolution()) 
          {

          // If no resolution is available, display an error dialog
          } else {

          }
      }


      public final class Constants 
      {

            // Milliseconds per second
            private static final int MILLISECONDS_PER_SECOND = 1000;
            // Update frequency in seconds
            private static final int UPDATE_INTERVAL_IN_SECONDS = 60;
            // Update frequency in milliseconds
            public static final long UPDATE_INTERVAL = MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;
            // The fastest update frequency, in seconds
            private static final int FASTEST_INTERVAL_IN_SECONDS = 60;
            // A fast frequency ceiling in milliseconds
            public static final long FASTEST_INTERVAL = MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS;
            // Stores the lat / long pairs in a text file
            public static final String LOCATION_FILE = "sdcard/location.txt";
            // Stores the connect / disconnect data in a text file
            public static final String LOG_FILE = "sdcard/log.txt";


            /**
             * Suppress default constructor for noninstantiability
             */
            private Constants() {
                throw new AssertionError();
            }
      }
}

1 个答案:

答案 0 :(得分:0)

我有与Nexus 4类似的问题。我的应用程序有一个使用位置更新的服务(融合位置或Android提供程序,而不是两者)。一切都适用于所有Android手机,但在Nexus4后一段时间手机变热和慢,即使我杀了应用程序(通过DDMS,100%停止)。唯一的解决方案是杀死Google Play服务。 我认为nexus 4的播放服务存在一个错误。有一个肮脏的解决方案,每隔30分钟杀死Google Play服务,例如phone = nexus4,但我不知道是否可能