当设备重新启动并强制关闭应用程序时,Redmi 和其他自定义中文 ROM 中未收到 WorkManager doWork 回调
Posted
技术标签:
【中文标题】当设备重新启动并强制关闭应用程序时,Redmi 和其他自定义中文 ROM 中未收到 WorkManager doWork 回调【英文标题】:WorkManager doWork callback is not received in Redmi and other custom Chinese ROM when device got rebooted and force closed the app 【发布时间】:2019-01-10 08:14:40 【问题描述】:当应用程序在后台运行或被刷卡时,我的应用程序没有在 Redmi 手机中收到推送通知。
所以我正在尝试通过 WorkManager 唤醒手机,它适用于除 Redmi 和其他中国定制 ROM 手机之外的许多手机。
这是我的 Worker 类代码
public class OpenTalkWorkManager extends Worker
@NonNull
@Override
public Result doWork()
Log.i("wake_up", "Waking up now: " + System.currentTimeMillis());
FirebaseUtils.getInstance().updateUserPresenceStatus(getApplicationContext(), "yes");
Intent intent = new Intent("com.opentalk.WAKE_UP");
getApplicationContext().sendBroadcast(intent);
return Result.SUCCESS;
我正在尝试通过 PeriodicWorkRequest 将工作排入队列
PeriodicWorkRequest.Builder mPeriodicWorkRequest = new PeriodicWorkRequest.Builder(OpenTalkWorkManager.class, 4, TimeUnit.MINUTES);
Constraints myConstraints = new Constraints.Builder()
.setRequiresBatteryNotLow(false)
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)
.setRequiresCharging(false)
.setRequiresDeviceIdle(false)
.setRequiresStorageNotLow(false)
// Many other constraints are available, see the
// Constraints.Builder reference
.build();
PeriodicWorkRequest myWork = mPeriodicWorkRequest.setConstraints(myConstraints).build();
UUID compressionWorkId = myWork.getId();
WorkManager.getInstance().cancelWorkById(compressionWorkId);
WorkManager.getInstance().enqueue(myWork);
【问题讨论】:
【参考方案1】:也请看this 小米、vivo、OPPO、华为默认限制后台服务。 应用此解决方案后,我的 WorkManager 也开始工作了。
【讨论】:
【参考方案2】:WorkManager API 可以正常工作,如 android Stock OS 设备或模拟器中所述。小米、vivo 等定制的 ROM 默认将 Battery Saver 选项设置为“优化”,并且按预期不允许 WorkManager API。将省电模式设置为“无限制”,您的 WorkManager 将运行该任务。
我使用的是 1.0.1 版本,在对省电模式执行上述更改后,它可以很好地与小米设备配合使用。
【讨论】:
【参考方案3】:<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
在您的清单文件中添加这些权限可能会起作用。
【讨论】:
有人试过吗?【参考方案4】:您使用的是哪个版本的WorkManager
?我们修复了一些与PeriodicWork
和alpha05
中的应用程序强制停止有关的错误。 alpha06
已失效,我建议您尝试使用它。如果您仍然遇到同样的问题,请在问题跟踪器上报告问题跟踪器,并在问题跟踪器上提供可重现的测试用例。
【讨论】:
拉胡尔,感谢您的回答。我目前正在使用 alpha05。我将使用 alpha06 进行尝试,而不是让您知道报告。 我尝试使用 alpha06 并测试它是否在 Redme 中重新启动后实际启动,如果在其中启用了自动启动,如果未启用自动启动而不是接收到 doWork 回调。此外,当它在重新启动后启动时,比在 doWork 互联网通话中在后台不成功。请让我知道我是否可以将 alpha06 用于我的产品应用程序。这个 api 的稳定版本暂定日期是什么时候? @Rahul 如果自动启动关闭(默认情况下自动启动关闭),为什么 WorkManager 不能在 xiomi 设备中工作,我也在所有新设备(如 vivo、oppo、oneplus 等)中使用 alpha08 他们限制背景服务,那么使用 Jobscheduler 或 WorkManager 有什么意义。市场上的大多数用户都是我上面提到的设备,所以你能告诉我如何做到这一点,我们需要谷歌的明确解决方案,因为这是一个严重的问题 @SamwinishereHere 您找到解决方案了吗?我也在努力解决同样的问题,我找到了一些非常老套的方法来做到这一点,但我正在寻找一些好的做法。 我正在使用androidx.work:work-runtime:2.1.0
,但仍然没有执行(小米),只有当我打开应用程序时它才开始执行,在模拟器上工作正常以上是关于当设备重新启动并强制关闭应用程序时,Redmi 和其他自定义中文 ROM 中未收到 WorkManager doWork 回调的主要内容,如果未能解决你的问题,请参考以下文章
活动生命周期。当应用程序已经打开(折叠)正在关闭并在图标单击时重新启动?