2015-07-02 3 views
0

Как говорится в заголовке, мне нужно запустить приложение на моем устройстве Android, пока мое устройство заблокировано или спал. Моя проблема в том, что я регистрирую GPS-координаты, и приложение останавливается, когда оно переходит в спящий режим. Я попытался создать службу, но я действительно не понимаю, как это работает. Я проверил почти каждую статью, которую я нашел в Google или на этом форуме, но код, который я нашел, всегда был неполным. Я не хочу копировать & вставить все, что я хочу понять. Поэтому полный учебник о том, как запустить locationmanager в качестве службы для получения текущего местоположения, будет отличным :).Храните Android-приложение во время блокировки устройства

Greetz

[EDIT]:

Хорошо я посмотрел в FusedLocationProvider и это то, что я сделал из него:

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; 
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

import android.app.Service; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class GPSService extends Service implements LocationListener, ConnectionCallbacks, OnConnectionFailedListener, com.google.android.gms.location.LocationListener { 

private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 
private boolean requestingLocationUpdate=true; 

private double latitude; 
private double longitude; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
    } 
@Override 
public void onCreate() 
{ 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d("GPSService", "onCreate"); 

    mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build(); 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(10000); 
    mLocationRequest.setFastestInterval(5000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
} 

@Override 
public void onDestroy() 
{ 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d("GPSService", "onDestroy"); 
    mGoogleApiClient.disconnect(); 
} 

@Override 
public void onStart(Intent intent, int startid) 
{ 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d("GPSService", "onStart"); 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onLocationChanged(Location loc) { 
    updateContent(loc); 
} 

private void updateContent(Location loc) 
{ 
    Toast.makeText(this, "Location changed", Toast.LENGTH_SHORT).show(); 
    latitude = loc.getLatitude(); 
    longitude = loc.getLongitude(); 
} 


@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void onConnectionFailed(ConnectionResult arg0) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void onConnected(Bundle arg0) { 
    if(requestingLocationUpdate) 
    { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,this); 
     Toast.makeText(this, "Started the location update", Toast.LENGTH_LONG).show(); 
    } 
} 
@Override 
public void onConnectionSuspended(int arg0) { 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this); 
} 


} 

Это прекрасно работает, и я получаю тост когда мое приложение работает в фоновом режиме, и местоположение меняется. Мои последующие шаги состоят в том, чтобы отправить координаты обратно в мою MainActivity. Это где появляется BroadcastReceiver?

Greetz

ответ

0

Ну, во-первых, попробуйте обратиться в API FusedLocationProvider. Это основано на новом GoogleApiClient и предлагаемых в нем услугах.

Что касается учебников, я дам вам небольшой небольшой фрагмент.

Основная концепция заключается в том, что вы регистрируете BroadcastReceiver в своем приложении, которое «прослушивает» определенные службы. Что касается кода, который вам нужен, вам лучше всего поработать, просмотрев его в документах или в многочисленных примерах, которые может предложить сайт разработчиков.

С помощью приемника широковещательной передачи вы должны затем выдавать PendingIntents, используя одну из сигнатур методов, которые запрашивает requestLocationUpdates().

Есть другие сведения, но начните с этими идеями и проверить these документы

EDIT:

Если вы хотите, чтобы хранить много координат, используя промежуточную систему хранения как Sqlite базы данных будет быть хорошим местом для начала. Если вы хотите обновить представление, вам придется выполнить какой-то обратный вызов для своей деятельности.

+0

Я сохраняю GPS-координаты в специальном XML-файле, который мне нужен для более позднего (он должен быть xml, но вы правы Sqlite было бы намного лучше начать). Как только я получил координаты в моей MainActivity, я напишу их в xml-файл, и я хочу, чтобы я дал небольшую обратную связь с пользователем, чтобы показать ему, что устройство действительно что-то записывает. Так почему-то я должен «отправить» координаты обратно к нему. Вы упомянули обратный вызов. Можете ли вы объяснить, что именно вы имеете в виду, или дать мне дополнительную информацию, чтобы я мог начать собственное исследование об этом, пожалуйста? –

+0

Основная концепция заключается в том, что у вас есть интерфейс. Этот интерфейс затем реализуется всеми классами, которые необходимо обновить новыми полученными данными. Вы передаете ссылку на этот класс в свой класс GPSLogger. @OneSoft дополнительно, переместите свои методы GPS в строго модельный класс. Внедрение службы запускает основной поток, и если вы получаете много очков, вы немного замедляете себя. – andrewdleach

+0

Хорошо, я решил свою проблему с BroadcastReceiver. Спасибо за вашу помощь, сейчас он работает. –

Смежные вопросы