我正在尝试android WorkManager,代码抛出错误"运行时发现多个文件与OS独立路径'META-INF/proguard/androidx-annotations.pro ",我尝试了以下答案,它没有帮助.
的build.gradle(APP)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "rock.dmx.xaro.workmanagerexample"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
def work_version = "1.0.0-alpha09"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation "android.arch.work:work-runtime:$work_version"
}
Run Code Online (Sandbox Code Playgroud) 面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。我在将目标 SDK 更新到 31 后得到它。错误总是出现在 AlarmPingSender 之后。但我不知道任何使用 AlarmPingSender 的类。
2021-10-31 10:43:04.990 17031-17341/com.app.mobile D/AlarmPingSender: Register alarmreceiver to MqttServiceMqttService.pingSender.com.app.mobile-2e24ccbde048f2e91635651784
2021-10-31 10:43:04.993 17031-17341/com.app.mobile E/AndroidRuntime: FATAL EXCEPTION: MQTT Rec: com.app.mobile-2e24ccbde048f2e91635651784
Process: com.app.mobile, PID: 17031
java.lang.IllegalArgumentException: com.app.mobile: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it …
Run Code Online (Sandbox Code Playgroud) android kotlin android-pendingintent android-workmanager android-12
我正在尝试使用WorkManager 1.0.0-alpha09.我收到此错误:
Program type already present:
com.google.common.util.concurrent.ListenableFuture
Message{kind=ERROR, text=Program type already present:
com.google.common.util.concurrent.ListenableFuture, sources=[Unknown source
file], tool name=Optional.of(D8)}
Run Code Online (Sandbox Code Playgroud)
如果我使用版本1.0.0-alpha08或更少.我没有得到这个错误,但我需要公共构造函数
public Worker(Context context, WorkerParameters workerParams)
Run Code Online (Sandbox Code Playgroud) 以前我都是用一个前台的IntentService来处理纷至沓来的各种事件。然后当 Android 11 到来时(Android R,API 30)它就被弃用了,据说更喜欢使用使用setForegroundAsync 的Worker ,所以我就这么做了。
val builder = NotificationCompat.Builder(context,...)...
setForegroundAsync(ForegroundInfo(notificationId, builder.build()))
Run Code Online (Sandbox Code Playgroud)
随着 Android 12 的到来(Android S,API 31),仅在之后的一个版本,现在setForegroundAsync
被标记为已弃用,并且我被告知要使用setExpedited来代替:
* @deprecated Use {@link WorkRequest.Builder#setExpedited(OutOfQuotaPolicy)} and
* {@link ListenableWorker#getForegroundInfoAsync()} instead.
Run Code Online (Sandbox Code Playgroud)
问题是,我不确定它到底是如何工作的。之前,我们有一个通知,当用户使用前台服务时应该向用户显示该通知(至少对于“旧”Android 版本)。现在看来getForegroundInfoAsync用于它,但我认为它不会用于 Android 12 :
在 Android S 之前,WorkManager 代表您管理和运行前台服务来执行 WorkRequest,显示 ForegroundInfo 中提供的通知。要随后更新此通知,应用程序可以使用NotificationManager。
从 Android S 及更高版本开始,WorkManager 使用即时作业来管理此 WorkRequest。
关于它的另一个线索是(这里):
从 WorkManager 2.7.0 开始,您的应用程序可以调用 setExpedited() 来声明 Worker 应使用加急作业。这个新 API 在 Android 12 上运行时使用加急作业,并且该 API 使用以前版本的 Android …
WorkManager是一个用于排队工作的库,保证在满足约束条件后执行.
因此,在通过Constraints类之后,我没有找到任何函数来为工作添加时间约束.例如,我想在上午8:00开始工作(工作可以是OneTimeWorkRequest或PeriodicWorkRequest中的任何一种).如何使用WorkManager添加约束来安排此工作.
我在 Play 商店里有一个 Android 应用程序已经有 8 年了。最近Google发布Android S或12引入了一些前台服务启动限制
和 确切的警报权限
https://developer.android.com/about/versions/12/behavior-changes-12#exact-alarm-permission
在应用程序中,我使用前台服务和闹钟来安排来自云和设备传感器的天气数据更新,并向用户发送通知,更新小部件。但他们说:确切的警报应该只用于面向用户的功能,所以如果我继续使用这些 API,它是安全的(根据 Google Play 政策)?
我问这个问题是因为其他解决方案(例如带有前台服务和工作管理器的粘性通知)无法满足我的要求。
android scheduler alarmmanager android-alarms android-workmanager
谷歌最近宣布了新的WorkManager架构组件.通过WorkManager
在doWork()
课堂上实现,可以很容易地安排同步工作,但是如果我想在后台进行一些异步工作呢?例如,我想使用Retrofit进行网络服务调用.我知道我可以发出同步网络请求,但它会阻塞线程并且感觉不对.有没有解决方案,或者目前还不支持?
如果我们已经有一个JobScheduler以及一些具有相同功能的漂亮的后端(AndroidJob和FirebaseJobDispatcher),为什么我们需要新的Android WorkManager?它有任何杀戮功能吗?因为我没有看到任何让我想要迁移到另一个调度程序的东西.
我想安排每晚数据库更新.所以我使用新的Android WorkManager.我的理解是,一旦安排它将始终独立于应用程序的生命周期在后台运行.是对的吗?我的第一次测试显示Work只在应用程序运行时执行.
val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
.addTag("DATABASE_UPDATE_SERVICE")
.build()
WorkManager.getInstance().enqueue(locationWork)
Run Code Online (Sandbox Code Playgroud) 我正在开发一个SDK,需要从后台启动Foreground服务。因为它使用的是后台定位和蓝牙相关的作品。如果应用程序被终止,监控将在后台执行。这就是我使用前台服务的原因。有一个条件是从后台启动前台服务。
目前,我的 SDK 使用Service来处理这项工作。但Android 12上不支持从后台启动服务。
我试图从后台启动服务,下面的异常抛出。
ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
Run Code Online (Sandbox Code Playgroud)
我如何使用WorkManager 来解决这个问题,我的所有处理都是由 Service 类完成的,如何将 Service 对象传递给Worker类并在 Worker 类中启动此作业。
实际上,我的项目是基于信标技术的。信标信号用于向用户显示不同的推荐。
在我当前的实现中,如果应用程序被用户杀死,并且还接受前台服务,则SDK将在后台运行。并检测信标并提供适当的操作。
我的实现是,如果应用程序使用前台服务“关闭”来初始化我的 SDK,那么稍后,当应用程序位于后台并尝试从后台启动前台服务时,会抛出此异常。与前台服务相关的决策由服务器端 API 持有。我定期检查服务器端值是否更改,如果值更改,则更改后的操作会反映在 SDK 中。
android android-service foregroundnotification android-workmanager android-12
android ×9
android-12 ×3
alarmmanager ×1
android-architecture-components ×1
guava ×1
java ×1
kotlin ×1
scheduler ×1