Периодически отправлять текущее местоположение на сервер в Android - PullRequest
11 голосов
/ 23 февраля 2012

Мне необходимо периодически отправлять информацию о моем текущем местоположении (шир. И долг.) На сервер (например, каждые 5 минут).Есть ли лучший способ?Я знаю, как узнать текущее местоположение и отправить данные на сервер.Но как мне повторить это в периодических интервалах?

Ответы [ 5 ]

11 голосов
/ 23 февраля 2012

Зарегистрируйте сигнал тревоги, используя AlarmManager, чтобы проснуться через 5 минут, когда пользователь впервые откроет приложение.создайте сервис (извлечение местоположения и обновление на сервере), чтобы он работал, когда тревога уведомляет ваше приложение.После того, как служба закончила работу, зарегистрируйтесь для тревоги снова, чтобы проснуться через 5 минут.таким образом, вы можете достичь своей цели.

ref

Android: Как периодически отправлять местоположение на сервер

http://developer.android.com/reference/android/app/AlarmManager.html

http://developer.android.com/reference/android/app/Service.html

1-е редактирование - добавление примера кода

Шаг 1 - Создание диспетчера аварийных сигналов и регистрация аварийных сигналов

AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(Main.this, YourWakefulReceiver.class);
bool flag = (PendingIntent.getBroadcast(Main.this, 0,
                intent, PendingIntent.FLAG_NO_CREATE)==null);
/*Register alarm if not registered already*/
if(flag){
PendingIntent alarmIntent = PendingIntent.getBroadcast(Main.this, 0,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Create Calendar obj called calendar
        Calendar calendar = Calendar.getInstance();

/* Setting alarm for every one hour from the current time.*/
int intervalTimeMillis = 1000 * 60 * 60; // 1 hour 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), intervalTimeMillis,
                        alarmIntent);
}

Шаг 2 - Создание класса приемника

public class YourWakefulReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Intent service = new Intent(context, SimpleWakefulService.class);
            startWakefulService(context, service);
        }
    }
}

Setp 3 - Создать класс обслуживания

public class SimpleWakefulService extends IntentService {

    private static String tagName = "YourService";

    public SimpleWakefulService() {
        super("YourService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // Start your location
        LocationUtil.startLocationListener();
        try {
        // Wait for 10 seconds
            Thread.sleep(1000*10);
        } catch (InterruptedException e) {
        }
        //Stop location listener
        LocationUtil.stopLocationListener();
        // upload or save location
        uploadGps();

        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

}

Шаг 4 - Зарегистрировать службу и получателя

<service android:name="com.envision.ghari.services.SimpleWakefulService"></service>
        <receiver android:name="com.envision.ghari.receivers.YourWakefulReceiver"></receiver>

Примечание. Этот код предназначен для понимания реализации.Он не скомпилируется.

2 голосов
/ 23 февраля 2012

Использование BroadcastReceiver хороший выбор для отправки периодических запросов.

Здесь - руководство по использованию BroadcastReceiver.

1 голос
/ 23 февраля 2012

Лучший способ активировать службу с помощью AlarmManager и опубликовать местоположение, полученное на сервере.

0 голосов
/ 19 января 2017

Я занимаюсь разработкой приложения, которое в течение 10 и 15 секунд в службе получает положение мобильного телефона в течение всего дня, оно работает нормально, но иногда метод OnLocationChanged приемника сетевого провайдера перестает вызываться.

 import android.location.Address;
    import android.location.Geocoder;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;
    import android.widget.TextView;


    import java.io.IOException;
    import java.util.List;

    import foodinn.databases.LocationUpdaterDatabase;

    public class LocationUpdatesActivity extends AppCompatActivity {
        private LocationUpdaterDatabase locationUpdaterDatabase;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_location_updates);

            locationUpdaterDatabase = new LocationUpdaterDatabase(this, "Locations.db", null, 1);

            final Geocoder geocoder = new Geocoder(this);

            ListView listView = (ListView) findViewById(R.id.locationUpdatesListView);

            listView.setAdapter(new SimpleCursorAdapter(this, R.layout.location_updates_list_view_view, locationUpdaterDatabase.getLocationUpdates(), new String[] {"latitude", "longitude", "whenUpdated"}, new int[] {R.id.listViewTextView1, R.id.listViewTextView2, R.id.listViewTextView3}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER));

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    double latitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView1)).getText().toString());
                    double longitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView2)).getText().toString());

                    try {
                        List<Address> addressList = geocoder.getFromLocation(latitude, longitude, 1);

                        String address = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                        String city = addressList.get(0).getLocality();
                        String state = addressList.get(0).getAdminArea();
                        String country = addressList.get(0).getCountryName();
                        String postalCode = addressList.get(0).getPostalCode();
                        String knownName = addressList.get(0).getFeatureName();

                        ((TextView) view.findViewById(R.id.listViewTextView4)).setText(address + ", " + city + ", " + country);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
0 голосов
/ 23 февраля 2012

Поскольку для этого не требуется взаимодействие с пользовательским интерфейсом, для этого необходимо создать службу, служба будет вызывать метод requestLocationUpdates, в этом методе параметр передается минимальное время до 5 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...