标签: android-workmanager

当应用程序关闭时,带有广播接收器的工作管理器不起作用

我只想保持蓝牙开启,为此我监听蓝牙状态,如果它被关闭,广播接收器可以启用它。我也希望它在应用程序关闭时运行。因此,即使在应用程序关闭后(当它不工作时),我也试图运行蓝牙广播接收r。为此,我了解到我需要使用工作管理器来支持所有设备。我试图结合 Broadcast Receiver 和 Work Manager。但是当应用程序关闭时我无法让它运行。

这是我的MainActivity.java在这里,我将工作请求排入队列。

package com.example.workmanagersample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class).build();
        WorkManager.getInstance().enqueue(workRequest);

    }
}
Run Code Online (Sandbox Code Playgroud)

下面的类是我的MyWorker.java 在这里我注册了接收器。

package com.example.workmanagersample;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.IntentFilter;
import android.support.annotation.NonNull;
import android.support.v4.app.NotificationCompat;
import androidx.work.Worker;
import androidx.work.WorkerParameters;


public class MyWorker extends Worker {
    private …
Run Code Online (Sandbox Code Playgroud)

android background-service broadcastreceiver android-bluetooth android-workmanager

6
推荐指数
1
解决办法
4225
查看次数

测试 WorkManager 时无法解析 com.google.guava:listenablefuture:{strictly 1.0}

我有一个应用程序,它使用 WorkManager 执行一些计划任务,我正在一堆不同框架的帮助下对其进行测试。我正在使用 robolectric 和 androidx.work:work-testing 这似乎与这个问题有关。

我能够成功运行单元测试,但是当我尝试运行检测测试时,Calculate task graph失败了

Could not determine the dependencies of task ':myModule:mergeDebugAndroidTestResources'.
> Could not resolve all task dependencies for configuration ':myModule:debugAndroidTestRuntimeClasspath'.
   > Could not resolve com.google.guava:listenablefuture:{strictly 1.0}.
     Required by:
         project :myModule
      > Cannot find a version of 'com.google.guava:listenablefuture' that satisfies the version constraints: 
           Dependency path 'MyApp:myModule:unspecified' --> 'androidx.work:work-testing:2.0.1' --> 'androidx.work:work-runtime:2.0.1' --> 'com.google.guava:listenablefuture:1.0'
           Constraint path 'MyApp:myModule:unspecified' --> 'com.google.guava:listenablefuture:{strictly 1.0}' because of the following reason: debugRuntimeClasspath uses version 1.0
           Dependency path 'MyApp:myModule:unspecified' --> …
Run Code Online (Sandbox Code Playgroud)

android robolectric android-guava android-workmanager

6
推荐指数
1
解决办法
2458
查看次数

工人经理:不在队列中开始工作

我有这样的代码,我需要实现任务队列,如果任务在队列中,那么你不需要添加它。\n我实现如图所示,一切正常,但有时工作人员的状态保持ENQUEUED ,并且新的任务不会添加到队列中。\n也就是说,当没有互联网时,我添加一个任务,当互联网出现时,任务开始耗尽,但由于某些原因,有时不会\xe2\x80\ x99t 发生,我无法\xe2\x80\x99 理解为什么任务没有启动,尽管事实上有互联网并且任务在队列中。\n你如何确定为什么任务不会启动?\n有人知道吗?有更好的建议吗?

\n\n
//run task\nrunOneTimeWorkByType<GetDocumentsWorker>(GET_DOCUMENTS_TAG)\n\n     private inline fun <reified W : Worker> runOneTimeWorkByType(tag: String) {\n            val workerInfoList = workManager\n                .getWorkInfosByTag(tag)\n                .get()\n\n            for (item in workerInfoList) {\n                if (item.state == WorkInfo.State.ENQUEUED){\n                    return\n                }\n            }\n\n            val constraints = Constraints.Builder()\n                .setRequiredNetworkType(NetworkType.CONNECTED)\n                .build()\n\n            val workRequest =\n                OneTimeWorkRequestBuilder<W>()\n                    .setConstraints(constraints)\n                    .addTag(tag)\n                    .build()\n\n            workManager.enqueue(workRequest)\n        }\n\n\n        class GetDocumentsWorker(ctx: Context, workerParams: WorkerParameters) :\n            Worker(ctx, workerParams) {\n            @Inject\n            lateinit var serviceUtils: ServiceUtils\n\n            init {\n                App.appComponent.inject(this)\n            }\n\n            override fun doWork(): Result {\n                Log.d("workmng", "GetDocumentsWorker: start")\n                try {\n                    serviceUtils.documentsGet()\n …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-workmanager

6
推荐指数
0
解决办法
2302
查看次数

使用工作管理器的 Android 定期位置更新

我正在使用 WorkManager 如下 -

class LocationWorker(
    ctx: Context, params: WorkerParameters
) : CoroutineWorker(ctx, params), KoinComponent {

    private val locationDataRepository: LocationDataRepository by inject()

    override suspend fun doWork(): Result {
        return try {
            locationDataRepository.triggerLocationUpdates()
            Result.success()
        } catch (e: Exception) {
            Result.failure()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我将 Worker 触发为 -

val myWorker =
            PeriodicWorkRequestBuilder<LocationWorker>(
                15,
                TimeUnit.MINUTES
            ).addTag(
                "location"
            ).build()
        WorkManager.getInstance(context).enqueueUniquePeriodicWork(
            "location",
            ExistingPeriodicWorkPolicy.KEEP,
            myWorker
        )
Run Code Online (Sandbox Code Playgroud)

如您所见,WorkManager 的最短时间为 15 分钟。我想在很短的时间间隔内跟踪位置,比如每隔几秒钟,我也希望即使在手机屏幕关闭时也能跟踪位置。WorkManager 是满足我要求的正确选择还是您会建议我一些其他 API?

android coroutine kotlin android-workmanager

6
推荐指数
1
解决办法
4066
查看次数

Android WorkManager - CoroutineWorker:不推荐重写 coroutineContext

当用户再次上线时,我使用WorkManager版本 2.2.0 来启动 Coroutines API 调用。

在 Google 的示例中,如果我想将 CoroutineWorker 的 Thread 从默认值 ( Dispatchers.Default) 更改为Dispatchers.IO,那么我只需覆盖val coroutineContext例如:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

    override val coroutineContext = Dispatchers.IO

    override suspend fun doWork(): Result = coroutineScope {
         // do some work here and return a Result
    }
}
Run Code Online (Sandbox Code Playgroud)

但是 Android Studio 和文档告诉我,coroutineContext不推荐使用覆盖:

在此处输入图片说明

我错过了什么,我该如何解决这个问题?

android android-architecture-components android-jetpack android-workmanager

6
推荐指数
1
解决办法
2526
查看次数

记录 WorkManager 工作人员

我正在尝试获取有关 WorkManager我在应用程序中运行的工作人员的一些日志记录信息。我正在使用的版本2.4.0-alpha01使用了 Android 框架团队添加的新诊断功能

https://developer.android.com/jetpack/androidx/releases/work#2.4.0-alpha01

他们指示我运行以下命令

adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>"

当我执行这个命令时它只是回显

Broadcast completed: result=0 
Run Code Online (Sandbox Code Playgroud)

到航站楼

然后他们告诉我,我应该通过运行来查看 logcat 中的诊断信息

adb logcat

我运行了该命令,日志的输出看起来像是被混淆了,而且我没有看到任何特定于我的工作人员的日志。

您如何解析这些日志以获取有关您的 WorkManager Workers 的信息?

更新

我现在看到了 WorkManager 日志,因为我已WM-在 logcat 中添加了搜索关键字。

我注意到我的一些工人已经停止运行,但我不明白为什么。

这些是从最后一个成功的工作人员开始的日志

2020-04-27 10:52:32.439 com.sampleapp.android.staging.debug D/WM-StopWorkRunnable: StopWorkRunnable for 58c8d95c-4cbc-4a85-aa18-a93e9926019a; Processor.stopWork = false
2020-04-27 10:52:35.304 com.sampleapp.android.staging.debug D/WM-WorkerWrapper: com.sampleapp.android.common.workers.DownloadMediaWorker returned a Success {mOutputData=Data {MEDIA_ITEM_ID : 16503, }} result.
2020-04-27 10:52:35.308 com.sampleapp.android.staging.debug I/WM-WorkerWrapper: Worker result SUCCESS for Work [ id=b892f6fc-79e4-4475-8da6-d151f217bf59, tags={ com.sampleapp.android.common.workers.DownloadMediaWorker, DOWNLOAD_MEDIA_ITEM_16_1_1 …
Run Code Online (Sandbox Code Playgroud)

android worker logcat deobfuscation android-workmanager

6
推荐指数
1
解决办法
1355
查看次数

前台工作人员中的多个通知

我正在使用工作人员管理器上传视频和通知。当用户尝试使用正在进行的上传工作者作业再次上传视频时,即使正在执行工作,也不会显示第二次上传的通知。我使用的是独特的通知ID,并呼吁setForegroundAsync提到这里。我希望为提交的每个视频上传工作显示通知。

PS抱歉我的英语不好。谢谢

public class PostUploadWorker extends Worker {


    private PostDao postDao;

    private AppPref appPref;

    private HttpLoggingInterceptor logging;

    private PostEntity postEntity;

    private NotificationManagerCompat notificationManager;

    private Bitmap videoThumbnail = null;

    public PostUploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams, @NonNull HttpLoggingInterceptor logging, @NonNull AppPref appPref,
                            @NonNull PostDao postDao) {
        super(context, workerParams);
        this.logging = logging;
        this.appPref = appPref;
        this.postDao = postDao;
        this.notificationManager = NotificationManagerCompat.from(getApplicationContext());
    }

    @NonNull
    @Override
    public Result doWork() {
        // Inject fields
        long postId = getInputData().getLong(Constants.INTENT_POST_ID, -1);

        // upload post
        if …
Run Code Online (Sandbox Code Playgroud)

android worker foregroundnotification android-workmanager

6
推荐指数
0
解决办法
67
查看次数

Workmanager 在 Android 12 Android kotlin 中无法处理延迟

嘿,我正在 kotlin 中工作 WorkManager。我不明白一些代码并给我带来了这个错误。有人能更详细地向我解释一下吗?

2022-01-06 16:48:33.501 14483-14483/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.app, PID: 14483
        java.lang.IllegalArgumentException: Expedited jobs cannot be delayed
            at androidx.work.WorkRequest$Builder.build(WorkRequest.java:326)
            at com.example.app.tracker.TrackerHelper.setupNotificationWorkerForNextLaunch(TrackerHelper.kt:124)
            at com.example.app.tracker.TrackerHelper.setReminderOff(TrackerHelper.kt:36)
            at com.example.app.tracker.TrackerHelper.switchReminder(TrackerHelper.kt:70)
            at com.example.app.tracker.TrackerSettingsViewModel.switchReminder(TrackerSettingsViewModel.kt:34)
            at com.example.app.tracker.TrackerSettingsViewModel.enableReminder(TrackerSettingsViewModel.kt:100)
            at com.example.app.tracker.TrackerSettingsViewModel.setupReminderRow$lambda-1(TrackerSettingsViewModel.kt:85)
            at com.example.app.tracker.TrackerSettingsViewModel.lambda$5Q3PVjBphM6lb1pU0jZdN9GXKaE(Unknown Source:0)
            at com.example.app.tracker.-$$Lambda$TrackerSettingsViewModel$5Q3PVjBphM6lb1pU0jZdN9GXKaE.onCheckedChanged(Unknown Source:2)
            at android.widget.CompoundButton.setChecked(CompoundButton.java:222)
            at androidx.appcompat.widget.SwitchCompat.setChecked(SwitchCompat.java:1095)
            at androidx.appcompat.widget.SwitchCompat.toggle(SwitchCompat.java:1090)
            at android.widget.CompoundButton.performClick(CompoundButton.java:144)
            at android.view.View.performClickInternal(View.java:7418)
            at android.view.View.access$3700(View.java:835)
            at android.view.View$PerformClick.run(View.java:28676)
            at android.os.Handler.handleCallback(Handler.java:938)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loopOnce(Looper.java:201)
            at android.os.Looper.loop(Looper.java:288)
            at android.app.ActivityThread.main(ActivityThread.java:7839)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Run Code Online (Sandbox Code Playgroud)

我尝试了这个解决方案,它在 android 11 或更低版本中工作。之后我尝试了这篇中等帖子来运行 …

android android-service kotlin android-workmanager

6
推荐指数
1
解决办法
3989
查看次数

Service、WorkManager、Kotlin 协程

Services我主要对和感到困惑Coroutines

我不明白为什么应该使用协程以及何时应该使用Services?当我下载文件时,我需要使用服务还是可以直接使用coroutine?他们都无法在死亡过程中幸存下来。

如果我可以使用协程下载文件,我service到底需要什么?

您能否列出所有这些并给出一些我想要使用服务的示例,我将在哪里使用Coroutines以及我将在哪里使用WorkManager

另外,我应该使用AsyncTask吗?因为我读到它有很多缺陷,并且可能会造成内存泄漏。

我还阅读了这篇有关后台工作的文章: https ://developer.android.com/guide/background

但它只讨论了 Workmanager 和 Coroutines,而没有提到服务。为什么?

service android android-workmanager kotlin-coroutines

6
推荐指数
1
解决办法
1667
查看次数

Android Studio 应用程序检查无法启动:无法启动检查器 *.inspection:实例化具有 id *.inspection 的检查器期间失败

我遇到了一个大问题...

即使清除缓存、重新启动/删除 AVD 后,Android Studio 的应用程序检查也不会启动。

完成步骤:

  1. 清除缓存
  2. 全部更新
  3. 删除/重新创建 AVD
  4. 阅读所有日志

当在其他项目上使用它时,它可以工作,但在这个项目上却不行

其他项目与此项目之间的唯一区别是:

使用 OkHttp 和 Workmanager :

//okhttp
// define a BOM and its version
implementation(platform("com.squareup.okhttp3:okhttp-bom:5.0.0-alpha.11"))

// define any required OkHttp artifacts without version
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")

implementation 'androidx.work:work-runtime-ktx:2.8.1'
Run Code Online (Sandbox Code Playgroud)

即使日志也没有显示任何差异。我在互联网上进行了挖掘,但一无所获。请我需要专家的帮助。

android apk android-studio okhttp android-workmanager

6
推荐指数
1
解决办法
2775
查看次数