0

15 分ごとに場所を GCM に送信する必要があるアプリケーションを実装しています。15 分ごとに呼び出される AlarmManager を実装しました。

これが私のアラームマネージャーのクラスです

public class LocationAlarmManager {


    Context mContext = null;
    public LocationAlarmManager (Context context) {
        mContext = context;
    }

    private AlarmManager alarmManager;
    private Intent gpsTrackerIntent;
    private PendingIntent pendingIntent;
    private static final String TAG = "LocationAlarmManager";


    public void startAlarmManager() {
        Log.d(TAG, "startAlarmManager");

        alarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
        gpsTrackerIntent = new Intent(mContext, GpsTrackerAlarmReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(mContext, 0, gpsTrackerIntent, 0);

        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime(),
                15 * 60000, // 60000 = 1 minute
                pendingIntent);
    }

    public void cancelAlarmManager() {
        Log.d(TAG, "cancelAlarmManager");
        Intent gpsTrackerIntent = new Intent(mContext, GpsTrackerAlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, gpsTrackerIntent, 0);
        AlarmManager alarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
    }

}

それはGpsTrackerAlarmReceiverを呼び出します

// make sure we use a WakefulBroadcastReceiver so that we acquire a partial wakelock
public class GpsTrackerAlarmReceiver extends WakefulBroadcastReceiver {
    private static final String TAG = "GpsTrackerAlarmReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {        context.startService(new Intent(context, SmartLocationService.class));
    }
}

現在地を処理するために、SmartLocationService に以下を実装しました。

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

    private static final String TAG = "SmartLocationService";

    // use the websmithing defaultUploadWebsite for testing and then check your
    // location with your browser here: https://www.websmithing.com/gpstracker/displaymap.php
    private String defaultUploadWebsite;

    private boolean currentlyProcessingLocation = false;
    private LocationRequest locationRequest;
    private LocationClient locationClient;
    public LocationManager locationManager;
    Context context;
    // flag for GPS status
    public boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude
    public Location previousBestLocation;

    private double mLastLatitudeLocation = 0;
    private double mLastLongitudeLocation = 0;

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

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // if we are currently trying to get a location and the alarm manager has called this again,
        // no need to start processing a new location.
        if (!currentlyProcessingLocation) {
            currentlyProcessingLocation = true;
            startTracking();
        }

        return START_NOT_STICKY;
    }

    private void startTracking() {
        Log.d(TAG, "startTracking");

        if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) {
            locationClient = new LocationClient(this,this,this);

            if (!locationClient.isConnected() || !locationClient.isConnecting()) {
                locationClient.connect();
            }
        } else {
            Log.e(TAG, "unable to connect to google play services.");
        }
    }

    protected void sendLocationDataToWebsite(Location loc) {
        MessageHandler messageHandler = new MessageHandler(SmartLocationService.this);
        messageHandler.sendLocationMessage(loc); //send location to GCM

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

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

    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            Log.e(TAG, "position: " + location.getLatitude() + ", " + location.getLongitude() + " accuracy: " + location.getAccuracy());
            sendLocationDataToWebsite(location);
        }
    }

    private void stopLocationUpdates() {
        if (locationClient != null && locationClient.isConnected()) {
            locationClient.removeLocationUpdates(this);
            locationClient.disconnect();
        }
    }

    /**
     * Called by Location Services when the request to connect the
     * client finishes successfully. At this point, you can
     * request the current location or start periodic updates
     */
    @Override
    public void onConnected(Bundle bundle) {
        context = getApplicationContext();
        Log.d(TAG, "onConnected");
        locationRequest = LocationRequest.create();
        locationRequest.setInterval(900000); // milliseconds
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationClient.requestLocationUpdates(locationRequest, this);
    }
    /**
     * Called by Location Services if the connection to the
     * location client drops because of an error.
     */
    @Override
    public void onDisconnected() {
        Log.e(TAG, "onDisconnected");

        stopLocationUpdates();
        stopSelf();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.e(TAG, "onConnectionFailed");

        stopLocationUpdates();
        stopSelf();
    }
}

これは機能しますが、15 分のタイムスロットでロケーション サービスが複数回呼び出されます。理由を知っている人はいますか?これはバッテリーの消費を抑える良い方法ですか (GPS)?

ありがとう

4

0 に答える 0