Как я могу использовать workmanager для фоновой загрузки, у меня есть приложение для резервного копирования моих файлов на компьютер через FTP, и я хочу изучить новый способ, потому что на моем телефоне старый способ работает только тогда, когда у меня есть приложение, работающее и работающее, когда Я закрываю приложение, остановка фоновой задачи. Может ли кто-нибудь помочь мне настроить Workmanager
class Working(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
private val TAG = ""
private val SERVER = ""
private val USERNAME = ""
private val PASSWORD = ""
private val PATH = ""
private val timer = Timer()
override fun doWork(): ListenableWorker.Result {
Log.i(TAG, "UploadJobService onStartJob")
UploadFile(applicationContext).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, PATH, SERVER, USERNAME, PASSWORD)
var uploadTask = UploadFile(applicationContext)
timer.schedule(UploadTick(uploadTask, applicationContext),0, 1 * 10000)
return UploadTick.Result.SUCCESS
}
internal class UploadTick(task: UploadFile, ctx: Context): TimerTask() {
private val SERVER = ""
private val USERNAME = ""
private val PASSWORD = ""
private val PATH = ""
private var _task = task
private val _context = ctx
override fun run() {
Log.d("UploadTick", _task.status.toString())
if (_task.status == AsyncTask.Status.PENDING) {
_task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, PATH, SERVER, USERNAME, PASSWORD)
} else if (_task.status == AsyncTask.Status.FINISHED) {
_task = UploadFile(_context)
_task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, PATH, SERVER, USERNAME, PASSWORD)
}
}
}
companion object {
private val TAG = UploadTick::class.java.simpleName
}
}
Два решения:
Используйте диспетчер сигналов тревоги с IntentService, чтобы периодически планировать задачу, даже если приложение находится в фоновом режиме, например:
final AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Intent i = new Intent(context, UpdateService.class);
if (pendingIntent == null) {
pendingIntent = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
manager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), INTERVAL_TIME_MILLIS, pendingIntent);
}
Используйте диспетчер работ и планируйте его периодически следующим образом:
WorkManager.getInstance().enqueue(new
PeriodicWorkRequest.Builder(FiveDayDataApiDownloader.class, 24,
TimeUnit.HOURS).setConstraints(new
Constraints.Builder().setRequiresBatteryNotLow(true).build()).build());