{"id":55895,"date":"2022-11-30T10:25:16","date_gmt":"2022-11-30T04:55:16","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=55895"},"modified":"2022-12-06T10:38:18","modified_gmt":"2022-12-06T05:08:18","slug":"using-work-managers-periodic-work-for-less-than-15-minutes","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/using-work-managers-periodic-work-for-less-than-15-minutes\/","title":{"rendered":"Using work manager\u2019s periodic work for less than 15 minutes"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-55894\" src=\"\/blog\/wp-ttn-blog\/uploads\/2022\/11\/1b23X9nyXFGpmbEBDibDt6w-300x99.png\" alt=\"\" width=\"300\" height=\"99\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2022\/11\/1b23X9nyXFGpmbEBDibDt6w-300x99.png 300w, \/blog\/wp-ttn-blog\/uploads\/2022\/11\/1b23X9nyXFGpmbEBDibDt6w-1024x339.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2022\/11\/1b23X9nyXFGpmbEBDibDt6w-768x254.png 768w, \/blog\/wp-ttn-blog\/uploads\/2022\/11\/1b23X9nyXFGpmbEBDibDt6w-624x206.png 624w, \/blog\/wp-ttn-blog\/uploads\/2022\/11\/1b23X9nyXFGpmbEBDibDt6w.png 1400w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p id=\"ecf9\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">During our development journey, we do face situations where we require to perform some periodic and background tasks.<\/p>\n<p id=\"b04a\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">So, to do so, we have multiple ways, but if it comes to the best way to perform these types of tasks in the context of clean code and optimized device resources usages, then we need to think twice before implementation.<\/p>\n<p id=\"582a\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">And after considering above mentioned things, we can go with the WorkManager.<\/p>\n<p id=\"beef\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">We can use WorkManager to trigger the <strong class=\"lk ie\"><em class=\"um\">OneTimeWorkRequest<\/em><\/strong> and<strong> <em class=\"um\">PeriodicWorkRequest<\/em><\/strong> as per the requirements. We can create and enqueue multiple requests and can start conditionally.<\/p>\n<p id=\"4991\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">In this blog, we&#8217;ll be covering the OneTimeWorkRequest and use it as a periodic request for less than 15 min.<\/p>\n<blockquote class=\"un uo up\">\n<p id=\"054c\" class=\"tq tr um lk b ts tt ig tu tv tw ik tx uq tz ua ub ur ud ue uf us uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Why <strong class=\"lk ie\"><em class=\"sk\">OneTimeWorkRequest<\/em><\/strong> as periodic request for 0\u201314 min?<\/p>\n<p id=\"1507\" class=\"tq tr um lk b ts tt ig tu tv tw ik tx uq tz ua ub ur ud ue uf us uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Because <em class=\"sk\">PeriodicWorkRequest <\/em>allows us to schedule tasks for minimum 15 min but if our requirement is to create it for less time, then what.<\/p>\n<\/blockquote>\n<p id=\"2a93\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\"><strong class=\"lk ie\">Lets code and achieve it<\/strong><\/p>\n<p id=\"b0eb\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Add the required dependency in app level gradle:<\/p>\n<pre class=\"ut uu uv uw rf ux fo uy ry rs uz\"><span id=\"3382\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\">\/\/work manager\r\nimplementation <span class=\"hljs-string\">'androidx.work:work-runtime-ktx:2.7.1'<\/span><\/span><\/pre>\n<p id=\"7810\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Create a class MyWorker and extend Worker:<\/p>\n<pre class=\"ut uu uv uw rf ux fo uy ry rs uz\"><span id=\"93f4\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">package<\/span> com.myworkmanager\r\n\r\n<span class=\"hljs-keyword\">import<\/span> android.content.Context\r\n<span class=\"hljs-keyword\">import<\/span> android.util.Log\r\n<span class=\"hljs-keyword\">import<\/span> androidx.work.Worker\r\n<span class=\"hljs-keyword\">import<\/span> androidx.work.WorkerParameters\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">MyWorker<\/span>(appContext: Context, workerParams: WorkerParameters) :\r\n    Worker(appContext, workerParams) {\r\n    <span class=\"hljs-comment\">\/**\r\n     * it will be called after the specified delay\r\n     *\/<\/span>\r\n    <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">doWork<\/span><span class=\"hljs-params\">()<\/span><\/span>: Result {\r\n        Log.i(<span class=\"hljs-string\">\"MyWorker\"<\/span>, <span class=\"hljs-string\">\"doWork\"<\/span>)\r\n\r\n        <span class=\"hljs-comment\">\/\/you can notify back to user<\/span>\r\n        WorkHandler.onDoWork()\r\n\r\n        <span class=\"hljs-comment\">\/\/or if you need to do some background task e.g., upload or download<\/span>\r\n        <span class=\"hljs-comment\">\/\/then pass the reference of the required resources in MyWorker()<\/span>\r\n        doFurtherTask()\r\n\r\n        <span class=\"hljs-keyword\">return<\/span> Result.success()\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/**\r\n     * or if you need to do some background task e.g., upload or download\r\n     * then pass the reference of the required resources in MyWorker()\r\n     *\/<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">doFurtherTask<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n        Log.i(<span class=\"hljs-string\">\"MyWorker\"<\/span>, <span class=\"hljs-string\">\"doFurtherTask\"<\/span>)\r\n        <span class=\"hljs-comment\">\/\/ do your background work here if required<\/span>\r\n    }\r\n}<\/span><\/pre>\n<p id=\"8f0d\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Create WorkHandler:<\/p>\n<pre class=\"ut uu uv uw rf ux fo uy ry rs uz\"><span id=\"c8cd\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">package<\/span> com.myworkmanager\r\n\r\n<span class=\"hljs-keyword\">import<\/span> android.util.Log\r\n<span class=\"hljs-keyword\">import<\/span> androidx.lifecycle.Lifecycle\r\n<span class=\"hljs-keyword\">import<\/span> androidx.work.Constraints\r\n<span class=\"hljs-keyword\">import<\/span> androidx.work.NetworkType\r\n<span class=\"hljs-keyword\">import<\/span> androidx.work.OneTimeWorkRequestBuilder\r\n<span class=\"hljs-keyword\">import<\/span> androidx.work.WorkManager\r\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.TimeUnit\r\n\r\n\r\n<span class=\"hljs-keyword\">object<\/span> WorkHandler {\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">val<\/span> tag = <span class=\"hljs-string\">\"WorkHandler\"<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">val<\/span> workManager = WorkManager.getInstance(MyWorkManagerApplication.appInstance)\r\n\r\n    <span class=\"hljs-comment\">\/**\r\n     * create work request\r\n     *\r\n     * <span class=\"hljs-doctag\">@param<\/span> delay\r\n     *\/<\/span>\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">createWork<\/span><span class=\"hljs-params\">(delay: <span class=\"hljs-type\">Long<\/span>)<\/span><\/span> {\r\n        <span class=\"hljs-keyword\">val<\/span> constraints = Constraints.Builder()\r\n            .setRequiresBatteryNotLow(<span class=\"hljs-literal\">true<\/span>)\r\n            .setRequiredNetworkType(NetworkType.CONNECTED)\r\n            .setRequiresBatteryNotLow(<span class=\"hljs-literal\">true<\/span>)\r\n            .build()\r\n\r\n        <span class=\"hljs-keyword\">val<\/span> request = OneTimeWorkRequestBuilder&lt;MyWorker&gt;()\r\n\r\n        <span class=\"hljs-keyword\">val<\/span> work = request.setConstraints(constraints)\r\n            .addTag(tag)\r\n            .setInitialDelay(delay, TimeUnit.MINUTES)\r\n            .build()\r\n\r\n        workManager.enqueue(work)\r\n\r\n        Log.i(tag, <span class=\"hljs-string\">\"work created\"<\/span>)\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/**\r\n     * do UI related work because this method is supporting foreground work\r\n     * If you have any other requirement then please update the conditions\r\n     *\/<\/span>\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">onDoWork<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n        <span class=\"hljs-keyword\">try<\/span> {\r\n            <span class=\"hljs-keyword\">val<\/span> activity = BaseActivity.currentActivityInstance.<span class=\"hljs-keyword\">get<\/span>()\r\n\r\n            <span class=\"hljs-keyword\">if<\/span> (activity?.lifecycle?.currentState?.isAtLeast(Lifecycle.State.RESUMED) == <span class=\"hljs-literal\">true<\/span>) {\r\n                <span class=\"hljs-comment\">\/\/if current activity is active<\/span>\r\n                <span class=\"hljs-comment\">\/\/do UI related work<\/span>\r\n                Log.i(tag, <span class=\"hljs-string\">\"app is active, do UI work\"<\/span>)\r\n\r\n                <span class=\"hljs-comment\">\/\/recreate the work if required<\/span>\r\n                Log.i(tag, <span class=\"hljs-string\">\"recreateWork\"<\/span>)\r\n\r\n                createWork(WORK_DELAY_IN_MIN)\r\n\r\n            } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (activity?.lifecycle?.currentState?.isAtLeast(Lifecycle.State.DESTROYED) == <span class=\"hljs-literal\">true<\/span>) {\r\n                <span class=\"hljs-comment\">\/\/if current activity is in background for any reason then<\/span>\r\n                <span class=\"hljs-comment\">\/\/recreate the work if required<\/span>\r\n                Log.i(tag, <span class=\"hljs-string\">\"recreateWork\"<\/span>)\r\n\r\n                createWork(WORK_DELAY_IN_MIN)\r\n\r\n            } <span class=\"hljs-keyword\">else<\/span> {\r\n                <span class=\"hljs-comment\">\/\/cancel work if app got killed, if you want to continue then remove this condition<\/span>\r\n                <span class=\"hljs-comment\">\/\/and, keep recreate work logic<\/span>\r\n                Log.i(tag, <span class=\"hljs-string\">\"safe: cancel work if any\"<\/span>)\r\n                cancelWork()\r\n            }\r\n\r\n        } <span class=\"hljs-keyword\">catch<\/span> (ex: Exception) {\r\n            Log.e(tag, ex.toString())\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-comment\">\/**\r\n     * cancel enqueued work by the given tag\r\n     *\/<\/span>\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">cancelWork<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n        workManager.cancelAllWorkByTag(tag)\r\n        \r\n        Log.i(tag, <span class=\"hljs-string\">\"work canceled\"<\/span>)\r\n    }\r\n}<\/span><\/pre>\n<p id=\"1ff5\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Work initiator MyWorkManagerApplication:<\/p>\n<pre class=\"ut uu uv uw rf ux fo uy ry rs uz\"><span id=\"4b3f\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">package<\/span> com.myworkmanager\r\n\r\n<span class=\"hljs-keyword\">import<\/span> android.app.Application\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">MyWorkManagerApplication<\/span> : <span class=\"hljs-type\">Application<\/span>() {\r\n\r\n    <span class=\"hljs-keyword\">init<\/span> {\r\n        appInstance = <span class=\"hljs-keyword\">this<\/span>\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">companion<\/span> <span class=\"hljs-keyword\">object<\/span> {\r\n        <span class=\"hljs-keyword\">lateinit<\/span> <span class=\"hljs-keyword\">var<\/span> appInstance: MyWorkManagerApplication\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">onCreate<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n        <span class=\"hljs-keyword\">super<\/span>.onCreate()\r\n\r\n        <span class=\"hljs-comment\">\/\/start work on application start<\/span>\r\n        <span class=\"hljs-comment\">\/\/or you can start work as per your need<\/span>\r\n        <span class=\"hljs-comment\">\/\/e.g., from MainActivity, SplashActivity, via user action, etc.<\/span>\r\n        WorkHandler.createWork(WORK_DELAY_IN_MIN)\r\n    }\r\n}<\/span><\/pre>\n<p id=\"ecf3\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">Rest of the files to support the complete flow:<\/p>\n<pre class=\"ut uu uv uw rf ux fo uy ry rs uz\"><span id=\"8a95\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">package<\/span> com.myworkmanager\r\n\r\n<span class=\"hljs-keyword\">import<\/span> androidx.appcompat.app.AppCompatActivity\r\n<span class=\"hljs-keyword\">import<\/span> java.lang.ref.WeakReference\r\n\r\n<span class=\"hljs-keyword\">open<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">BaseActivity<\/span> : <span class=\"hljs-type\">AppCompatActivity<\/span>() {\r\n    <span class=\"hljs-keyword\">companion<\/span> <span class=\"hljs-keyword\">object<\/span> {\r\n        <span class=\"hljs-keyword\">var<\/span> currentActivityInstance: WeakReference&lt;AppCompatActivity?&gt; =\r\n            WeakReference&lt;AppCompatActivity?&gt;(<span class=\"hljs-literal\">null<\/span>)\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">onResume<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n        <span class=\"hljs-keyword\">super<\/span>.onResume()\r\n\r\n        <span class=\"hljs-comment\">\/\/keep current activity instance and use to perform any UI related task on work completion<\/span>\r\n        currentActivityInstance = WeakReference(<span class=\"hljs-keyword\">this<\/span>)\r\n    }\r\n}<\/span><\/pre>\n<pre class=\"of ux fo uy ry rs uz\"><span id=\"9993\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\"><span class=\"hljs-keyword\">package<\/span> com.myworkmanager\r\n\r\n<span class=\"hljs-keyword\">import<\/span> android.content.Intent\r\n<span class=\"hljs-keyword\">import<\/span> android.os.Bundle\r\n<span class=\"hljs-keyword\">import<\/span> android.util.Log\r\n<span class=\"hljs-keyword\">import<\/span> android.widget.Button\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title.class\">MainActivity<\/span> : <span class=\"hljs-type\">BaseActivity<\/span>() {\r\n    <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">fun<\/span> <span class=\"hljs-title\">onCreate<\/span><span class=\"hljs-params\">(savedInstanceState: <span class=\"hljs-type\">Bundle<\/span>?)<\/span><\/span> {\r\n        <span class=\"hljs-keyword\">super<\/span>.onCreate(savedInstanceState)\r\n        setContentView(R.layout.activity_main)\r\n\r\n        Log.i(<span class=\"hljs-string\">\"MainActivity\"<\/span>, <span class=\"hljs-string\">\"launched\"<\/span>)\r\n\r\n        findViewById&lt;Button&gt;(R.id.go_to_next_screen_button)?.setOnClickListener {\r\n            startActivity(Intent(<span class=\"hljs-keyword\">this<\/span>, YourActivity::<span class=\"hljs-keyword\">class<\/span>.java))\r\n        }\r\n\r\n        findViewById&lt;Button&gt;(R.id.cancel_work_button)?.setOnClickListener {\r\n            <span class=\"hljs-comment\">\/\/cancel on going work anytime<\/span>\r\n            WorkHandler.cancelWork()\r\n        }\r\n    }\r\n}<\/span><\/pre>\n<pre class=\"of ux fo uy ry rs uz\"><span id=\"d578\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\">Constants.kt\r\n\r\n<span class=\"hljs-keyword\">package<\/span> com.myworkmanager\r\n\r\n<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">val<\/span> WORK_DELAY_IN_MIN: <span class=\"hljs-built_in\">Long<\/span> = <span class=\"hljs-number\">7<\/span><\/span><\/pre>\n<pre class=\"of ux fo uy ry rs uz\"><span id=\"5ede\" class=\"fu va vb sk uz b bn vc vd l ve vf\" data-selectable-paragraph=\"\">activity_main.xml\r\n\r\n<span class=\"hljs-meta\">&lt;?xml version=<span class=\"hljs-string\">\"1.0\"<\/span> encoding=<span class=\"hljs-string\">\"utf-8\"<\/span>?&gt;<\/span>\r\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">androidx.constraintlayout.widget.ConstraintLayout<\/span> <span class=\"hljs-attr\">xmlns:android<\/span>=<span class=\"hljs-string\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"hljs-attr\">xmlns:app<\/span>=<span class=\"hljs-string\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"hljs-attr\">xmlns:tools<\/span>=<span class=\"hljs-string\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"hljs-attr\">android:layout_width<\/span>=<span class=\"hljs-string\">\"match_parent\"<\/span>\r\n    <span class=\"hljs-attr\">android:layout_height<\/span>=<span class=\"hljs-string\">\"match_parent\"<\/span>\r\n    <span class=\"hljs-attr\">tools:context<\/span>=<span class=\"hljs-string\">\".MainActivity\"<\/span>&gt;<\/span>\r\n\r\n\r\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Button<\/span>\r\n        <span class=\"hljs-attr\">android:id<\/span>=<span class=\"hljs-string\">\"@+id\/go_to_next_screen_button\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_width<\/span>=<span class=\"hljs-string\">\"wrap_content\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_height<\/span>=<span class=\"hljs-string\">\"wrap_content\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginStart<\/span>=<span class=\"hljs-string\">\"157dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginTop<\/span>=<span class=\"hljs-string\">\"215dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginEnd<\/span>=<span class=\"hljs-string\">\"160dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:text<\/span>=<span class=\"hljs-string\">\"@string\/go_to_next_screen\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintEnd_toEndOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintStart_toStartOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintTop_toTopOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">tools:ignore<\/span>=<span class=\"hljs-string\">\"DuplicateSpeakableTextCheck\"<\/span> \/&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Button<\/span>\r\n        <span class=\"hljs-attr\">android:id<\/span>=<span class=\"hljs-string\">\"@+id\/cancel_work_button\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_width<\/span>=<span class=\"hljs-string\">\"wrap_content\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_height<\/span>=<span class=\"hljs-string\">\"wrap_content\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginStart<\/span>=<span class=\"hljs-string\">\"160dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginTop<\/span>=<span class=\"hljs-string\">\"91dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginEnd<\/span>=<span class=\"hljs-string\">\"157dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginBottom<\/span>=<span class=\"hljs-string\">\"330dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:text<\/span>=<span class=\"hljs-string\">\"@string\/cancel_work\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintBottom_toBottomOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintEnd_toEndOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintStart_toStartOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintTop_toBottomOf<\/span>=<span class=\"hljs-string\">\"@+id\/go_to_next_screen_button\"<\/span> \/&gt;<\/span>\r\n\r\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">TextView<\/span>\r\n        <span class=\"hljs-attr\">android:id<\/span>=<span class=\"hljs-string\">\"@+id\/textView\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_width<\/span>=<span class=\"hljs-string\">\"wrap_content\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_height<\/span>=<span class=\"hljs-string\">\"wrap_content\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginStart<\/span>=<span class=\"hljs-string\">\"177dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginTop<\/span>=<span class=\"hljs-string\">\"36dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:layout_marginEnd<\/span>=<span class=\"hljs-string\">\"176dp\"<\/span>\r\n        <span class=\"hljs-attr\">android:text<\/span>=<span class=\"hljs-string\">\"@string\/screen_one\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintEnd_toEndOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintStart_toStartOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span>\r\n        <span class=\"hljs-attr\">app:layout_constraintTop_toTopOf<\/span>=<span class=\"hljs-string\">\"parent\"<\/span> \/&gt;<\/span>\r\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">androidx.constraintlayout.widget.ConstraintLayout<\/span>&gt;<\/span><\/span><\/pre>\n<p id=\"5f32\" class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\">So far, we have looked into the code and achieved the periodic work behavior using <em class=\"um\">OneTimeWorkRequest. <\/em>We can modify the logic according to our use cases.<\/p>\n<p class=\"pw-post-body-paragraph tq tr sk lk b ts tt ig tu tv tw ik tx ty tz ua ub uc ud ue uf ug uh ui uj uk kk fu\" data-selectable-paragraph=\"\"><em class=\"um\">During your development, if you find any other use case, please feel free to comment, and we can resolve the issues together.<\/p>\n<p><\/em>Read more:\u00a0 <a href=\"https:\/\/www.tothenew.com\/blog\/android-katha-onactivityresult-is-deprecated-now-what\/\">Android Katha: onActivityResult is Deprecated. Now What?<\/a><\/p>\n<div class=\"ap-custom-wrapper\"><\/div><!--ap-custom-wrapper-->","protected":false},"excerpt":{"rendered":"<p>During our development journey, we do face situations where we require to perform some periodic and background tasks. So, to do so, we have multiple ways, but if it comes to the best way to perform these types of tasks in the context of clean code and optimized device resources usages, then we need to [&hellip;]<\/p>\n","protected":false},"author":1476,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":436},"categories":[518],"tags":[5048],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/55895"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1476"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=55895"}],"version-history":[{"count":3,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/55895\/revisions"}],"predecessor-version":[{"id":55929,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/55895\/revisions\/55929"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=55895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=55895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=55895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}