我想执行一项任务,即使在使用工作管理器终止应用程序之后也是如此。但是,在应用程序被杀死后不会执行任务。
workManager = WorkManager.getInstance();
Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
OneTimeWorkRequest saveData = new OneTimeWorkRequest.Builder(SaveDataWorker.class).setConstraints(constraints).setInitialDelay(10,TimeUnit.SECONDS).build();
workManager.enqueue(saveData);
Run Code Online (Sandbox Code Playgroud) 一、问题描述
我的目标是构建一个 Flutter 应用程序,该应用程序使用此工作管理器插件并使用此位置插件获取定期位置更新。但是当我的 Workmanager 回调触发时,我无法正确加载位置插件。我收到此错误:
MissingPluginException(No implementation found for method getLocation on channel lyokone/location)
Run Code Online (Sandbox Code Playgroud)
所以基本上,问题在于当 Workmanager 插件尝试运行 dart 代码时,它不会加载 Location 插件。
2.我研究过的其他资源
据我了解,为这些问题提供的解决方案归结为:创建一个名为CustomApplication.java的文件,它扩展FlutterApplication并注册您的插件。然后在 AndoidManifest.xml 文件中注册 CustomApplication.java 文件。
3. 到目前为止我的代码
我试图制作一个实现我需要的功能的最低限度的应用程序:
要准确了解我在每个步骤中所做的工作,请查看此处:https : //gitlab.com/tomoerlemans/workmanager_with_location/-/commits/master。(此存储库还可用于快速复制问题)。
相关代码文件如下:
main.dart
import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';
import 'package:location/location.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget …Run Code Online (Sandbox Code Playgroud) android dart flutter flutter-dependencies android-workmanager
我正在尝试使用新的WorkManager API 1.0.0-alpha06每15分钟运行一次工作.如果我没有错,使用带有PeriodicWorkRequest的工作管理器应该让工作人员彻底查看任务并重新启动电话,但是当我从最近的应用程序中滑动任务时,预定的工作人员会丢失(我等了大约45分钟才看到任何人工人的日志安排15分钟间隔).
这些是我的文件:
MyExampleWorker.java:
public class MyExampleWorker extends Worker{
public static final String TAG = "MY_EXAMPLE_WORKER";
@NonNull
@Override
public Result doWork() {
Log.i(TAG, "Starting background worker");
// Getting configuration data
long param1 = getInputData().getLong("param1", 60000);
String param2 = getInputData().getString("param2");
String param3 = getInputData().getString("param3");
PackageManager pckMgr = mContext.getPackageManager();
...
..
.
return Result.SUCCESS;
}
}
Run Code Online (Sandbox Code Playgroud)
Main.java:一旦应用程序启动,此方法就会触发
@ReactMethod
public void execute() {
Log.i(TAG, "inside execute, setting up periodic worker in workManager");
Data inputData = new Data.Builder()
.putLong("param1", 60000)
.putString("param2", "something")
.putString("param3", …Run Code Online (Sandbox Code Playgroud) android android-service android-architecture-components android-jetpack android-workmanager
由于某些原因,我无法从 Android WorkManager 的 PeriodicWorkRequest 获取输出数据。工作人员按预期定期运行,只是不返回任何数据。
我的主要活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
schedulePeriodicRequests();
}
public void schedulePeriodicRequests() {
PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(ServerRequestsWorker.class, 15, TimeUnit.MINUTES)
.build();
WorkManager workManager = WorkManager.getInstance(MainActivity.this);
workManager.enqueue(workRequest);
workManager.getWorkInfoByIdLiveData(workRequest.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(@Nullable WorkInfo workInfo) {
if (workInfo != null) {
Log.d(LOG_TAG, "WorkInfo received: state: " + workInfo.getState());
String message = workInfo.getOutputData().getString(ServerRequestsWorker.KEY_MESSAGE);
Log.d(LOG_TAG, "message: " + message);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我的 ServerRequestsWorker:
public static final String KEY_MESSAGE = "message"; …Run Code Online (Sandbox Code Playgroud) 我有应用程序需要在设备上连接互联网后立即同步数据。
我在 Worker 类中有同步工作,它工作正常。但是我需要在手机连接互联网后立即运行这个类。由于不推荐和弃用广播接收器的连接更改,我需要一种方法在连接互联网时启动我的课程,以便数据同步。我怎样才能做到这一点?
我还想在用户存在应用程序并保持 Internet 连接状态时安排工作管理器,但是当应用程序从最近关闭时,不会调用 onDestroy。你有什么解决方案或逻辑吗?
android broadcastreceiver android-jobscheduler android-workmanager
假设我想构建一个应用程序,它定期请求当前位置(例如,每 10 分钟一次,这个数字应该是可配置的)并提交到服务器。
我知道对于这种情况通常建议使用 Foreground Service 和 WorkManager。然而哪个更适合呢?以下是我的想法和疑问。
WorkManager - 主要用于可延迟的后台工作,其执行是有保证的。但我知道从 Android 8 (API 26) 开始引入了后台位置,并且限制位置每小时只能更新几次https://developer.android.com/about/versions/oreo/background-location-limits。因此,这可能不符合定期更新的要求。
ForegroundService - 非常适合运行并需要让用户意识到的东西。出于隐私目的,建议这种情况(位置跟踪)使用。Google 还创建了一个示例应用程序来推广这种做法https://github.com/android/location-samples/tree/master/LocationUpdatesForegroundService。
从上面的分析来看,似乎ForegroundService是这样的。但是我还发现它WorkManager具有内置支持,可ForegroundService通过androidx.work.impl.foreground.SystemForegroundService https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running-kotlin结合使用 Worker
这让我很困惑,不知道我应该使用什么,以及谷歌针对这个特定场景真正推荐的是什么。
有人有什么想法吗?
android android-location foreground-service android-architecture-components android-workmanager
Google AdMob Ads 库版本 19.4.0 升级到 19.5.0 后,部分设备上出现了新的异常:
Caused by java.lang.ClassNotFoundException
Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: ...
dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:196)
androidx.core.app.CoreComponentFactory.instantiateProvider (CoreComponentFactory.java)
android.app.ActivityThread.installProvider (ActivityThread.java:7213)
android.app.ActivityThread.installContentProviders (ActivityThread.java:6769)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:941)
Run Code Online (Sandbox Code Playgroud)
该异常出现在 Android 8 和 10 的设备上。
AdMob 库 19.5.0 添加了对 WorkManager 2.1.0 的依赖项(通过 Play Services Ads Lite 库): https://mvnrepository.com/artifact/com.google.android.gms/play-services-ads-lite/19.5.0
在这个问题上有一个类似的问题,但它似乎是无关的(较旧的Android操作系统版本具有多个dex,而这里是单个dex和较新的操作系统版本)。
目前我降级到 AdMob 19.4.0,其中不包含 WorkManager 依赖项。
更新(2020.12.18)
如何正确使用WorkManagerAndroid Jetpack中的新功能来安排每天一次的定期工作,这应该每天做一次并且只做一次?
我们的想法是检查具有给定标签的工作是否已经存在WorkManager,否则开始新的定期工作.
我尝试使用下一种方法来做到这一点:
public static final String CALL_INFO_WORKER = "Call worker";
...
WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
.addTag(CALL_INFO_WORKER)
.build();
workManager.enqueue(callDataRequest);
}
Run Code Online (Sandbox Code Playgroud)
但value总是空,即使我把一个断点里面Worker的doWork()方法(所以它肯定是正在进行中),并从另一个线程检查工作状态.
android android-architecture-components android-jetpack android-workmanager
我们注意到AlarmManagerCompat,由于AlarmManager不同版本的操作系统中的行为不同,仅在我们的应用程序中实现警报/提醒功能并不是一种可靠的方法.(例如,打盹模式)
最初,我们计划使用Evernote的android-job库来帮助我们在应用程序中实现警报/提醒功能.
但是,在此过程中,我们也注意到谷歌刚刚发布WorkerManager.
到目前为止,WorkerManager当我们在应用程序退出后运行一些一次性后台作业(几乎是即时的,具有互联网连接约束)时,对我们来说效果很好.
我们计划使用WorkerManager实现警报/提醒功能.
我想知道,WorkerManager实现这样的功能有多可靠?有人尝试过吗?我们的目标是API 15及更高版本.
我有一个Worker需要每24小时运行一次的实例,考虑到PeriodicWorkRequestAPI ,这很简单.但这是抓住了.
如果用户在下午8点开始工作,我需要工作管理器的第一个实例在第二天早上9点运行,然后遵循24小时定期约束.
我看了一下这里,我发现OneTimeWorkRequest API有一个setInitialDelay()可以使用的功能,但我无法找到任何PeriodicWorkAPI.
这是一些hacks,例如我可以使用OneTimeWork初始延迟,然后PeriodicWork从那里安排一个但是它有点肮脏的黑客.
有没有办法只用PeriodicWorkRequestAPI 来做到这一点?