我只想保持蓝牙开启,为此我监听蓝牙状态,如果它被关闭,广播接收器可以启用它。我也希望它在应用程序关闭时运行。因此,即使在应用程序关闭后(当它不工作时),我也试图运行蓝牙广播接收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
我有一个应用程序,它使用 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) 我有这样的代码,我需要实现任务队列,如果任务在队列中,那么你不需要添加它。\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) 我正在使用 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?
当用户再次上线时,我使用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
我正在尝试获取有关 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) 我正在使用工作人员管理器上传视频和通知。当用户尝试使用正在进行的上传工作者作业再次上传视频时,即使正在执行工作,也不会显示第二次上传的通知。我使用的是独特的通知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) 嘿,我正在 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)
Services我主要对和感到困惑Coroutines
我不明白为什么应该使用协程以及何时应该使用Services?当我下载文件时,我需要使用服务还是可以直接使用coroutine?他们都无法在死亡过程中幸存下来。
如果我可以使用协程下载文件,我service到底需要什么?
您能否列出所有这些并给出一些我想要使用服务的示例,我将在哪里使用Coroutines以及我将在哪里使用WorkManager?
另外,我应该使用AsyncTask吗?因为我读到它有很多缺陷,并且可能会造成内存泄漏。
我还阅读了这篇有关后台工作的文章: https ://developer.android.com/guide/background
但它只讨论了 Workmanager 和 Coroutines,而没有提到服务。为什么?
我遇到了一个大问题...
即使清除缓存、重新启动/删除 AVD 后,Android Studio 的应用程序检查也不会启动。
完成步骤:
当在其他项目上使用它时,它可以工作,但在这个项目上却不行。
其他项目与此项目之间的唯一区别是:
使用 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 ×10
kotlin ×3
worker ×2
android-architecture-components ×1
apk ×1
coroutine ×1
logcat ×1
okhttp ×1
robolectric ×1
service ×1