在我的应用程序中,我运行的服务工作正常,但问题是 当我打开任何应用程序,如什么应用程序,脸书等。再次我的服务刚刚开始如何克服这个问题
这是我的代码伙伴:
public class GpsTracker extends Service implements LocationListener {
Intent intent1;
LocationManager locationManager;
public double latitude, longitude;
String Lat,Log,stringFromFragment,add,time;
Geocoder geocoder;
DBHelper dbh;
StringBuilder strReturnedAddress;
StausEventDao stausEventDao;
Context context;
int minutes=15*60000;
@Override
public void onCreate()
{
super.onCreate();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
intent1 = new Intent("com.ds.service");
Toast.makeText(this, "Starting Tracker", Toast.LENGTH_SHORT).show();
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 900000, 1, this);
} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 900000, 1, this);
} else {
Toast.makeText(this, "Enable gps to get location", Toast.LENGTH_SHORT).show();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
if(intent !=null) {
stringFromFragment = intent.getStringExtra("STATUS");
}
return START_STICKY;
}
@Override
public void onLocationChanged(Location location) {
/* if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1, this);
} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 1, this);
} else {
Toast.makeText(this, "Enable gps to get location", Toast.LENGTH_SHORT).show();
}*/
latitude = location.getLatitude();
longitude = location.getLongitude();
context=getApplicationContext();
Lat = String.valueOf(latitude);
Log = String.valueOf(longitude);
geocoder = new Geocoder(this, Locale.ENGLISH);
try {
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses != null) {
Address returnedAddress = addresses.get(0);
strReturnedAddress = new StringBuilder("");
strReturnedAddress.append(returnedAddress.getAddressLine(1)).append("\n");
add = strReturnedAddress.toString();
}
} catch (IOException e)
{
e.printStackTrace();
Toast.makeText(getApplicationContext()," Cannot get Address! ", Toast.LENGTH_LONG).show();
}
dbh = new DBHelper(getApplicationContext());
dbh.getReadableDatabase();
stausEventDao=new StatusEventImpDao(context);
stausEventDao.saveStatusEventChange(latitude,longitude,add,time,stringFromFragment);
String values=stausEventDao.getValues(latitude,longitude,add,time,stringFromFragment);
Toast.makeText(getApplicationContext(),values,Toast.LENGTH_LONG).show();
intent1.putExtra("LATITUDE", latitude);
intent1.putExtra("LONGITUDE", longitude);
intent1.putExtra("ADDRESS", add);
sendBroadcast(intent1);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public class TrackerBinder extends Binder {
public GpsTracker getService() {
return GpsTracker.this;
}
}
}
答案 0 :(得分:1)
如果启动另一个应用程序导致您的服务“重新启动”,那么它可能是一个内存/资源问题...换句话说,那些其他应用程序消耗资源到您的服务被杀死的程度,然后在这些应用程序启动后重新启动已完成或允许您继续。
您基本上有两个选择:
减少您的应用在运行时消耗的资源,以防止这种情况发生(这非常困难,因设备而异)。但是,这种方法可确保您的服务持续运行。但它要求您减少或改变数据收集/处理的实质内容。
保留您需要经常保留或保留的数据,并在重新启动之前跟踪服务“停机”的时间,以便您可以收集尽可能多的数据。您还可以尝试测量导致重新启动的资源,内存消耗等,但这样做可能会更快地关闭您的服务。这仍然可能有助于开发最佳操作服务的参数。
其他应用无法阻止你的。您必须在系统的约束下工作。一旦你意识到这一点,你将重新定义你对“问题”的处理方法。这些其他应用程序可能会占用大量资源,尤其是在较旧的设备上,但无论您遇到的是什么问题。
答案 1 :(得分:0)
通常onStartCommand负责重启服务,请尝试返回START_NOT_STICKY,以防止服务重启。
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
if(intent !=null) {
stringFromFragment = intent.getStringExtra("STATUS");
}
return START_NOT_STICKY;
}