我想每15分钟将位置更新发布到服务器,即使应用未在前台运行

用户名

我希望从Android手机到服务器的时间间隔每15分钟将位置更新发送到服务器。服务或警报管理器是最好的选择。

如果启动服务,是否可以启动asynctask将位置发布到服务器?

这是我使用的代码:

    @Override
    public void onStart(Intent intent, int startId) {
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        listener = new MyLocationListener();
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 4000, 0, listener);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                4000, 0, listener);
    }




    public class MyLocationListener implements LocationListener {

        public void onLocationChanged(final Location loc) {
            Log.i("**************************************", "Location changed");
            if (isBetterLocation(loc, previousBestLocation)) {
                loc.getLatitude();
                loc.getLongitude();

//              
//              intent.putExtra("Latitude", loc.getLatitude());
//              intent.putExtra("Longitude", loc.getLongitude());
//              intent.putExtra("Provider", loc.getProvider());
//              
//              sendBroadcast(intent);

            }
        }

        public void onProviderDisabled(String provider) {
            Toast.makeText(getApplicationContext(), "Gps Disabled",
                    Toast.LENGTH_SHORT).show();
        }

        public void onProviderEnabled(String provider) {
            Toast.makeText(getApplicationContext(), "Gps Enabled",
                    Toast.LENGTH_SHORT).show();
        }
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

    }
}

我不知道如何每隔十五分钟运行一次服务后台。.我想在获取新的位置更新时启动aysnctask。是服务还是警报管理器是最佳选择。如果启动服务,是否可以启动asynctask将位置发布到服务器?

雅罗斯拉夫·梅特卡利克(Yaroslav Mytkalyk)

更新的答案

旧答案不适用于定位到M或更高版本的应用,因为静态连接接收器将不再接收广播

现在,最好的选择是FusedLocationApi,它是Google Play服务的一部分。

compile 'com.google.android.gms:play-services-location:[version_here]'

创建一个IntentService处理位置更新

/**
 * Handles location updates from FusedLocationProvider
 */
public final class LocationUpdateService extends IntentService {

    private static final String TAG = "LocationUpdateService";

    public static final String ACTION_HANDLE_LOCATION = "ACTION_HANDLE_LOCATION";

    public LocationUpdateService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(final Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (action != null) {
                switch (action) {
                    case ACTION_HANDLE_LOCATION:
                        onActionHandleLocation(intent);
                        break;

                    default:
                        Log.w(TAG, "onHandleIntent(), unhandled action: " + action);
                        break;
                }
            }
        }
    }

    private void onActionHandleLocation(@NonNull final Intent intent) {
        if (!LocationResult.hasResult(intent)) {
            Log.w(TAG, "No location result in supplied intent");
            return;
        }

        final LocationResult locationResult = LocationResult.extractResult(intent);
        if (locationResult == null) {
            Log.w(TAG, "LocationResult is null in supplied intent");
            return;
        }

        // TODO send to server using a blocking request.
        // Remember that this is the background thread already
    }
}

不要忘记将其添加到清单应用程序标签中

<service android:name=".LocationUpdateService"/>

请求位置权限,连接GoogleApiClient,您现在可以执行以下操作

@NonNull
private static PendingIntent createLocationServiceIntent(@NonNull final Context context) {
    final Intent intent = new Intent(context, LocationUpdateService.class);
    intent.setAction(LocationUpdateService.ACTION_HANDLE_LOCATION);

    return PendingIntent.getService(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public static void scheduleLocationUpdates(@NonNull final Context context,
        @NonNull final GoogleApiClient googleApiClient) {
    // Make sure you have permission, request if necessary
    if (googleApiClient.isConnected() &&
            ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
            // ACCESS_COARSE_LOCATION, depending on what you want
            == PackageManager.PERMISSION_GRANTED) {

        LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
                LocationRequest.create().setInterval(AlarmManager.INTERVAL_FIFTEEN_MINUTES),
                createLocationServiceIntent(context));
    }
}

public static void unscheduleLocationUpdates(@NonNull final Context context,
        @NonNull final GoogleApiClient googleApiClient) {
    if (googleApiClient.isConnected()) {
        LocationServices.FusedLocationApi
                .removeLocationUpdates(googleApiClient, createLocationServiceIntent(context));
    }
}

旧答案

AsyncTask适用于简短的后台操作,主要是在UI中等待时。在这种情况下,您最好使用WakeLock启动服务但是请注意,您每15分钟可能会耗尽一次电池的电量当设备未连接到网络时,请考虑不安排警报。

1)在清单中注册一个静态的BroadcastReceiver 以监视设备是否已连接。Android SDK中网络事件的意图动作

2)当设备连接到互联网并且允许位置时,启动一个服务,该服务将保留WakeLock,侦听一个位置更新,取消注册位置更新,将位置发送到服务器,安排AlarmManager,释放WakeLock并校准stopSelf(); 如果位置更新未到,请考虑超时。如果达到超时,请取消注册位置更新,注册下一个警报,释放WakeLock并调用stopSelf。

3)如果您在接收器中接收到断开的网络,请取消所有警报,并在运行时停止服务。

根据要求,执行第2步的代码示例

public final class ConnectivityReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        final PendingIntent wakeupIntent = PendingIntent.getService(context, 0,
                new Intent(context, LocationUpdaterService.class), PendingIntent.FLAG_UPDATE_CURRENT);

        final boolean hasNetwork = !intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        if (hasNetwork) {
            // start service now for doing once
            context.startService(new Intent(context, LocationUpdaterService.class));

            // schedule service for every 15 minutes
            alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_FIFTEEN_MINUTES,
                    AlarmManager.INTERVAL_FIFTEEN_MINUTES, wakeupIntent);
        } else {
            alarmManager.cancel(wakeupIntent);
        }
    }

}

public  final class LocationUpdaterService extends Service implements LocationListener {

    private enum State {
        IDLE, WORKING;
    }



    private static State state;

    private LocationManager locationManager;
    private WakeLock wakeLock;

    static {
        state = State.IDLE;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        this.wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "LocationUpdaterService");
    }


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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (state == State.IDLE) {
            state = State.WORKING;
            this.wakeLock.acquire();
            // register location updates, not gonna code it you know

        }
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        state = State.IDLE;
        if (this.wakeLock.isHeld()) {
            this.wakeLock.release();
        }
    }

    private void sendToServer(Location location) {
        // send to server in background thread. you might want to start AsyncTask here
    }

    private void onSendingFinished() {
        // call this after sending finished to stop the service
        this.stopSelf(); //stopSelf will call onDestroy and the WakeLock releases.
        //Be sure to call this after everything is done (handle exceptions and other stuff) so you release a wakeLock
        //or you will end up draining battery like hell
    }

    @Override
    public void onLocationChanged(Location location) {
        locationManager.removeUpdates(this); // you will want to listen for updates only once
        sendToServer(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android:如何每3分钟和5分钟将数据从服务器同步到我的应用程序?

来自分类Dev

如何每5分钟通知服务器一次用户的位置?

来自分类Dev

即使没有位置更改,也将位置更新发送到服务器

来自分类Dev

django服务器运行时每5分钟运行一次代码

来自分类Dev

如何在Web服务器运行时每2分钟调用一次函数?

来自分类Dev

计时器时间表运行方法每15分钟

来自分类Dev

将cron作业配置为每15分钟在Jenkins上运行

来自分类Dev

即使应用程序未在Cordova中运行,如何每隔5分钟获取一次地理位置信息

来自分类Dev

每15分钟更新一次表格

来自分类Dev

每15分钟使用systemd计时器

来自分类Dev

每隔30分钟在远程Ubuntu服务器上运行我的python3程序

来自分类Dev

每5分钟在服务器上执行一次php脚本

来自分类Dev

服务器每5分钟重启一次

来自分类Dev

Microsoft SQL服务器每30分钟计数一次

来自分类Dev

iOS应用:20分钟后服务器超时验证。这正常吗,我该如何处理?

来自分类Dev

如何检查服务器是否已启动超过15分钟?

来自分类Dev

15-20分钟的空闲时间后,服务器上的RPCS消失

来自分类Dev

运行60分钟后如何关闭Linux服务器?

来自分类Dev

将TTime舍入到最接近的15分钟

来自分类Dev

约20分钟后服务器崩溃

来自分类Dev

-ERR超过登录限制15分钟。减少对POP3服务器的请求频率

来自分类Dev

每15分钟运行一次crontab不能在linux redhat上运行

来自分类Dev

将Cronjob设置为从9:30 am到4:00 pm每5分钟运行一次

来自分类Dev

重大的位置变化至少不会每15分钟触发一次

来自分类Dev

如何每15分钟运行一次android函数,特别是每天15分钟运行一次?

来自分类Dev

每15分钟发出一次HTTP请求的后台服务

来自分类Dev

可疑的crontab条目每15分钟运行一次“ xribfa4”

来自分类Dev

自动执行Selenium脚本以每15分钟运行一次?

来自分类Dev

如何设置100个并发用户的Jmeter环境在服务器上运行30分钟?

Related 相关文章

  1. 1

    Android:如何每3分钟和5分钟将数据从服务器同步到我的应用程序?

  2. 2

    如何每5分钟通知服务器一次用户的位置?

  3. 3

    即使没有位置更改,也将位置更新发送到服务器

  4. 4

    django服务器运行时每5分钟运行一次代码

  5. 5

    如何在Web服务器运行时每2分钟调用一次函数?

  6. 6

    计时器时间表运行方法每15分钟

  7. 7

    将cron作业配置为每15分钟在Jenkins上运行

  8. 8

    即使应用程序未在Cordova中运行,如何每隔5分钟获取一次地理位置信息

  9. 9

    每15分钟更新一次表格

  10. 10

    每15分钟使用systemd计时器

  11. 11

    每隔30分钟在远程Ubuntu服务器上运行我的python3程序

  12. 12

    每5分钟在服务器上执行一次php脚本

  13. 13

    服务器每5分钟重启一次

  14. 14

    Microsoft SQL服务器每30分钟计数一次

  15. 15

    iOS应用:20分钟后服务器超时验证。这正常吗,我该如何处理?

  16. 16

    如何检查服务器是否已启动超过15分钟?

  17. 17

    15-20分钟的空闲时间后,服务器上的RPCS消失

  18. 18

    运行60分钟后如何关闭Linux服务器?

  19. 19

    将TTime舍入到最接近的15分钟

  20. 20

    约20分钟后服务器崩溃

  21. 21

    -ERR超过登录限制15分钟。减少对POP3服务器的请求频率

  22. 22

    每15分钟运行一次crontab不能在linux redhat上运行

  23. 23

    将Cronjob设置为从9:30 am到4:00 pm每5分钟运行一次

  24. 24

    重大的位置变化至少不会每15分钟触发一次

  25. 25

    如何每15分钟运行一次android函数,特别是每天15分钟运行一次?

  26. 26

    每15分钟发出一次HTTP请求的后台服务

  27. 27

    可疑的crontab条目每15分钟运行一次“ xribfa4”

  28. 28

    自动执行Selenium脚本以每15分钟运行一次?

  29. 29

    如何设置100个并发用户的Jmeter环境在服务器上运行30分钟?

热门标签

归档