LocationListener 在 android 服务中的某个时间后不提供更新

Posted

技术标签:

【中文标题】LocationListener 在 android 服务中的某个时间后不提供更新【英文标题】:LocationListener doesn't provide update after sometime in android service 【发布时间】:2017-07-31 00:47:25 【问题描述】:

我正在编写一个应用程序,我需要从后台快速获取位置更新。 因此,我编写了一个服务来实现所需的结果。

我从活动的 onCreate() 方法启动服务。

我面临的问题是,该服务能够在服务激活后大约 20 到 30 秒内提供位置更新。然后我没有收到任何更新。

这是服务的代码:

public class MyLocService extends Service
        implements
        LocationListener

  private final LocationListener locationListener = this;

@Override
    public int onStartCommand(Intent intent, int flags, int startId) 

        Handler handler = new Handler(Looper.getMainLooper());
        Runnable runnable = new Runnable() 
            @Override
            public void run() 
                if (checkPermission()) 
                    manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

                    manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
                    manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
                
                else
                    //Request Permission
                    Intent permissionIntent = new Intent();
                    permissionIntent.setAction(LOCATION_PERMISSION_REQUIRED);
                    sendBroadcast(permissionIntent);
                
                Looper.loop();
            
        ;

        handler.post(runnable);

        //Create notification nad run in foreground
        startForeground(
                NotificationCreator.getNotificationId(),
                NotificationCreator.getNotification(context)
        );

        return Service.START_STICKY;



@Override
public void onLocationChanged(Location location) 
     Log.d("LocUpdate",  location.getLatitude() + " : " + location.getLongitude());

每次我从以下活动启动服务时:

Intent intent = new Intent(this, MyLocService.class);
startService(intent);

我在 onLocationChange() 中获得更新 20 到 30 秒。

另一个观察结果是:如果我保持活动(从我启动服务的位置打开且可见),那么我将继续获取位置更新。 但是,当我关闭活动或终止应用程序并允许服务(单独)在后台运行时,尽管服务正在运行,但我没有收到任何位置更新,因为我可以在屏幕顶部看到通知。

我做错了什么?

【问题讨论】:

你能看到正在运行的应用列表上运行的服务吗?您的手机是否允许运行该服务?某些手机​​ rom 不允许默认 START_STICKY 重启服务,如果它被杀死 是的。我可以看到服务正在运行。我正在用棉花糖在 Redmi Note 4 上进行测试。出路是什么? 我的 redmi note 3 有问题,因为 MIUI 默认情况下不会让服务在被终止时重新启动。试试这个,转到设置>权限>自动启动>并允许您的应用程序自动启动 也许只是一个小提示。为了提高电池性能并保持良好的精度,您可以尝试使用FusedLocationApi。还可以尝试在更新之间插入一些最短时间 我的应用程序启用了自动启动。我使用了融合位置,但结果是一样的。位置监听器停止提供位置更新。 【参考方案1】:

我已经解决了这个问题。在miui中关闭电池优化或将应用添加为例外。代码完美运行。

【讨论】:

以上是关于LocationListener 在 android 服务中的某个时间后不提供更新的主要内容,如果未能解决你的问题,请参考以下文章

LocationListener 没有提供任何速度更新

在 AndEngine 游戏引擎旁边使用 LocationListener

为啥我的 LocationListener 变为空?

为啥LocationListener会在一段时间后禁用?

了解 Service、LocationListener 和 BroadcastReceiver 如何在后台获取位置

LocationListener 适用于模拟器,而不是手机