我已经实现了一个启动时启动的 android 服务:
MyService.java
package com.example.testservicelogging;
import com.example.testservicelogging.MyBroadcastReceiver;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service implements LocationListener {
LocationManager lm;
PendingIntent pendingIntent;
LocationListener locationListener;
public MyService() {
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
//Toast.makeText(getBaseContext(), "Got in!!!", Toast.LENGTH_SHORT).show();
System.out.println("Got in");
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
//---use the LocationManager class to obtain locations data---
lm = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Intent i = new Intent(this, MyBroadcastReceiver.class);
pendingIntent = PendingIntent.getBroadcast(
this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
//---request for location updates using GPS---
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
6000,
5,
pendingIntent);
return START_STICKY;
}
@Override
public void onDestroy() {
//---remove the pending intent---
lm.removeUpdates(pendingIntent);
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onLocationChanged", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onProviderDisabled", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onProviderEnabled", Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
Toast.makeText(this, "onStatusChanged", Toast.LENGTH_LONG).show();
}
}
也是一个BroadcastReceiver
类:
package com.example.testservicelogging;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent t=new Intent(context, MyService.class);
t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(t);
String locationKey = LocationManager.KEY_LOCATION_CHANGED;
String providerEnabledKey = LocationManager.KEY_PROVIDER_ENABLED;
//Toast.makeText(context, "INSIDE!!!", Toast.LENGTH_SHORT).show();
System.out.println("INSIDE");
if (intent.hasExtra(providerEnabledKey)) {
if (!intent.getBooleanExtra(providerEnabledKey, true)) {
Toast.makeText(context,
"Provider disabled",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"Provider enabled",
Toast.LENGTH_SHORT).show();
}
}
if (intent.hasExtra(locationKey)) {
Location loc = (Location)intent.getExtras().get(locationKey);
Toast.makeText(context,
"Location changed : Lat: " + loc.getLatitude() +
" Lng: " + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
//do something with the coordinates returned
}
}
}
我面临一些问题:
- (也是最重要的):启动时加载服务,但即使我看到 GPS 图标闪烁,它也永远不会返回坐标!!!我做错了什么??
- 我想以预定义的时间间隔获取坐标(例如,每天从 08:00 到 18:00 每 15 分钟一次)。我该如何实施?
- 即使我提高了 100000 毫秒和 500 距离来激活 requestLocationUpdates,即使我保持不动,它有时也会每 2-5 秒运行一次!!!我该如何克服呢?
非常感谢你的帮助 !!!