我有一个Android后台服务,可以不时报告位置。当我通过wifi进行本地测试时,它工作得很好,但是当测试3G连接时(有时在Edge上),我发现应用程序显然已进入瓶颈并且不执行 onLocationChanged 方法。那没关系,因为可能会丢失信号等等。但是过了一段时间(可能是重新建立连接时),它会立即开始更新所有请求,在几秒钟内执行 onLocationChanged 方法很多次。
有没有人有想法如何解决?是否可以在方法 locationManager.requestLocationUpdates 中添加超时?
我的听众
public class MyListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
//report location to server
HttlCallToUpdatePostion(loc.Latitude, loc.Longitude, loc.Accuracy);
}
}
我的服务
Handler handler = null;
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
MyListener listener = new MyListener();
protected void doWork() {
Looper.prepare();
handler = new Handler();
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, listener);
Looper.loop();
}
答案 0 :(得分:1)
我写了一个应用程序,正是你需要的。 当它只是一项服务时,我遇到了同样的问题。当UI进入后台并关闭屏幕时,服务转到后台并调度系统调用,一旦触发缓冲区被刷新,我就有10-50次更新。
解决方案是:必须设置警报并使用5000值进行调度,并且BroadcastRreceiver将接收并且它将正确处理。比你会遇到其他问题,这里没有问。
对我而言,这是一个解决方案,该应用程序正在使用中!
编辑: 报警设置代码部分:
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
// In reality, you would want to have a static variable for the request
// code instead of 192837
PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Get the AlarmManager service
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
// am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
am.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), timerInterval, sender);
AndroidManifest.xml:
<receiver android:process=":remote" android:name=".broadcastreceiver.AlarmReceiver"/>
类实现部分:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Context appContext = context.getApplicationContext();
...
答案 1 :(得分:0)
在adorid系统设置中检查省电模式:必须禁用它以允许位置管理器在屏幕关闭时生成更新位置