我正在使用 WorkManager 库来安排后台任务,并为了防止应用程序休眠,从应用程序中打开电池优化部分,以便用户手动禁用我的应用程序的优化。问题是,即使选择了“不优化”选项,应用程序仍然处于休眠状态并且工作尚未完成。此外,当通过设备设置中的应用程序信息页面打开电池设置时,它会显示“已优化”,即使它在上一个活动中已更改为“不优化”。
此外,通过代码打开的电池优化页面包含包括系统应用程序在内的所有应用程序的列表,而通过应用程序信息打开的电池优化页面仅包含已安装应用程序的列表。
有没有办法通过代码进入第二个电池优化页面。因为如果禁用优化,应用程序就可以正常工作。
Intent intent = new Intent();
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud) android android-doze-and-standby android-doze android-workmanager
当我的应用程序启动时,我使用WorkManager创建了一个定期工作请求,以从服务器获取数据并且其工作正常。我的问题是,我想在我的应用程序关闭时取消工作请求。
当我的应用程序关闭时如何取消工作请求或如何检测应用程序正在关闭?
我将不胜感激任何建议。
android background-service android-asynctask android-background android-workmanager
我正在寻找一种将数据上传到 Firebase 的解决方案,而无需用户等待数据上传,以便用户可以在离线模式下使用该应用程序。
我们假设该应用程序是关于地点的。在此应用程序中,用户可以上传图像和包含地址、城市、州、国家、纬度、经度、描述等的对象。假设是一个大 POJO。
Firebase 实时数据库和 Firebase Firestore 可以等待(我不知道多久)稳定的互联网连接来发送数据。但Firebase Storage没有这个功能。
所以我找到了WorkManager。它似乎解决了问题,但我必须将 POJO 序列化为小的原始变量类型才能将 POJO 发送到Worker类。
我想要达到的结果是:
1)将图像上传到Firebase存储
2) 图片的下载地址
3) 将 POJO 发送到 Firebase Firestore,其中包含 ImageUrl。
问题
1)WorkManager最适合这种目的吗?
2) 在离线模式下,用户可以触发此后台作业多少次而不会对应用程序造成任何问题?
3)如何正确地将POJO发送到班级Worker?
这是我到目前为止所做的:
获取新地点的 PushKey,启动后台作业并继续浏览活动:
savePlaceData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DocumentReference docRef = DatabaseRouter.getPlaceCollectionRef().document();
String key = docRef.getId();
uploadPlaceDataInBackground(key)
Intent intent = new Intent(PlaceActivity.this, OtherActivity.class);
startActivity(intent);
}
});
Run Code Online (Sandbox Code Playgroud)
设置后台作业的请求:
private void uploadPlaceDataInBackground(String placeKey) {
// TESTING …Run Code Online (Sandbox Code Playgroud) android firebase-storage google-cloud-firestore android-workmanager
我当前的 Android 应用程序采用
archWorkerRuntimeVersion = '2.3.0-beta02'
api "androidx.work:work-runtime:$archWorkerRuntimeVersion"
api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion"
Run Code Online (Sandbox Code Playgroud)
处理后台工作。
当工作人员运行时,我会显示一个工具栏进度旋转器,向用户发出该应用程序“忙”的信号。
我的应用程序由多个活动组成,我使用 Android JetPack ViewModels 来管理 Worker。
我开始工作如下:-
val myWorkRequest: OneTimeWorkRequest =
OneTimeWorkRequest.Builder(MyWorker::class.java)
.addTag(WORK_IN_PROGRESS_TAG + "${UUID.randomUUID()}").build()
WorkManager.getInstance(applicationContext)
.beginUniqueWork(
UNIQUE_WORK_NAME,
ExistingWorkPolicy.KEEP,
myWorkRequest
)
.enqueue()
Run Code Online (Sandbox Code Playgroud)
我有一个观察者定义如下:-
private val observer = Observer<WorkInfo> { workInfo ->
when(workInfo.state) {
WorkInfo.State.RUNNING -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
WorkInfo.State.ENQUEUED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
WorkInfo.State.SUCCEEDED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
WorkInfo.State.FAILED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
WorkInfo.State.BLOCKED …Run Code Online (Sandbox Code Playgroud) 我正在尝试在后台播放音乐,之前我使用服务来实现此目标,但现在我想知道,我可以使用工作管理器而不是服务来播放音乐吗?谁能给我一个指南吗?
这是用例:用户设置具有特定时间的每日通知。在指定时间,发出网络请求以获取一些数据,然后使用检索到的数据显示通知。我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例。
据我了解,AlarmManager 最适合在精确的时间进行调度。但如果没有网络,作业就会失败,我更喜欢推迟作业以尊重网络限制,而不是执行失败。对于这种类型的受限工作,在保证最终执行的情况下,WorkManager 看起来是最好的解决方案,使用具有初始延迟的 OneTimeWorkRequest 以便在正确的时间执行。
使用的组件:WorkManager
使用版本:2.3.4
设备/Android 版本转载于:任何
你好 - 我想从workmanager队列中删除一个工作线程,即使它已经完成或正在运行。我知道当 Worker 处于 RUNNING 状态时我可以取消它,问题是当它完成并失败时我想删除它。Workmanager.pruneWork()删除 WorkManager 中的所有工作人员,但我希望只删除特定的工作人员。
这是我的场景:
results.failure()Failed状态的工人。任何帮助都感激不尽。谢谢。
我一直在检查其他链接(stackoverflow)以减少工作管理器的时间段,但我发现了以下链接
如何减少WorkManager中PeriodicWorkManager的时间
上面的链接说最短时间是 15 分钟。
需要立即从移动设备向服务器发送数据。有没有其他方法可以缩短时间?
请帮我解决这个问题。提前致谢。
我有一个每 15 分钟运行一次的定期任务。
当混淆应用程序时。如果应用程序从后台被终止,工作管理器将不起作用。
测试设备:一加7T、诺基亚5+、Google Pixel 2模拟器
仅当应用程序位于前台或后台时,工作管理器才会执行。
禁用 proguard 工作管理器在所有 3 种情况下都有效
该应用程序位于前台
该应用程序在后台运行
该应用程序从后台被杀死
根据我在https://issuetracker.google.com/issues/160492142#上提出的问题
proguard 文件中可能存在问题。
#noinspection ShrinkerUnresolvedReference
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
# prevent Crashlytics obfuscation
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
-keep public class * extends java.lang.Exception
-keep class com.google.android.gms.measurement.AppMeasurement { *; }
###################################################################################################
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retrofit does reflection …Run Code Online (Sandbox Code Playgroud) 我的 App 类实现了 Configuration.Provider.getWorkManagerConfiguration,关于本文:https ://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#on-demand
我在 AndroidManifest.xml 中使用此字符串切换了默认初始化程序:
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)
该代码按照我的需要工作 - 没有默认的初始化程序调用,但只有 Configuration.Provider.getWorkManagerConfiguration。
如果我运行 lint 检查,我仍然会看到错误:使用按需初始化时删除 androidx.work.impl.WorkManagerInitializer。
关于如何处理它有什么想法吗?