1

我有一个不时报告位置的 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();
}
4

2 回答 2

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();
        ...
于 2013-08-28T16:28:43.820 回答
0

检查 adorid 系统设置中的省电模式:必须禁用它才能允许位置管理器在屏幕关闭时生成更新位置

于 2017-08-27T19:03:40.603 回答