Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
SkyL1ne_tm
2 / 2 / 0
Регистрация: 06.07.2013
Сообщений: 97
1

GPSTracker как Service

24.05.2015, 21:00. Просмотров 940. Ответов 20
Метки нет (Все метки)

Написал приложение, которое определяет местоположение по GPS/WiFi(мобильным сетям), показывает на карте в виде метки, записывает координаты в базу данных SQLite, а затем можно просматривать треки перемещений за день. Но, приложение работает только когда экран активен.
Возникла потребность сделать так, чтобы определение координат и запись их в БД работало в фоне(экран не активен, приложение свернуто и т.п.)

В MainActivity оставил инициализацию карты, рисование треков и прочее, типа определения переменных и т.п.
В Service перенес запрос на определение местоположение через LocationManager, получение самих координат и запись их в БД. Вот примерный код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public class TrackerService extends Service implements LocationListener {
 
    final String myLog = "my_Logs";
    LocationManager locationManager;
    double latitude, longitude;
    LatLng myPosition;
    Calendar addTimeCalendar;
    String addDate;
    Cursor c = null;
 
    public void onCreate() {
        super.onCreate();
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    }
 
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(myLog, "onStartCommand");
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000 * 60, 25, this);
        Log.d(myLog, "GPS_Provider request location updates");
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 60, 25, this);
        Log.d(myLog, "Network_Provider request location updates");
        //getLocation(location);
        return super.onStartCommand(intent, flags, startId);
    }
 
    @Override
    public void onLocationChanged(Location location) {
        getLocation(location);
    }
 
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
 
    }
 
    @Override
    public void onProviderEnabled(String provider) {
        getLocation(locationManager.getLastKnownLocation(provider));
    }
 
    @Override
    public void onProviderDisabled(String provider) {
        checkEnabled();
    }
 
    public void getLocation(final Location location) {
        new Thread(new Runnable() {
            public void run() {
                if (location == null)
                    return;
                if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                    Log.d(myLog, "GPS Provider Enabled");
                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                    myPosition = new LatLng(latitude,longitude);
                    addCoordinates();
                    Log.d(myLog, "---GPS Координаты добавлены---");
                } else if (location.getProvider().equals(LocationManager.NETWORK_PROVIDER)) {
                    Log.d(myLog, "NETWORK PROVIDER Enabled");
                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                    myPosition = new LatLng(latitude,longitude);
                    addCoordinates();
                    Log.d(myLog, "---Network Координаты добавлены---");
                }
            }
        }).start();
    }
 
    public void addCoordinates() {
        addTimeCalendar = Calendar.getInstance();
        SimpleDateFormat addDayFormat = new SimpleDateFormat("yyyy-MM-dd");
        addDate = addDayFormat.format(addTimeCalendar.getTime());
        SQL sqlHelper = new SQL(this);
        SQLiteDatabase db = sqlHelper.getWritableDatabase();
        ContentValues cv = new ContentValues();
        Log.d(myLog, "--- Insert in coordinates: ---");
        cv.put("Latitude", latitude);
        cv.put("Longitude", longitude);
        cv.put("Time", addDate);
        long rowID = db.insert("coordinates", null, cv);
        Log.d(myLog, "row inserted, ID = " + rowID);
        db.close();
        sqlHelper.close();
    }
 
    public void onDestroy() {
        super.onDestroy();
        Log.d(myLog, "onDestroy");
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
 
}
Собственно вопрос:
1. Как передать myPostition, т.е. latitude и longitude, из метода getLocation сервиса в MainActivity, чтобы потом их можно было поместить на карту в виде маркера?
2. Правильно ли я сделал, что поместил запрос на обновление локации(местоположения) в onStartCommand? Или это нужно было сделать в onCreate() сервиса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2015, 21:00
Ответы с готовыми решениями:

Как запустить метод из Service?
При запуске сервиса в onCreate запускается метод, когда он отрабатывает...

Как передать intent данные в Service?
Здравствуйте! как передать intent данные в класс с расширением Service?...

Как получить context MainActivity в Service?
В MainActivity создаю сервис и startService( SER );, как получить context...

Как отследить принудительную остановку service системой?
Как отследить остановку service когда Android его останавливает из- за нехватки...

Как запустить service при входящем вызове?
Есть ли такая возможность разбудить мой сервис при входящем вызове типа...

20
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
28.05.2015, 21:21 21
Типо того, вроде будильника, задаешь время старта и период.
0
28.05.2015, 21:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2015, 21:21

Как сохранить состояние Service после перезагрузки телефона?
Как сохранить состояние Service после перезагрузки телефона??? т.е мне нужно...

Как защитится от повторного запуска Service (защита от дурака)?
На вся кий случай хочу проставить защиту. Работает одновременно 4 сервиса и...

Как сделать так, чтобы Service работал после закрытия программы
Здравствуйте! Никак не могу разобраться, как сделать так, чтобы Service...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru