آموزش WorkManager در اندروید
سلام دوستان عزیز در این سری از آموزش برنامه نویسی اندروید به آموزش WorkManager در اندروید می پردازیم از کلاس و کتابخانه Workmanager به منظور زمانبدی کار در اندروید استفاده می شود شاید در قدیم از کلاس Broascast برای این موارد استفاده می شد ولی در api های جدید باید از task scheduler بهینه سازی شده (optimize) استفاده کنیم نحوه کار با این کتابخانه بسیار سخت نیست پیاده سازی آن ساده و فوق العاده کاربردی است در ادامه درباره ی کتابخانه workmanager بیشتر توضیح خواهیم داد با ما همراه باشید.
WorkManager چیست ؟
جایگزینی برای کلاس Broadcast بوده که با Api های جدید و نسخه های جدید اندروید بهتر از قبل کار می کند و هرجور شده کار شما برای شما در background یا Foreground انجام میدهد.
ویژگی های کلاس WorkManager :
- این کلاس به صورت محدود و آگانه در هر صورت اجرا می شود – constraint-aware execution
- نیاز ندارد به صورت force اجرا شود و برنامه نویس فقط یکبار آن را برای تمامی گوشی های می نویسد – backward compatibility
- این کلاس دارای tasks query است به معنی که شما می توانید بررسی کنید کاری انجام شده است یا خیر – tasks query
- این کلاس از چرخه کار پشتیبانی می کند به این معنی که امکان enqueue کردن Task ها در هر لحظه وجود دارد. – task chaining
WorkManager چگونه کار می کند ؟
قبل از اینکه این کد مربوط به این کلاس رو توضیح بدیم کلاس های آن را کمی توضیح خواهیم داد 🙂
Worker
مشخص می کند که چه کار یا Task ی می خواهد اجرا شود. برای کار با این کلاس باید یک Abstract از آن Extend کنید و کد خود را بنویسید.
WorkRequest
شبیه به کلاس Worker است با این تفاوت که می توان به کلاس یکسری پارامتر نیز پاس داد.
خود Work Request به دو بخش تشکیل می شود :
- OneTimeWorkRequest : برای انجام کارهای غیر تکراری کاربرد دارد.
- PeriodicWorkRequest : برای انجام کارهای تکراری کاربرد دارد.
WorkManager
مدیریت مربوط به کلاس Worker ساخت شده را انجام میدهد.
WorkInfo
شامل اطلاعات مختلفی از task است مثلا task انجام شده است , pending است یا در حالت draft به سر می برد.
فلوچارت مربوط به workmanager را در ادامه می توانید ببینید.
برای اینکه از این کتابخانه استفاده کنید اول باید آن را به گریدل اضافه کنید.
1 | implementation "android.arch.work:work-runtime:1.0.0" |
پروژه را sync کنید.
در layout فقط یک دکمه و textivew قرار دارد که دکمه notification را ایجاد کرده و textview حالت مربوط به workmanager را نمایش خواهد داد.
پس در activity_main.xml کد های زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:gravity="center" android:text="Hello World!" android:textSize="18sp" app:layout_constraintBottom_toTopOf="@+id/button" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:background="@color/colorAccent" android:paddingLeft="8dp" android:paddingRight="8dp" android:text="Send Notification" android:textAllCaps="false" android:textColor="#fff" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> </android.support.constraint.ConstraintLayout> |
بعد از اینکه کدهای بالا را قرار دادید زمان این است که از کلاس Work یک Extend ایجاد کنیم تا بتوانیم از ویژگی های آن بهره ببریم.
یک کلاس به نام NotificationWorker ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package ir.programchi.work import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.app.NotificationCompat; import androidx.work.Data; import androidx.work.Worker; import androidx.work.WorkerParameters; /** * Author : JFP */ public class NotificationWorker extends Worker { private static final String WORK_RESULT = "work_result"; public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { Data taskData = getInputData(); String taskDataString = taskData.getString(MainActivity.MESSAGE_STATUS); showNotification("WorkManager", taskDataString != null ? taskDataString : "Message has been Sent"); Data outputData = new Data.Builder().putString(WORK_RESULT, "Jobs Finished").build(); return Result.success(outputData); } private void showNotification(String task, String desc) { NotificationManager manager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); String channelId = "task_channel"; String channelName = "task_name"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT); manager.createNotificationChannel(channel); } NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), channelId) .setContentTitle(task) .setContentText(desc) .setSmallIcon(R.mipmap.ic_launcher); manager.notify(1, builder.build()); } } |
کار این کلاس اینکه با استفاده از کلاس Workmanager یک notification برای ما ایجاد می کند.
خب بریم از این کلاس استفاده کنیم.
اول از همه یک instance از کلاس WorkManager میگیریم مثل زیر
1 | WorkManager mWorkManager = WorkManager.getInstance(); |
بعد از این کلاسی که ساختیم را از نوع OneTimeWorkRequest یا PeriodicWorkRequest تعریف می کنیم. (بالاتر این را توضیح دادیم )
1 | OneTimeWorkRequest mRequest = new OneTimeWorkRequest.Builder(NotificationWorker.class).build(); |
بعد از این کار باید کلاس ساخته شده را برای workmanager خود enqueue کنیم برای همین میام توی رویداد کلیک به صورت زیر می نویسیم.
1 2 3 4 5 6 | btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mWorkManager.enqueue(mRequest); } }); |
در ادامه کل کد مربطو به MainActivity.java را قرار می دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package ir.programchi.work; import android.arch.lifecycle.Observer; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.work.OneTimeWorkRequest; import androidx.work.WorkInfo; import androidx.work.WorkManager; public class MainActivity extends AppCompatActivity { public static final String MESSAGE_STATUS = "message_status"; TextView tvStatus; Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvStatus = findViewById(R.id.tvStatus); btnSend = findViewById(R.id.btnSend); final WorkManager mWorkManager = WorkManager.getInstance(); final OneTimeWorkRequest mRequest = new OneTimeWorkRequest.Builder(NotificationWorker.class).build(); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mWorkManager.enqueue(mRequest); } }); mWorkManager.getWorkInfoByIdLiveData(mRequest.getId()).observe(this, new Observer<WorkInfo>() { @Override public void onChanged(@Nullable WorkInfo workInfo) { if (workInfo != null) { WorkInfo.State state = workInfo.getState(); tvStatus.append(state.toString() + "\n"); } } }); } } |
این آموزش هم به پایان رسید.
موفق و پیروز باشید.