کارها را با WorkManager بخشی از Android Jetpack برنامه ریزی کنید.
WorkManager راه حل پیشنهادی برای کار مداوم است. زمانی که کار از طریق راهاندازی مجدد برنامه و راهاندازی مجدد سیستم برنامهریزی شده باقی میماند، کار مداوم است. از آنجایی که اکثر پردازش های پس زمینه به بهترین وجه از طریق کار مداوم انجام می شود، WorkManager API توصیه شده اولیه برای پردازش پس زمینه است.
انواع کار مداوم
WorkManager سه نوع کار مداوم را مدیریت می کند:
- فوری : کارهایی که باید فوراً شروع شوند و به زودی تکمیل شوند. ممکن است تسریع شود.
- Long Running : کارهایی که ممکن است طولانی تر، احتمالاً بیشتر از 10 دقیقه اجرا شوند.
- Deferrable : کارهای برنامه ریزی شده که در زمان دیگری شروع می شوند و می توانند به صورت دوره ای اجرا شوند.
شکل 1 چگونگی ارتباط انواع مختلف کار مداوم با یکدیگر را نشان می دهد.
به طور مشابه، جدول زیر انواع مختلف کار را نشان می دهد.
تایپ کنید | دوره ای | نحوه دسترسی |
---|---|---|
فوری | یک بار | OneTimeWorkRequest و Worker . برای کار سریع، |
دویدن طولانی | یک بار یا دوره ای | هر WorkRequest یا Worker . برای رسیدگی به اعلان setForeground() را در Worker فراخوانی کنید. |
قابل تعویق | یک بار یا دوره ای | PeriodicWorkRequest و Worker . |
برای اطلاعات بیشتر در مورد نحوه راه اندازی WorkManager، به راهنمای تعریف WorkRequests خود مراجعه کنید.
ویژگی ها
علاوه بر ارائه یک API ساده تر و سازگارتر، WorkManager چندین مزیت کلیدی دیگر نیز دارد:
محدودیت های کاری
با استفاده از محدودیتهای کاری، شرایط بهینه برای اجرای کار خود را به صورت اعلامی تعریف کنید. به عنوان مثال، فقط زمانی که دستگاه در یک شبکه بدون اندازه گیری قرار دارد، زمانی که دستگاه بیکار است یا زمانی که باتری کافی دارد، کار کنید.
برنامه ریزی قوی
WorkManager به شما اجازه می دهد تا با استفاده از پنجره های زمان بندی انعطاف پذیر ، کار را برای اجرای یک بار یا مکرر برنامه ریزی کنید. کار را میتوان برچسبگذاری و نامگذاری کرد و به شما امکان میدهد کارهای منحصربهفرد و قابل تعویض را برنامهریزی کنید و گروههای کار را با هم نظارت یا لغو کنید.
کارهای برنامه ریزی شده در یک پایگاه داده SQLite با مدیریت داخلی ذخیره می شود و WorkManager از تداوم این کار و برنامه ریزی مجدد در راه اندازی مجدد دستگاه مراقبت می کند.
علاوه بر این، WorkManager به ویژگیهای صرفهجویی در مصرف انرژی و بهترین روشها مانند حالت Doze پایبند است، بنابراین لازم نیست نگران آن باشید.
کار تسریع شده
می توانید از WorkManager برای برنامه ریزی کار فوری برای اجرا در پس زمینه استفاده کنید. برای کارهایی که برای کاربر مهم هستند و در عرض چند دقیقه کامل می شوند، باید از Work Expedited استفاده کنید.
خط مشی امتحان مجدد انعطاف پذیر
گاهی اوقات کار با شکست مواجه می شود. WorkManager خطمشیهای انعطافپذیری را برای امتحان مجدد ارائه میکند، از جمله یک خطمشی عقبنشینی نمایی قابل تنظیم.
زنجیر کاری
برای کارهای پیچیده مرتبط، وظایف کاری انفرادی را با استفاده از یک رابط بصری که به شما امکان می دهد کنترل کنید کدام قطعات به صورت متوالی و کدام قطعه به صورت موازی اجرا شوند را به هم متصل کنید .
کاتلین
val continuation = WorkManager.getInstance(context) .beginUniqueWork( Constants.IMAGE_MANIPULATION_WORK_NAME, ExistingWorkPolicy.REPLACE, OneTimeWorkRequest.from(CleanupWorker::class.java) ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java)) .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java)) .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java)) .then( if (save) { workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT) } else /* upload */ { workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT) } )
جاوا
WorkManager.getInstance(...) .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue();
برای هر کار کاری، می توانید داده های ورودی و خروجی آن کار را تعریف کنید . هنگامی که کار با یکدیگر زنجیره ای انجام می شود، WorkManager به طور خودکار داده های خروجی را از یک کار کاری به کار بعدی منتقل می کند.
قابلیت همکاری threading داخلی
WorkManager به طور یکپارچه با Coroutines و RxJava ادغام می شود و انعطاف پذیری برای وصل کردن API های ناهمزمان خود را فراهم می کند.
برای کار قابل اعتماد از WorkManager استفاده کنید
WorkManager برای کارهایی در نظر گرفته شده است که حتی اگر کاربر از صفحه خارج شود، برنامه خارج شود یا دستگاه راه اندازی مجدد شود، باید به طور قابل اعتماد اجرا شود . به عنوان مثال:
- ارسال گزارش یا تجزیه و تحلیل به سرویس های پشتیبان.
- همگام سازی دوره ای داده های برنامه با یک سرور.
WorkManager برای کارهای پسزمینه در فرآیند در نظر گرفته نشده است که اگر فرآیند برنامه از بین برود، میتوان با خیال راحت پایان داد. همچنین یک راه حل کلی برای همه کارهایی که نیاز به اجرای فوری دارند نیست. لطفاً راهنمای پردازش پسزمینه را مرور کنید تا ببینید کدام راهحل نیازهای شما را برآورده میکند.
ارتباط با سایر APIها
در حالی که کوروتین ها راه حل توصیه شده برای موارد استفاده خاص هستند، شما نباید از آنها برای کارهای مداوم استفاده کنید. توجه به این نکته مهم است که کوروتین ها یک چارچوب همزمانی هستند، در حالی که WorkManager یک کتابخانه برای کار مداوم است. به همین ترتیب، شما باید از AlarmManager فقط برای ساعت یا تقویم استفاده کنید.
API | توصیه شده برای | ارتباط با WorkManager |
---|---|---|
کوروتین ها | همه کارهای ناهمزمان که نیازی به ماندگاری ندارند. | کوروتین ها ابزار استاندارد ترک رشته اصلی در کاتلین هستند. با این حال، پس از بسته شدن برنامه، حافظه را ترک می کنند. برای کار مداوم، از WorkManager استفاده کنید. |
مدیر آلارم | فقط زنگ هشدار | برخلاف WorkManager، AlarmManager دستگاه را از حالت Doze بیدار می کند. بنابراین از نظر مدیریت قدرت و منابع کارآمد نیست. فقط برای هشدارهای دقیق یا اعلانهایی مانند رویدادهای تقویم از آن استفاده کنید - نه کار پسزمینه. |
جایگزینی API های منسوخ شده
WorkManager API جایگزین توصیهشده برای همه APIهای برنامهریزی پسزمینه Android از جمله FirebaseJobDispatcher ، GcmNetworkManager و Job Scheduler است.
شروع کردن
برای شروع استفاده از WorkManager در برنامه خود ، راهنمای شروع کار را بررسی کنید.
منابع اضافی
برای اطلاعات بیشتر درباره WorkManager
، به منابع زیر مراجعه کنید.
نمونه ها
ویدیوها
- Workmanager - MAD Skills ، مجموعه ویدیویی
- کار با WorkManager ، از اجلاس برنامه نویس اندروید 2018
- WorkManager: فراتر از اصول اولیه ، از نشست برنامه نویس اندروید 2019
وبلاگ ها
{% کلمه به کلمه %}برای شما توصیه می شود
- توجه: متن پیوند زمانی که جاوا اسکریپت خاموش است نمایش داده می شود
- راه اندازی برنامه
کارها را با WorkManager بخشی از Android Jetpack برنامه ریزی کنید.
WorkManager راه حل پیشنهادی برای کار مداوم است. زمانی که کار از طریق راهاندازی مجدد برنامه و راهاندازی مجدد سیستم برنامهریزی شده باقی میماند، کار مداوم است. از آنجایی که اکثر پردازش های پس زمینه به بهترین وجه از طریق کار مداوم انجام می شود، WorkManager API توصیه شده اولیه برای پردازش پس زمینه است.
انواع کار مداوم
WorkManager سه نوع کار مداوم را مدیریت می کند:
- فوری : کارهایی که باید فوراً شروع شوند و به زودی تکمیل شوند. ممکن است تسریع شود.
- Long Running : کارهایی که ممکن است طولانی تر، احتمالاً بیشتر از 10 دقیقه اجرا شوند.
- Deferrable : کارهای برنامه ریزی شده که در زمان دیگری شروع می شوند و می توانند به صورت دوره ای اجرا شوند.
شکل 1 چگونگی ارتباط انواع مختلف کار مداوم با یکدیگر را نشان می دهد.
به طور مشابه، جدول زیر انواع مختلف کار را نشان می دهد.
تایپ کنید | دوره ای | نحوه دسترسی |
---|---|---|
فوری | یک بار | OneTimeWorkRequest و Worker . برای کار سریع، |
دویدن طولانی | یک بار یا دوره ای | هر WorkRequest یا Worker . برای رسیدگی به اعلان setForeground() را در Worker فراخوانی کنید. |
قابل تعویق | یک بار یا دوره ای | PeriodicWorkRequest و Worker . |
برای اطلاعات بیشتر در مورد نحوه راه اندازی WorkManager، به راهنمای تعریف WorkRequests خود مراجعه کنید.
ویژگی ها
علاوه بر ارائه یک API ساده تر و سازگارتر، WorkManager چندین مزیت کلیدی دیگر نیز دارد:
محدودیت های کاری
با استفاده از محدودیتهای کاری، شرایط بهینه برای اجرای کار خود را به صورت شفاف تعریف کنید. برای مثال، فقط زمانی که دستگاه در یک شبکه بدون اندازهگیری است، زمانی که دستگاه بیحرکت است، یا زمانی که باتری کافی دارد، کار کنید.
برنامه ریزی قوی
WorkManager به شما اجازه می دهد تا با استفاده از پنجره های زمان بندی انعطاف پذیر ، کار را برای اجرای یک بار یا مکرر برنامه ریزی کنید. کار را میتوان برچسبگذاری و نامگذاری کرد و به شما امکان میدهد کارهای منحصربهفرد و قابل تعویض را برنامهریزی کنید و گروههای کار را با هم نظارت یا لغو کنید.
کارهای برنامه ریزی شده در یک پایگاه داده SQLite با مدیریت داخلی ذخیره می شود و WorkManager از تداوم این کار و برنامه ریزی مجدد در راه اندازی مجدد دستگاه مراقبت می کند.
علاوه بر این، WorkManager به ویژگیهای صرفهجویی در مصرف انرژی و بهترین روشها مانند حالت Doze پایبند است، بنابراین لازم نیست نگران آن باشید.
کار تسریع شده
می توانید از WorkManager برای برنامه ریزی کار فوری برای اجرا در پس زمینه استفاده کنید. برای کارهایی که برای کاربر مهم هستند و در عرض چند دقیقه کامل می شوند، باید از Work Expedited استفاده کنید.
خط مشی امتحان مجدد انعطاف پذیر
گاهی اوقات کار با شکست مواجه می شود. WorkManager خطمشیهای انعطافپذیری را برای امتحان مجدد ارائه میدهد، از جمله یک خطمشی عقبنشینی نمایی قابل تنظیم.
زنجیر کاری
برای کارهای پیچیده مرتبط، وظایف کاری انفرادی را با استفاده از یک رابط بصری که به شما امکان می دهد کنترل کنید کدام قطعات به صورت متوالی و کدام قطعه به صورت موازی اجرا شوند را به هم متصل کنید .
کاتلین
val continuation = WorkManager.getInstance(context) .beginUniqueWork( Constants.IMAGE_MANIPULATION_WORK_NAME, ExistingWorkPolicy.REPLACE, OneTimeWorkRequest.from(CleanupWorker::class.java) ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java)) .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java)) .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java)) .then( if (save) { workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT) } else /* upload */ { workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT) } )
جاوا
WorkManager.getInstance(...) .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue();
برای هر کار کاری، می توانید داده های ورودی و خروجی آن کار را تعریف کنید . هنگامی که کار با یکدیگر زنجیره ای انجام می شود، WorkManager به طور خودکار داده های خروجی را از یک کار کاری به کار بعدی منتقل می کند.
قابلیت همکاری threading داخلی
WorkManager به طور یکپارچه با Coroutines و RxJava ادغام می شود و انعطاف پذیری برای وصل کردن API های ناهمزمان خود را فراهم می کند.
برای کار قابل اعتماد از WorkManager استفاده کنید
WorkManager برای کارهایی در نظر گرفته شده است که حتی اگر کاربر از صفحه خارج شود، برنامه خارج شود یا دستگاه راه اندازی مجدد شود، باید به طور قابل اعتماد اجرا شود . به عنوان مثال:
- ارسال گزارش یا تجزیه و تحلیل به سرویس های پشتیبان.
- همگام سازی دوره ای داده های برنامه با یک سرور.
WorkManager برای کارهای پسزمینه در حین فرآیند در نظر گرفته نشده است که اگر فرآیند برنامه از بین برود، با خیال راحت میتوان آن را خاتمه داد. همچنین یک راه حل کلی برای همه کارهایی که نیاز به اجرای فوری دارند نیست. لطفاً راهنمای پردازش پس زمینه را مرور کنید تا ببینید کدام راه حل نیازهای شما را برآورده می کند.
ارتباط با سایر APIها
در حالی که کوروتین ها راه حل توصیه شده برای موارد استفاده خاص هستند، شما نباید از آنها برای کارهای مداوم استفاده کنید. توجه به این نکته مهم است که کوروتین ها یک چارچوب همزمانی هستند، در حالی که WorkManager یک کتابخانه برای کار مداوم است. به همین ترتیب، شما باید از AlarmManager فقط برای ساعت یا تقویم استفاده کنید.
API | توصیه شده برای | ارتباط با WorkManager |
---|---|---|
کوروتین ها | همه کارهای ناهمزمان که نیازی به ماندگاری ندارند. | کوروتین ها ابزار استاندارد ترک رشته اصلی در کاتلین هستند. با این حال، پس از بسته شدن برنامه، حافظه را ترک می کنند. برای کار مداوم، از WorkManager استفاده کنید. |
مدیر آلارم | فقط هشدارها | برخلاف WorkManager، AlarmManager دستگاه را از حالت Doze بیدار می کند. بنابراین از نظر مدیریت قدرت و منابع کارآمد نیست. فقط برای هشدارهای دقیق یا اعلانهایی مانند رویدادهای تقویم از آن استفاده کنید - نه کار پسزمینه. |
جایگزینی API های منسوخ شده
WorkManager API جایگزین توصیهشده برای همه APIهای برنامهریزی پسزمینه Android از جمله FirebaseJobDispatcher ، GcmNetworkManager و Job Scheduler است.
شروع کردن
برای شروع استفاده از WorkManager در برنامه خود ، راهنمای شروع کار را بررسی کنید.
منابع اضافی
برای اطلاعات بیشتر درباره WorkManager
، به منابع زیر مراجعه کنید.
نمونه ها
ویدیوها
- Workmanager - MAD Skills ، مجموعه ویدیویی
- کار با WorkManager ، از اجلاس برنامه نویس اندروید 2018
- WorkManager: فراتر از اصول اولیه ، از نشست برنامه نویس اندروید 2019
وبلاگ ها
{% کلمه به کلمه %}برای شما توصیه می شود
- توجه: متن پیوند زمانی که جاوا اسکریپت خاموش است نمایش داده می شود
- راه اندازی برنامه
کارها را با WorkManager بخشی از Android Jetpack برنامه ریزی کنید.
WorkManager راه حل پیشنهادی برای کار مداوم است. زمانی که کار از طریق راهاندازی مجدد برنامه و راهاندازی مجدد سیستم برنامهریزی شده باقی میماند، کار مداوم است. از آنجایی که اکثر پردازش های پس زمینه به بهترین وجه از طریق کار مداوم انجام می شود، WorkManager API توصیه شده اولیه برای پردازش پس زمینه است.
انواع کار مداوم
WorkManager سه نوع کار مداوم را مدیریت می کند:
- فوری : کارهایی که باید فوراً شروع شوند و به زودی تکمیل شوند. ممکن است تسریع شود.
- Long Running : کارهایی که ممکن است طولانی تر، احتمالاً بیش از 10 دقیقه اجرا شوند.
- Deferrable : کارهای برنامه ریزی شده که در زمان بعدی شروع می شوند و می توانند به صورت دوره ای اجرا شوند.
شکل 1 چگونگی ارتباط انواع مختلف کار مداوم با یکدیگر را نشان می دهد.
به طور مشابه، جدول زیر انواع مختلف کار را نشان می دهد.
تایپ کنید | دوره ای | نحوه دسترسی |
---|---|---|
فوری | یک بار | OneTimeWorkRequest و Worker . برای کار سریع، |
دویدن طولانی | یک بار یا دوره ای | هر WorkRequest یا Worker . برای رسیدگی به اعلان setForeground() را در Worker فراخوانی کنید. |
قابل تعویق | یک بار یا دوره ای | PeriodicWorkRequest و Worker . |
برای اطلاعات بیشتر در مورد نحوه راه اندازی WorkManager، به راهنمای تعریف WorkRequests خود مراجعه کنید.
ویژگی ها
علاوه بر ارائه یک API ساده تر و سازگارتر، WorkManager چندین مزیت کلیدی دیگر نیز دارد:
محدودیت های کاری
با استفاده از محدودیتهای کاری، شرایط بهینه برای اجرای کار خود را به صورت اعلامی تعریف کنید. به عنوان مثال، فقط زمانی که دستگاه در یک شبکه بدون اندازه گیری قرار دارد، زمانی که دستگاه بیکار است یا زمانی که باتری کافی دارد، کار کنید.
برنامه ریزی قوی
WorkManager به شما اجازه می دهد تا با استفاده از پنجره های زمان بندی انعطاف پذیر ، کار را برای اجرای یک بار یا مکرر برنامه ریزی کنید. کار را میتوان برچسبگذاری و نامگذاری کرد و به شما امکان میدهد کارهای منحصربهفرد و قابل تعویض را برنامهریزی کنید و گروههای کار را با هم نظارت یا لغو کنید.
کارهای برنامه ریزی شده در یک پایگاه داده SQLite با مدیریت داخلی ذخیره می شود و WorkManager از تداوم این کار و برنامه ریزی مجدد در راه اندازی مجدد دستگاه مراقبت می کند.
علاوه بر این، WorkManager به ویژگیهای صرفهجویی در مصرف انرژی و بهترین روشها مانند حالت Doze پایبند است، بنابراین لازم نیست نگران آن باشید.
کار تسریع شده
می توانید از WorkManager برای برنامه ریزی کار فوری برای اجرا در پس زمینه استفاده کنید. برای کارهایی که برای کاربر مهم هستند و در عرض چند دقیقه تکمیل میشوند، باید از Work Expedited استفاده کنید.
خط مشی امتحان مجدد انعطاف پذیر
گاهی اوقات کار با شکست مواجه می شود. WorkManager خطمشیهای انعطافپذیری را برای امتحان مجدد ارائه میدهد، از جمله یک خطمشی عقبنشینی نمایی قابل تنظیم.
زنجیر کاری
برای کارهای پیچیده مرتبط، وظایف کاری انفرادی را با استفاده از یک رابط بصری که به شما امکان می دهد کنترل کنید کدام قطعات به صورت متوالی و کدام قطعه به صورت موازی اجرا شوند را به هم متصل کنید .
کاتلین
val continuation = WorkManager.getInstance(context) .beginUniqueWork( Constants.IMAGE_MANIPULATION_WORK_NAME, ExistingWorkPolicy.REPLACE, OneTimeWorkRequest.from(CleanupWorker::class.java) ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java)) .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java)) .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java)) .then( if (save) { workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT) } else /* upload */ { workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT) } )
جاوا
WorkManager.getInstance(...) .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue();
برای هر کار کاری، می توانید داده های ورودی و خروجی آن کار را تعریف کنید . هنگامی که کار با یکدیگر زنجیره ای انجام می شود، WorkManager به طور خودکار داده های خروجی را از یک کار کاری به کار بعدی منتقل می کند.
قابلیت همکاری threading داخلی
WorkManager به طور یکپارچه با Coroutines و RxJava ادغام می شود و انعطاف پذیری برای وصل کردن API های ناهمزمان خود را فراهم می کند.
برای کار قابل اعتماد از WorkManager استفاده کنید
WorkManager برای کارهایی در نظر گرفته شده است که حتی اگر کاربر از صفحه خارج شود، برنامه خارج شود یا دستگاه راه اندازی مجدد شود، باید به طور قابل اعتماد اجرا شود . به عنوان مثال:
- ارسال گزارش یا تجزیه و تحلیل به سرویس های پشتیبان.
- همگام سازی دوره ای داده های برنامه با یک سرور.
WorkManager برای کارهای پسزمینه در فرآیند در نظر گرفته نشده است که اگر فرآیند برنامه از بین برود، میتوان با خیال راحت پایان داد. همچنین یک راه حل کلی برای همه کارهایی که نیاز به اجرای فوری دارند نیست. لطفاً راهنمای پردازش پس زمینه را مرور کنید تا ببینید کدام راه حل نیازهای شما را برآورده می کند.
ارتباط با سایر APIها
در حالی که کوروتین ها راه حل توصیه شده برای موارد استفاده خاص هستند، شما نباید از آنها برای کارهای مداوم استفاده کنید. توجه به این نکته مهم است که کوروتین ها یک چارچوب همزمانی هستند، در حالی که WorkManager یک کتابخانه برای کار مداوم است. به همین ترتیب، شما باید از AlarmManager فقط برای ساعت یا تقویم استفاده کنید.
API | توصیه شده برای | ارتباط با WorkManager |
---|---|---|
کوروتین ها | همه کارهای ناهمزمان که نیازی به ماندگاری ندارند. | کوروتین ها ابزار استاندارد ترک رشته اصلی در کاتلین هستند. با این حال، پس از بسته شدن برنامه، حافظه را ترک می کنند. برای کار مداوم، از WorkManager استفاده کنید. |
مدیر آلارم | فقط زنگ هشدار | برخلاف WorkManager، AlarmManager دستگاه را از حالت Doze بیدار می کند. بنابراین از نظر مدیریت قدرت و منابع کارآمد نیست. فقط برای هشدارهای دقیق یا اعلانهایی مانند رویدادهای تقویم از آن استفاده کنید - نه کار پسزمینه. |
جایگزینی API های منسوخ شده
WorkManager API جایگزین توصیهشده برای همه APIهای برنامهریزی پسزمینه Android از جمله FirebaseJobDispatcher ، GcmNetworkManager و Job Scheduler است.
شروع کردن
برای شروع استفاده از WorkManager در برنامه خود ، راهنمای شروع کار را بررسی کنید.
منابع اضافی
برای اطلاعات بیشتر درباره WorkManager
، به منابع زیر مراجعه کنید.
نمونه ها
ویدیوها
- Workmanager - MAD Skills ، مجموعه ویدیویی
- کار با WorkManager ، از اجلاس برنامه نویس اندروید 2018
- WorkManager: فراتر از اصول اولیه ، از نشست برنامه نویس اندروید 2019
وبلاگ ها
{% کلمه به کلمه %}برای شما توصیه می شود
- توجه: متن پیوند زمانی که جاوا اسکریپت خاموش است نمایش داده می شود
- راه اندازی برنامه