Я сделал это в своем приложении, чтобы сделать то же самое, что вы просили.
В моем сервисе я добавил это:
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
addLocationListener();
}
private void addLocationListener()
{
triggerService = new Thread(new Runnable(){
public void run(){
try{
Looper.prepare();//Initialise the current thread as a looper.
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_COARSE);
final String PROVIDER = lm.getBestProvider(c, true);
MyLocationListener myLocationListener = new MyLocationListener();
lm.requestLocationUpdates(PROVIDER, 600000, 0, myLocationListener);
Log.d("LOC_SERVICE", "Service RUNNING!");
Looper.loop();
}catch(Exception ex){
ex.printStackTrace();
}
}
}, "LocationThread");
triggerService.start();
}
public static void updateLocation(Location location)
{
Context appCtx = MyApplication.getAppContext();
double latitude, longitude;
latitude = location.getLatitude();
longitude = location.getLongitude();
Intent filterRes = new Intent();
filterRes.setAction("xxx.yyy.intent.action.LOCATION");
filterRes.putExtra("latitude", latitude);
filterRes.putExtra("longitude", longitude);
appCtx.sendBroadcast(filterRes);
}
class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location location)
{
updateLocation(location);
}
}
ПРИМЕЧАНИЕ: Обратите внимание, что я использую MyApplication.getAppContext (); , потому что я использую свой собственный класс Application для добавления контекста.
И тогда у меня есть BroadcastReceiver с этим:
public class LocationReceiver extends BroadcastReceiver {
double latitude, longitude;
@Override
public void onReceive(final Context context, final Intent calledIntent)
{
Log.d("LOC_RECEIVER", "Location RECEIVED!");
latitude = calledIntent.getDoubleExtra("latitude", -1);
longitude = calledIntent.getDoubleExtra("longitude", -1);
updateRemote(latitude, longitude);
}
private void updateRemote(final double latitude, final double longitude )
{
//HERE YOU CAN PUT YOUR ASYNCTASK TO UPDATE THE LOCATION ON YOUR SERVER
}
}
Класс приложения:
public class MyApplication extends Application {
private static Context context;
/* (non-Javadoc)
* @see android.app.Application#onCreate()
*/
@Override
public void onCreate() {
MyApplication.context=getApplicationContext();
}
public static Context getAppContext() {
return MyApplication.context;
}
}
Также в вашем манифесте вам нужно добавить оба:
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name=".MyApplication" >
//YOUR ACTIVITIES HERE...
<service
android:enabled="true"
android:name=".LocationService" >
</service>
<receiver
android:enabled="true"
android:name=".LocationReceiver" >
<intent-filter >
<action android:name="xxx.yyy.intent.action.LOCATION" />
</intent-filter>
</receiver>
</application>
Метод определения, работает ли служба, я делаю это в своей первой операции:
/**
* Check location service.
*/
private void checkLocationService()
{
Log.d("CHECK_SERVICE", "Service running: " + (settings.getBoolean("locationService", false)?"YES":"NO"));
if(settings.getBoolean("locationService", false))
return;
Intent mServiceIntent = new Intent(this, LocationService.class);
startService(mServiceIntent);
}
Очевидно, что вам нужно управлять SharedPreferences ( settings ), чтобы установить для переменной locationService значение true / false , если служба запущена (onStart) или нет (onDestroy).