我正在开发一个基本上是位置跟踪软件的应用程序。启动时,它会保存位置并将其发送到服务器。
该代码已经运行了5年,没有任何修改,没有任何错误。
它通过简单的前台服务实现。
最近几个月,我收到用户报告的关于该服务的错误,该错误在华为设备上随机停止。首先,我认为这是较新的android上罕见的/新的崩溃,但是Fabric中根本没有错误日志。
我在新的华为设备上进行了尝试,令我惊讶的是,这种现象确实存在。几分钟后,具有EMUI的华为设备确实终止了前台服务。
这对我的应用程序真的很不好,首先,用户希望长时间运行此跟踪应用程序,其次,最近几个月,华为已成为Android用户中的热门选择。大概有10%的用户拥有华为设备。
我知道https://dontkillmyapp.com/这是一个获取有关此问题信息的好网站。
我尝试过他们的解决方案,该解决方案基本上是在我的服务中添加带有特定标签的唤醒锁,因此华为的EMUI不会杀死它。
我已经按照以下方式尝试过此方法,但几分钟后我的华为测试设备仍然无法使用我的前台服务。
服务中的代码:
我基本上在服务的onCreate回调中获取了唤醒锁。
private void acquireLock() { if (wakeLock == null) { PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE); if (mgr != null) { if (Build.MANUFACTURER.toLowerCase().equals("huawei")) { lockTag = "LocationManagerService"; } wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, lockTag); Log.i("MY_TAG", "tag:" + lockTag); } } if (wakeLock != null && !wakeLock.isHeld()) { wakeLock.acquire(); //also tried with: wakeLock.acquire(1000*60*60*72); 3 days wakelock just in case. Log.i("MY_TAG", "wakeLock acquired!"); } } @Override public void onCreate() { acquireLock(); }
编辑:
澄清:我的服务是前台服务,带有持久通知。它可以在其他设备上正常运行DAYS。
如果可以的话请帮忙,
亚当