我有一个定期任务,要求在后台更新位置,但我需要限制该任务长时间工作,因为它会耗尽电池,所以我需要在几分钟(3 分钟)后停止它。工作管理器是否提供某种机制来限制任务的执行时间?
我正在使用PeriodicWorkRequest 每小时从互联网获取一些数据。我想用工作人员返回的结果更新我的应用程序的 UI。这是我现在的代码:
workManager.enqueueUniquePeriodicWork("name", ExistingPeriodicWorkPolicy.REPLACE, work)
workManager
.getWorkInfoByIdLiveData(work.id)
.observe(this, { workInfo ->
if (workInfo?.state == WorkInfo.State.SUCCEEDED) {
// it never arrives here for updating the UI
}
}
Run Code Online (Sandbox Code Playgroud)
给定周期性工作的生命周期,状态SUCCEEDED永远不会达到,因为它在RUNNING和之间跳跃ENQUEUED;在这两种状态下,Result.OutputData对象是空的,所以我不能使用它。
该应用程序被认为不会一直保持打开状态,但当它打开时,它应该显示从工作人员检索到的最后数据。
如何检索函数返回的结果的 OutputData doWork()?定期工作是适合我的用例的工具吗?
我尝试摆脱此处所述的IntentService处理时间。由于Android O背景限制。但是我无法将带有push info作为参数的Bundle Extras 传递给from 。有什么办法可以将Bundle放入数据中吗?GCMWorkManagerBroadcastReceiverWorkManager
android google-cloud-messaging android-intentservice android-bundle android-workmanager
以前可以使用 IntentService 或带 WakeLock 的 SyncAdapter 来确保一系列更新。
现在有了新的 Doze 模式和节省电池的限制,WakeLock 是否仍然足够可靠,还是应该使用 WorkManager 在 IntentService 或 SyncAdapter 中启动更长的进程?
WorkManager api 也可以生产了吗?
我正在尝试编写一个定期的workmanager脚本,但它只是在我打开应用程序时运行它只运行一次(不是定期的)!
这是我的主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work);
Intent intent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
NotifyWorker.pendingIntent = pendingIntent;
NotifyWorker.context = this;
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotifyWorker.class, 1, TimeUnit.MINUTES).build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的dowork方法:
public Result doWork() {
Log.i("wd","wd");
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context,"ctx")
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher))
.setSmallIcon(R.drawable.logo)
.setContentTitle("Title")
.setContentText("Desc")
.setContentIntent(pendingIntent);
android.app.NotificationManager notificationManager =
(android.app.NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 , notificationBuilder.build());
return Result.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
为什么它不是每1分钟运行一次?我想念的是什么?
我正在使用工作管理器进行网络调用并获取一些数据,因为我已经使用了OneTimeRequest。该调用在worker类中响应完美,但在正在监视工作的“生命周期所有者”中返回空白结果。
workManager= WorkManager.getInstance();
OneTimeWorkRequest.Builder encryptionWork =new OneTimeWorkRequest.Builder(NetworkWorker.class);
getUsersWorkReq=encryptionWork.setInputData(getWorkerInput(EXPERT_LIST_REQUEST))
.addTag(Constant.WORK_GETUSER)
.build();
workManager.enqueue(getUsersWorkReq);
Run Code Online (Sandbox Code Playgroud)
为了观察工人阶级的回应
workManager.getStatusById(getUsersWorkReq.getId()).observe(this, workStatus -> {
if (workStatus != null && workStatus.getState().isFinished()) {
String status=workStatus.getOutputData().getString(Constant.WORK_RESULT);
String response=workStatus.getOutputData().getString(Constant.WORK_RESPONSE);
if(status!=null && !status.equalsIgnoreCase("")){
}
}
});
Run Code Online (Sandbox Code Playgroud)
但问题是,响应字符串始终为空!即使工作经理已经完成任务并且工作人员中存在网络响应,但是当我使用setOutputData时,它也会提供空白数据。
outPut = new Data.Builder()
.putString(Constant.WORK_RESULT,Constant.WORK_SUCCESS)
.putString(Constant.WORK_RESPONSE, String.valueOf(response.body()))
.build();
Log.e("WORKER", "onResponse: "+ response.body().getMsg() );
setOutputData(outPut);
Run Code Online (Sandbox Code Playgroud)
工人阶级
public class NetworkWorker extends Worker {
Data outPut;
@NonNull
@Override
public Result doWork() {
ApiService service = RetrofitInstance.getRetrofitInstance().create(ApiService.class);
Call<ExpertListResponse> call = service.get_recommended_users();
Log.wtf("URL Called", call.request().url() + "");
call.enqueue(new Callback<ExpertListResponse>() {
@Override …Run Code Online (Sandbox Code Playgroud) 我正在尝试从Android WorkManager实施一个带有Firebase数据库引用事件监听器的Worker。如果应用程序位于前景/背景中,则效果很好。但是,一旦我关闭了应用程序并且工作程序运行,事件监听器就不会触发,据我所知,我在日志中没有收到与此相关的任何错误消息。
这是一个示例代码:
class FirebaseWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
val firebaseDatabaseRef = FirebaseDatabase.getInstance().reference
firebaseDatabaseRef.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
// Handle DataSnapshot
}
override fun onCancelled(databaseError: DatabaseError) {
// Handle DatabaseError
}
})
return Result.SUCCESS
}
}
Run Code Online (Sandbox Code Playgroud)
请让我知道在关闭应用程序后是否可以做任何事情来在后台获取和处理Firebase实时数据库数据。
java android firebase firebase-realtime-database android-workmanager
我想每天在我的应用程序中运行一个任务,我正在使用 JobScheduler 并且在股票操作系统中运行良好,但是当我尝试在具有自定义 ROM(小米)的手机中运行它时它不起作用,除非我明确启用自动- 安全中应用程序的启动选项。有没有解决方案,其他应用程序如何处理这种情况?
android alarmmanager android-jobscheduler android-workmanager
在版本2.1.0中不推荐使用WorkManager.getInstance()
依赖关系:
implementation 'androidx.work:work-runtime:2.1.0'
Run Code Online (Sandbox Code Playgroud)
此方法或任何其他方式有什么变化?