<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های جاوید ستار | Javid Sattar</title>
        <link>https://virgool.io/feed/@javiddeveloper</link>
        <description>برنامه نویس اندروید</description>
        <language>fa</language>
        <pubDate>2026-04-15 06:04:09</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1788548/avatar/WHlGFd.png?height=120&amp;width=120</url>
            <title>جاوید ستار | Javid Sattar</title>
            <link>https://virgool.io/@javiddeveloper</link>
        </image>

                    <item>
                <title>۷ ویژگی قدرتمند کاتلین که توسعه‌دهندگان حرفه‌ای استفاده می‌کنند</title>
                <link>https://virgool.io/@javiddeveloper/%DB%B7-%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%82%D8%AF%D8%B1%D8%AA%D9%85%D9%86%D8%AF-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DA%A9%D9%87-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C-%DA%A9%D9%86%D9%86%D8%AF-vs4g2cef1d8n</link>
                <description>مقدمهکاتلین یک زبان قدرتمند و مدرن است که بسیاری از توسعه‌دهندگان اندروید از آن استفاده می‌کنند. اما آیا واقعاً از تمام قابلیت‌های آن بهره می‌برید؟ بسیاری از برنامه‌نویسان فقط از بخش‌های رایج زبان استفاده می‌کنند و برخی از ویژگی‌های قدرتمند آن را نادیده می‌گیرند. در این مقاله، ۷ ویژگی کم‌تر شناخته‌شده اما بسیار کاربردی کاتلین را معرفی می‌کنیم که می‌توانند کد شما را تمیزتر، کارآمدتر و خواناتر کنند.۱. runCatching {} - مدیریت خطا به روش تمیزبه جای استفاده از بلوک‌های try-catch می‌توان از runCatching {} استفاده کرد که خوانایی کد را افزایش می‌دهد:🔹 این روش باعث جداسازی منطق موفقیت و شکست شده و کد را خواناتر می‌کند. 🔹 توجه داشته باشید که runCatching حالتCancellationException را مدیریت نمی‌کند.۲. Sealed Interfaces - ساختاردهی قوی‌تر به انواع داده‌هادر sealed interface مانند sealed class عمل می‌کند اما می‌تواند در چندین فایل استفاده شود. این ویژگی برای مدیریت وضعیت‌های مختلف در برنامه بسیار مفید است:🔹 مناسب برای مدل‌سازی Stateهای مختلف در UI 🔹 امکان گسترش در فایل‌های مختلف برخلاف sealed class۳. Value Class - کاهش سربار حافظهکلاسهای value class یک راه عالی برای ایجاد wrapperهای سبک بدون هزینه اضافی تخصیص حافظه است:🔹 در مقایسه با data class بهینه‌تر است زیرا سربار(Over head) اضافی ندارد. 🔹 در مواردی مانند شناسه‌های کاربران یا مقادیر پولی کاربرد دارد.۴. buildList {} و buildMap {} - ساختارهای داده‌ای امن‌تربه جای استفاده از لیست‌ها و مپ‌های قابل تغییر، از buildList {} و buildMap {} برای ایجاد ساختارهای داده‌ای غیرقابل تغییر استفاده کنید:🔹 مانع تغییرات ناخواسته در داده‌ها می‌شود. 🔹 خوانایی و قابلیت نگهداری کد را افزایش می‌دهد.۵. takeIf {} و takeUnless {} - تخصیص شرطی در یک خطبا این ویژگی‌ها می‌توانید مقدار متغیرها را بر اساس شرطی خاص، در یک خط تعیین کنید:🔹 جایگزین مناسبی برای if و else در تخصیص مقدار 🔹 افزایش خوانایی کد۶. Modifier.composed در Jetpack Composeدر Jetpack Compose، Modifier.composed {} برای ایجاد Modifierهای سفارشی استفاده می‌شود. اما توجه داشته باشید که گوگل پیشنهاد می‌کند از Modifier.Node استفاده کنید:🔹 کاهش recompositions های غیرضروری 🔹 عملکرد بهتری در UI دارد ۷. iterator() برای ایجاد حلقه‌های سفارشیبا پیاده‌سازی تابع iterator() در کلاس خود، می‌توانید از forEach به روشی طبیعی‌تر استفاده کنید:🔹 مناسب برای ایجاد انواع داده‌های سفارشی با قابلیت پیمایش 🔹 خوانایی کد را افزایش می‌دهدنتیجه‌گیریبا استفاده از این ۷ ویژگی کمتر شناخته‌شده در کاتلین، می‌توانید کدی تمیزتر، امن‌تر و خواناتر بنویسید. این قابلیت‌ها به شما کمک می‌کنند که حرفه‌ای‌تر برنامه‌نویسی کنید.✅ ابتدا یکی از این ویژگی‌ها را در پروژه‌های خود پیاده‌سازی کنید. ✅ کم‌کم آن‌ها را به روال کدنویسی روزانه خود اضافه کنید. ✅ بهبود خوانایی و کارایی کد را مشاهده خواهید کرد!هدفم از نوشتن این مقاله معرفی ۷ ویژگی قدرتمند کاتلین که توسعه‌دهندگان حرفه‌ای استفاده می‌کنند بود.منبع : proandroiddev.com/kotlin-secrets-7ممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sat, 08 Mar 2025 11:21:30 +0330</pubDate>
            </item>
                    <item>
                <title>اصل DRY در برنامه‌نویسی، چگونه از تکرار کد جلوگیری کنیم</title>
                <link>https://virgool.io/@javiddeveloper/%D8%A7%D8%B5%D9%84-dry-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A7%D8%B2-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%DA%A9%D8%AF-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-qkza1hbdulqk</link>
                <description>اصل DRY یا &quot;Don&#x27;t Repeat Yourself&quot; یکی از اصول مهم در برنامه‌نویسی است که توسط Andy Hunt و Dave Thomas در کتاب The Pragmatic Programmer معرفی شد. این اصل بیان می‌کند که &quot;هر دانش یا منطقی در سیستم باید یک نمایش یکتا و غیر مبهم داشته باشد&quot;. در این مقاله، به بررسی نحوه پیاده‌سازی این اصل در برنامه‌نویسی اندروید می‌پردازیم.چرا DRY مهم است؟کاهش خطاهای احتمالی در کدافزایش قابلیت نگهداریسهولت در اعمال تغییراتکاهش حجم کدافزایش خوانایی و درک بهتر کدتکنیک‌های پیاده‌سازی DRY در اندروید1. استفاده از Extension Functionsیکی از قدرتمندترین ابزارها در کاتلین برای رعایت اصل DRY، Extension Functions هستند:2. استفاده از Base Classesایجاد کلاس‌های پایه برای اکتیویتی‌ها و فرگمنت‌ها:6. استفاده از Sealed Class برای State Managementمدیریت وضعیت‌های مختلف UI با استفاده از Sealed Class:نکات مهم در پیاده‌سازی DRYتعادل در استخراج کد: همیشه استخراج کد تکراری بهترین راه حل نیست. گاهی اوقات تکرار کمی بهتر از انتزاع نادرست است.توجه به Context: قبل از استخراج کد تکراری، مطمئن شوید که واقعاً در یک context مشابه استفاده می‌شوند.قابلیت تست: اطمینان حاصل کنید که کد استخراج شده همچنان قابل تست باشد.مستندسازی: کد استخراج شده را به خوبی مستند کنید تا سایر توسعه‌دهندگان بتوانند به راحتی از آن استفاده کنند.نتیجه‌گیریپیاده‌سازی اصل DRY در اندروید می‌تواند به طور قابل توجهی کیفیت کد را افزایش دهد و نگهداری آن را آسان‌تر کند. با استفاده از ابزارهایی که در این مقاله معرفی شدند، می‌توانید کد تمیزتر و قابل نگهداری‌تری بنویسید.هدفم از نوشتن این مقاله معرفی و استفاده اصل DRY و نحوه به کارگیری آنها با مثال های اندرویدی بود.ممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 27 Oct 2024 12:51:18 +0330</pubDate>
            </item>
                    <item>
                <title>مسیر موفقیت در برنامه‌نویسی اندروید</title>
                <link>https://virgool.io/codenevis/%D9%85%D8%B3%DB%8C%D8%B1-%D9%85%D9%88%D9%81%D9%82%DB%8C%D8%AA-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-rzl69gamfaw4</link>
                <description>سلام دوستان! امروز می‌خوام تجربیات 6 ساله‌م رو در حوزه برنامه‌نویسی اندروید با شما به اشتراک بذارم. اگه تازه شروع کردید یا می‌خواید وارد این حوزه بشید، این مقاله برای شماست.مسیر یادگیریمبانی برنامه‌نویسی: اول از همه، Java یا Kotlin رو یاد بگیرید. این‌ها پایه کار شماست. سعی کنید مفاهیم اساسی مثل متغیرها، حلقه‌ها، شرط‌ها و توابع رو خوب یاد بگیرید. برای شروع، پروژه‌های کوچیک مثل ماشین حساب یا بازی حدس عدد بسازید.مهارت‌های کلیدیحالا که پایه رو یاد گرفتید، وقت مهارت‌های پیشرفته‌تره:ابزارهای Coroutines و RxJava: این‌ها برای مدیریت کارهای همزمان عالی‌ن. مثلاً وقتی می‌خواید داده رو از سرور بگیرید بدون اینکه برنامه هنگ کنه. Coroutines ابزار جدیدتر و ساده‌تره، در حالی که RxJava قدرتمندتر و پیچیده‌تره. هر دو رو یاد بگیرید تا بتونید بسته به نیاز پروژه انتخاب کنید.یادگیری Design Patterns: الگوهای طراحی کمک می‌کنن مشکلات رایج رو با روش‌های استاندارد حل کنید. مثلاً الگوی Singleton برای ایجاد یک نمونه واحد از یک کلاس، یا الگوی Observer برای اعلان تغییرات. این الگوها رو یاد بگیرید و سعی کنید در پروژه‌هاتون ازشون استفاده کنید.بهینه‌سازی عملکرد: یاد بگیرید چطور برنامه‌تون رو سریع‌تر و کم‌مصرف‌تر کنید. از ابزارهای پروفایلینگ استفاده کنید، نشت حافظه رو پیدا و رفع کنید، و از الگوریتم‌های بهینه استفاده کنید. سعی کنید عملیات سنگین رو در thread‌های جداگانه انجام بدید.توجه به UI/UX: ظاهر برنامه خیلی مهمه. سعی کنید اصول طراحی رابط کاربری رو یاد بگیرید. با Material Design آشنا بشید و سعی کنید اصول اون رو رعایت کنید. انیمیشن‌های ساده ولی جذاب به برنامه‌تون اضافه کنید و همیشه به فکر تجربه کاربری باشید.ورود به بازار کارخب، حالا چطور شروع به کار کنیم؟نمونه کار بسازید: چند تا اپ کوچیک بسازید و توی Google Play بذارید. این بهترین رزومه‌ست. سعی کنید اپ‌هاتون متنوع باشن. مثلاً یه اپ ساده مدیریت وظایف، یه اپ آب و هوا، یا حتی یه بازی ساده. این نشون میده که شما می‌تونید ایده‌هاتون رو عملی کنید.پروژه‌های متن‌باز: توی GitHub پروژه‌های جالب پیدا کنید و مشارکت کنید. هم یاد می‌گیرید، هم دیده می‌شید. این کار نه تنها مهارت‌های فنی شما رو بهبود میده، بلکه نشون میده که می‌تونید با دیگران همکاری کنید و کد دیگران رو بخونید و بفهمید.فریلنسینگ: از سایت‌های فریلنسری شروع کنید. پروژه‌های کوچیک بردارید و کم کم تجربه کسب کنید. این کار به شما کمک می‌کنه با چالش‌های واقعی روبرو بشید و یاد بگیرید چطور با مشتری‌ها کار کنید.توسعه مداومیادگیری هیچوقت تموم نمیشه:به‌روز بمونید: دنیای تکنولوژی سریع تغییر می‌کنه. همیشه در حال یادگیری باشید. بلاگ‌های تخصصی رو دنبال کنید، ویدیوهای آموزشی ببینید و سعی کنید هر ماه حداقل یک تکنولوژی یا ابزار جدید یاد بگیرید.کنفرانس‌ها و Meetup‌ها: شرکت کنید، ارتباط بگیرید، یاد بگیرید. این رویدادها فرصت خوبی برای آشنایی با افراد هم‌رشته و یادگیری از تجربیات اونهاست. سعی کنید فعال باشید و سوال بپرسید.نکات حرفه‌ایو در آخر، چند تا نکته طلایی:کد تمیز بنویسید: کدی بنویسید که بقیه هم بتونن بخونن و بفهمن. از نام‌گذاری‌های معنادار استفاده کنید، توابع رو کوچک و تک‌منظوره نگه دارید و کامنت‌های مفید بنویسید. یادتون باشه که شما فقط برای کامپایلر کد نمی‌نویسید، بلکه برای همکارانتون هم می‌نویسید.تست‌نویسی: تست نوشتن رو یاد بگیرید. کیفیت کارتون رو بالا می‌بره. با JUnit شروع کنید و یاد بگیرید چطور تست‌های واحد بنویسید. بعد سراغ تست‌های یکپارچگی و UI برید. تست‌نویسی نه تنها به شما اطمینان میده که کدتون درست کار می‌کنه، بلکه به عنوان یک مستند زنده هم عمل می‌کنه.کار تیمی: یاد بگیرید چطور توی تیم کار کنید. ارتباط خوب خیلی مهمه. از ابزارهای مدیریت پروژه مثل Jira یا Trello استفاده کنید. یاد بگیرید چطور کدتون رو review کنید و از دیگران هم بخواید کد شما رو review کنن. این کار باعث میشه همه از هم یاد بگیرن و کیفیت کد بالا بره.یادتون باشه، برنامه‌نویسی یه سفره. عجله نکنید، لذت ببرید و هر روز یه چیز جدید یاد بگیرید. موفق باشید!ممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 07 Jul 2024 14:57:39 +0330</pubDate>
            </item>
                    <item>
                <title>امنیت در برنامه‌نویسی اندروید</title>
                <link>https://virgool.io/@javiddeveloper/%D8%A7%D9%85%D9%86%DB%8C%D8%AA-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-fdf0tvzbiebh</link>
                <description>امنیت اپلیکیشن‌های اندروید بسیار مهم است. با افزایش تهدیدات امنیتی و نگرانی‌های کاربران درباره حفظ حریم خصوصی، توسعه‌دهندگان اندروید باید امنیت را در اولویت قرار دهند. این مقاله به بررسی بهترین روش‌های امنیتی در برنامه‌نویسی اندروید با تمرکز بر زبان کاتلین می‌پردازد.رمزنگاری داده‌هاداده‌های مهم مثل رمزهای عبور را قبل از ذخیره رمزنگاری کنید. Android Keystore برای مدیریت کلیدهای رمزنگاری مناسب است.مثال کاربردی: رمزنگاری رمز عبور کاربر قبل از ذخیره در SharedPreferences یا DataStore ابتدا یک کلاس EncryptionUtils ایجاد میکنیم و مقادیر زیر را در آن تعریف میکنیمو سپس فانکشن های لازم برای رمزنگاری و رمزگشایی داده را نیز به کلاس اضافه میکنیمو بصورت زیر از این کلاس برای رمزنگاری و رمزگشایی استفاده میکنیماگر برخی از موراد رو متوجه نشدین  پیشنها میکنم در مورد keyStore و روشهای رمزنگاری داده ها حتما مطالعه کنیدامنیت شبکهبرای ارتباطات شبکه از HTTPS استفاده کنید. SSL Pinning هم می‌تواند امنیت را بیشتر کند.مثال : استفاده از OkHttp با SSL Pinning:در این مثال، یک CertificatePinner ایجاد می‌کنیم که اطمینان می‌دهد فقط با سرور مورد نظر ارتباط برقرار می‌شود. سپس از OkHttp برای ارسال درخواست HTTPS استفاده می‌کنیم. این روش از حملات man-in-the-middle جلوگیری می‌کند.جلوگیری از تزریق کدورودی‌های کاربر را همیشه بررسی و پاکسازی کنید. در کار با SQL، از Prepared Statements استفاده کنید.مثال : استفاده از Room برای جلوگیری از SQL Injection:دیتابیس Room به طور خودکار از Prepared Statements استفاده می‌کند، که خطر SQL Injection را کم می‌کند. در این مثال، حتی اگر کاربر سعی کند کد SQL تزریق کند، Room آن را به عنوان متن ساده در نظر می‌گیرد و با کنترلی که ما قرار دادیم دسترسی غیرمجاز صورت نمی گیرد.همانطور که در بالاتر بررسی کردیم میتوانید قبل از ذخیره داده آن را رمز نگاری کنید، حتی در دیتابیس هم میتوانید این کار را انجام دهید ولی اگر تعداد داده های شما زیاد هستند ترجیحا اینکار را انجام ندهید!! چون عملیات رمزنگاری و رمزگشایی پروسه های زمان بر و پیچیده ای هستند.مدیریت مجوزهامجوزها در اندروید نقش مهمی در حفظ حریم خصوصی کاربران دارند. همیشه فقط مجوزهای ضروری را درخواست کنید و در زمان مناسب این کار را انجام دهید. برای مثال، اگر اپلیکیشن شما نیاز به دسترسی دوربین دارد بدین شکل عمل کنید ابتدا بررسی می‌کنیم آیا مجوز دوربین وجود دارد یا خیر. اگر نداشته باشیم، آن را درخواست می‌کنیم. سپس در متد بازگشتی بدین شکل نتیجه را بررسی می‌کنیم. اگر کاربر مجوز را داد، دوربین را باز می‌کنیم، در غیر این صورت توضیحی درباره اهمیت این مجوز نمایش می‌دهیم.سعی کنید همیشه برای کاربر قبل از گرفتن دسترسی توضیح دهید که چرا به آن دسترسی نیاز دارید،می توانید از دیالوگ ها و snackBar  استفاده کنید.نتیجه‌گیریامنیت در توسعه اپلیکیشن‌های اندروید یک فرآیند مداوم است. با استفاده از روش‌های امنیتی که در این مقاله بررسی شد، می‌توانید امنیت اپلیکیشن خود را بهبود بخشید. به یاد داشته باشید که امنیت باید از ابتدای توسعه در نظر گرفته شود. با به‌روز ماندن در زمینه تهدیدات جدید و روش‌های امنیتی، می‌توانید اپلیکیشن‌هایی بسازید که هم کاربردی هستند و هم امنیت و حریم خصوصی کاربران را حفظ می‌کنند.هدفم از نوشتن این مقاله معرفی روشهای مرسومی بود که با رعایت کردن آنها امنیت اپلیکیشن و در نهایت دیتاهای کاربر افزایش پیدا میکند.دقت داشته باشید روشهای زیاد دیگری توی حوزه امنیت نیز وجود دارند که در این مقاله بررسی نشدند که توصیه اکید دارم حتما روی اونها نیز مطالعه داشته باشیدممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 30 Jun 2024 12:38:35 +0330</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن‌ها در اندروید، الگوهای Behavioral</title>
                <link>https://virgool.io/@javiddeveloper/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-behavioral-yk7lsztmzncp</link>
                <description>در مقاله قبلی، به بررسی و توضیح الگوهای Structural پرداختیم که به نحوه ترکیب و ساختاردهی اشیاء و کلاس‌ها برای ایجاد ساختارهای بزرگ‌تر و پیچیده‌تر می‌پرداختند.در این مقاله، به دسته دیگری از دیزاین پترن‌ها به نام الگوهای Behavioral (رفتاری) خواهیم پرداخت.الگوهای طراحی رفتاری به حل مسائل مربوط به تعامل و ارتباط بین اشیاء می‌پردازند. این الگوها به بهبود انعطاف‌پذیری و کارایی نرم‌افزار کمک می‌کنند. در توسعه اندروید، استفاده از این الگوها می‌تواند به ایجاد کد تمیزتر و قابل نگهداری‌تر منجر شود.الگوی Observer (ناظر)الگویObserver یک مکانیزم اشتراک-انتشار را تعریف می‌کند که در آن تغییرات یک شیء (معروف به subject یا observable) به طور خودکار به سایر اشیاء وابسته (معروف به observers) اطلاع داده می‌شود. این الگو امکان ایجاد ارتباط یک-به-چند بین اشیاء را فراهم می‌کند، به طوری که وقتی وضعیت یک شیء تغییر می‌کند، تمام وابستگان آن به طور خودکار مطلع و به‌روز می‌شوند.مثال : نحوه انتشار داده ها توسط LiveData یا flow ها در اندرویددر این مثال، LiveData به عنوان یک Observable عمل می‌کند. ViewModel داده‌ها را نگهداری و به‌روز می‌کند، و UI (Activity یا Fragment) به عنوان Observer عمل کرده و هر زمان که داده‌ها تغییر کنند، به‌روز می‌شود. این الگو باعث جدا شدن منطق داده از UI و مدیریت بهتر چرخه حیات می‌شود.الگوی Strategy (استراتژی)الگوی Strategy خانواده‌ای از الگوریتم‌ها را تعریف می‌کند، هر الگوریتم را کپسوله می‌کند و آن‌ها را قابل تعویض می‌سازد. این الگو به کلاینت اجازه می‌دهد تا الگوریتم را مستقل از کلاینت‌هایی که از آن استفاده می‌کنند، تغییر دهد. این الگو زمانی مفید است که شما چندین راه برای انجام یک کار دارید و می‌خواهید به راحتی بین آن‌ها سوئیچ کنید.مثال:استراتژی‌های مختلف برای لود کردن تصاویر در اندروید سپس با یک کلاس واسط اینترفیس مورد نظر را ست میکنیم و تابع لود عکس را در همین کلا قرار میدهیم.برای استفاده از این پترن نیز میتوانیم بصورت زیر عمل کینمدر این مثال، ما می‌توانیم بین استراتژی‌های مختلف لود کردن تصویر (مثل Glide و Picasso) سوئیچ کنیم بدون اینکه کد اصلی را تغییر دهیم. این امر انعطاف‌پذیری زیادی به برنامه می‌دهد و تست و نگهداری کد را آسان‌تر می‌کند.الگوی State (وضعیت)الگوی State به یک شیء اجازه می‌دهد رفتار خود را زمانی که وضعیت داخلی‌اش تغییر می‌کند، تغییر دهد. به نظر می‌رسد که شیء کلاس خود را تغییر داده است. این الگو برای مدیریت رفتارهای پیچیده و وابسته به وضعیت بسیار مفید است.مثال : مدیریت وضعیت‌های مختلف یک دکمه در UI اندرویدو سپس از این وضعیت ها در یک کلاس CustomButton استفاده میکنیمو در نهایت از این کلاس استفاده میکنیمبه همین سادگی :))در این مثال، دکمه می‌تواند در وضعیت‌های مختلفی باشد (فعال، غیرفعال، در حال بارگذاری) و رفتار و ظاهر آن بسته به وضعیت فعلی‌اش تغییر می‌کند. این الگو به ما امکان می‌دهد تا رفتارهای پیچیده و وابسته به وضعیت را به روشی ساختاریافته و قابل مدیریت پیاده‌سازی کنیم.الگوی Command (فرمان)الگوی Command یک درخواست را به عنوان یک شیء کپسوله می‌کند. این امر به شما امکان می‌دهد کلاینت‌ها را با درخواست‌های مختلف پارامتری کنید، عملیات را در صف قرار دهید یا لاگ کنید، و عملیات برگشت‌پذیر را پشتیبانی کنید. این الگو لایه‌ای از انتزاع بین عمل و اجراکننده آن ایجاد می‌کند.مثال : پیاده‌سازی سیستم مدیریت دانلود در اندرویدو سپس برای بخش اضافه کردن مورد جدید به لیست دانلود ها به این شیوه عمل میکنیمدر نهایت برای استفاده از این کلاس به این شکل عمل میکنیمدر این مثال، هر دانلود به عنوان یک Command مجزا در نظر گرفته می‌شود. این به ما امکان می‌دهد تا دانلودها را به صورت جداگانه مدیریت کنیم، آن‌ها را لغو کنیم، و حتی در صورت نیاز، عملیات undo را پیاده‌سازی کنیم.الگوی Chain of Responsibility (زنجیره مسئولیت)این الگو یک زنجیره از پردازشگرها ایجاد می‌کند که هر کدام فرصت دارند درخواست را پردازش کنند یا آن را به پردازشگر بعدی در زنجیره پاس دهند.مثال : سیستم اعتبارسنجی فرم ثبت‌نامابتدا یک کلاس پایه برای این کار تعریف میکنیمقصد داریم در این مثال از ۳ نمونه ولیدیشن استفاده کنیم و در نهایت استفاده این کلاس ها در لاجیکدر این مثال، ما یک زنجیره از Validatorها ایجاد کرده‌ایم که هر کدام بخشی از اعتبارسنجی را انجام می‌دهند. برای مثال، اعتبارسنجی ایمیل شامل بررسی خالی نبودن و سپس بررسی فرمت صحیح ایمیل است. این الگو به ما اجازه می‌دهد تا قوانین اعتبارسنجی را به راحتی اضافه، حذف یا تغییر دهیم بدون اینکه نیاز به تغییر کد اصلی داشته باشیم.نتیجه‌گیریالگوهای طراحی رفتاری که در این مقاله بررسی کردیم، ابزارهای قدرتمندی در جعبه ابزار هر توسعه‌دهنده اندروید هستند. این الگوها راه‌حل‌های آزموده شده‌ای برای مسائل رایج در طراحی نرم‌افزار ارائه می‌دهند و می‌توانند به طور قابل توجهی کیفیت و قابلیت نگهداری کد را بهبود بخشند.هدفم از نوشتن این مقاله معرفی و استفاده برخی از کاربردی‌ترین دیزاین پترن‌های Behavioral و نحوه به کارگیری آنها با مثال های اندرویدی بود.دیزاین پترن‌ها در اندروید، الگوهای Creationalدیزاین پترن‌ها در اندروید، الگوهای Structuralممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Wed, 26 Jun 2024 11:09:55 +0330</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن‌ها در اندروید، الگوهای Structural</title>
                <link>https://virgool.io/@javiddeveloper/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-structural-tuagxsxlrkhg</link>
                <description>در مقاله قبلی، به بررسی و توضیح الگوهای Creational پرداختیم که به فرآیند ایجاد اشیاء کمک می‌کنند. در این مقاله، به دسته دیگری از دیزاین پترن‌ها به نام الگوهای Structural (ساختاری) خواهیم پرداخت. این الگوها به نحوه ترکیب و ساختاردهی اشیاء و کلاس‌ها برای ایجاد ساختارهای بزرگ‌تر و پیچیده‌تر می‌پردازند. استفاده از این الگوها می‌تواند به بهبود خوانایی، انعطاف‌پذیری و قابلیت نگهداری کد کمک کند.دسته‌بندی Structural (ساختاری)الگوهای Structural بر ترکیب اشیاء و کلاس‌ها برای تشکیل ساختارهای بزرگ‌تر تمرکز دارند. در این مقاله، به معرفی و توضیح سه الگوی پرکاربرد در این دسته می‌پردازیم: Adapter، Decorator و Composite.الگوی Adapter (مبدل)الگوی Adapter به ما اجازه می‌دهد تا اینترفیس یک کلاس موجود را به یک اینترفیس مورد انتظار تبدیل کنیم. این الگو زمانی مفید است که دو کلاس ناسازگار داریم که باید با هم کار کنند.مثال:فرض کنید در یک اپلیکیشن اندرویدی، نیاز داریم تا از یک کتابخانه خارجی برای نمایش تصاویر استفاده کنیم. این کتابخانه از اینترفیس خاصی برای بارگذاری تصاویر استفاده می‌کند که با اینترفیس مورد استفاده ما سازگار نیست.در این مثال، کلاس ImageLoaderAdapter اینترفیس ImageLoader را پیاده‌سازی می‌کند و از یک نمونه ExternalImageLoader برای بارگذاری تصویر استفاده می‌کند.الگوی Decorator (تزئین‌کننده)الگوی Decorator به ما اجازه می‌دهد تا به صورت پویا به یک شیء قابلیت‌های جدید اضافه کنیم بدون اینکه به کلاس‌های موجود تغییراتی اعمال کنیم. این الگو برای افزودن ویژگی‌ها و رفتارهای اضافی به اشیاء به صورت انعطاف‌پذیر مفید است.مثال:فرض کنید در یک اپلیکیشن اندرویدی، نیاز داریم تا به یک TextView قابلیت‌های اضافی مانند حاشیه و رنگ پس‌زمینه اضافه کنیم. برای افزودن حاشیه و رنگ پس‌زمینه استفاده از الگوی Decorator در اکتیویتیدر این مثال، کلاس‌های BorderedTextView و BackgroundTextView به عنوان Decorator عمل می‌کنند و قابلیت‌های جدیدی به TextView اضافه می‌کنند.الگوی Composite (ترکیبی)الگوی Composite به ما اجازه می‌دهد تا اشیاء را به صورت سلسله‌مراتبی ترکیب کنیم و به این ترتیب بتوانیم با مجموعه‌ای از اشیاء به عنوان یک شیء واحد رفتار کنیم. این الگو برای ساختاردهی اشیاء به صورت درختی مفید است.مثال:فرض کنید در یک اپلیکیشن اندرویدی، می‌خواهیم یک ساختار سلسله‌مراتبی از منوهای کشویی (Drawer Menu) را ایجاد کنیم.ابتدا اینترفیس MenuComponent را تعریف می‌کنیمسپس کلاس MenuItem را که نمایانگر یک آیتم منو است، تعریف می‌کنیمحالا کلاس Menu را که نمایانگر یک منوی ترکیبی از چندین آیتم منو است، تعریف می‌کنیمحالا می‌توانیم از الگوی Composite برای ساختاردهی منوها در اکتیویتی خود استفاده کنیمدر این مثال:کلاسMenuItem  نمایانگر یک آیتم منو است که متد showMenu را پیاده‌سازی می‌کند.کلاسMenu  نمایانگر یک منوی ترکیبی است که می‌تواند شامل چندین MenuComponent باشد  متدshowMenu را برای نمایش آیتم‌های منو پیاده‌سازی می‌کند.نتیجه‌گیریاستفاده از الگوهای Structural (ساختاری)  می‌تواند به بهبود خوانایی، انعطاف‌پذیری و قابلیت نگهداری کد کمک کند.هدفم از نوشتن این مقاله معرفی و استفاده برخی از کاربردی‌ترین دیزاین پترن‌های Structural و نحوه به کارگیری آنها با مثال های اندرویدی بود.دیزاین پترن‌ها در اندروید، الگوهای Creationalدیزاین پترن‌ها در اندروید، الگوهای Behavioralممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 16 Jun 2024 17:02:46 +0330</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن‌ها در اندروید، الگوهای Creational</title>
                <link>https://virgool.io/codenevis/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-creational-zyl8d7sttbds</link>
                <description>در دنیای برنامه‌نویسی، دیزاین پترن‌ها (Design Patterns) راهکارهای قابل استفاده مجددی برای مسائل معمولی در توسعه نرم‌افزار هستند. این الگوها نه تنها به بهبود کیفیت کد و خوانایی آن کمک می‌کنند، بلکه باعث کاهش زمان توسعه و افزایش قابلیت نگهداری برنامه‌ها می‌شوند. دیزاین پترن‌ها به سه دسته اصلی تقسیم می‌شوند: Creational (ایجاد کننده)، Structural (ساختاری) و Behavioral (رفتاری). در این مقاله، به معرفی دسته Creational می‌پردازیم و مثال‌هایی از کاربرد این الگوها در توسعه اپلیکیشن‌های اندرویدی با زبان کاتلین رو بررسی میکنیم.الگوهای Creational (ایجاد کننده‌ها)الگوهای Creational مربوط به فرآیند ایجاد اشیاء هستند. این الگوها به گونه‌ای طراحی شده‌اند که پیچیدگی‌های ایجاد اشیاء را از بین برده و فرایند ساخت آن‌ها را ساده‌تر و انعطاف‌پذیرتر می‌کنند. در این دسته، چندین الگوی معروف وجود دارد که در ادامه به بررسی چند نمونه از آن‌ها خواهیم پرداخت. الگوی Singleton (تک‌نمونه)الگوی Singleton به ما اجازه می‌دهد تا از یک کلاس تنها یک نمونه ایجاد کنیم و به جای ایجاد چندین نمونه، همیشه به همان یک نمونه دسترسی داشته باشیم. این الگو برای مدیریت منابع محدود یا دسترسی به تنظیمات گلوبال مناسب است.در این مثال، کلاس DatabaseHelper با استفاده از object در کاتلین به صورت Singleton پیاده‌سازی شده است. هر بار که به DatabaseHelper دسترسی پیدا کنیم، به همان یک نمونه دسترسی خواهیم داشت.الگوی Factory Method (متد کارخانه‌)الگوی Factory Method یک اینترفیس یا کلاس پایه‌ای تعریف می‌کند که از طریق آن می‌توان اشیاء مختلفی را بدون مشخص کردن کلاس دقیق آن‌ها ایجاد کرد. این الگو به ما کمک می‌کند تا وابستگی به کلاس‌های خاص را کاهش دهیم و کدهای منعطف‌تری بنویسیم.مثال:سپس دو کلاس AndroidButton و IOSButton که اینترفیس Button را پیاده‌سازی می‌کنند، تعریف می‌کنیم.یک کلاس انتزاعی Dialog تعریف می‌کنیم که متد createButton را به صورت انتزاعی تعریف کرده و یک متد renderWindow برای رندر کردن دکمه دارد.در نهایت، از الگوی Factory Method استفاده می‌کنیم تا بدون وابستگی به کلاس‌های خاص، دکمه‌های مختلفی ایجاد کنیم.الگوی Prototype (نمونه اولیه)الگوی Prototype به ما اجازه می‌دهد تا با کپی کردن یک نمونه اولیه، اشیاء جدیدی ایجاد کنیم. این الگو به خصوص زمانی مفید است که ایجاد اشیاء جدید از یک کلاس پرهزینه باشد یا زمانی که نیاز به ایجاد چندین شیء مشابه داریم.مثال :فرض کنید در یک اپلیکیشن اندرویدی، نیاز داریم تا چندین شیء TextView با تنظیمات مشابه ایجاد کنیم.ابتدا یک کلاس TextViewPrototype ایجاد می‌کنیم:در اینجا، کلاس TextViewPrototype با استفاده از یک نمونه اولیه TextView، تنظیمات اولیه را در متغیرهای text و textSize ذخیره می‌کند. متد clone نیز یک نمونه جدید از TextViewPrototype با همان تنظیمات ایجاد می‌کند.حالا در اکتیویتی یا فرگمنت خود، از این الگو استفاده می‌کنیم:در این مثال، ابتدا یک TextView اولیه ایجاد می‌کنیم و سپس از آن یک نمونه اولیه با استفاده از TextViewPrototype می‌سازیم. بعد از آن، با استفاده از متد clone، دو TextView جدید با تنظیمات مشابه اما با متن‌های متفاوت ایجاد می‌کنیم و آن‌ها را به لایه اضافه می‌کنیم.الگوی Builder (سازنده)الگوی Builder برای ساخت اشیاء پیچیده به کار می‌رود. این الگو به ما اجازه می‌دهد تا فرآیند ساخت یک شیء را به مراحل کوچک‌تر تقسیم کنیم و از ساختارهای پیچیده جلوگیری کنیم.مثال:در این مثال، کلاس Notification با استفاده از الگوی Builder پیاده‌سازی شده است. این الگو به ما اجازه می‌دهد تا به صورت مرحله به مرحله یک شیء Notification را ایجاد کنیم.در نهایت، با استفاده از کلاس Builder، یک شیء Notification ایجاد می‌کنیم.نتیجه‌گیریالگوهای Creational به ما کمک می‌کنند تا فرآیند ایجاد اشیاء را بهبود بخشیم و از پیچیدگی‌های غیر ضروری جلوگیری کنیم. استفاده از این الگوها در توسعه اپلیکیشن‌های اندرویدی می‌تواند به کدی منظم‌تر، انعطاف‌پذیرتر و قابل نگهداری‌تر منجر شود.هدفم از نوشتن این مقاله معرفی و استفاده برخی از کاربردی‌ترین دیزاین پترن‌های Creational و نحوه به کارگیری آنها با مثال های اندرویدی بود.دیزاین پترن‌ها در اندروید، الگوهای Structuralدیزاین پترن‌ها در اندروید، الگوهای Behavioralممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Fri, 14 Jun 2024 21:31:46 +0330</pubDate>
            </item>
                    <item>
                <title>کاربرد اصول SOLID در طراحی برنامه‌های اندروید</title>
                <link>https://virgool.io/@javiddeveloper/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-%D8%A7%D8%B5%D9%88%D9%84-solid-%D8%AF%D8%B1-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-rqb079ir57zo</link>
                <description>اصول SOLID مجموعه‌ای از اصول طراحی شی‌گرا هستند که توسط رابرت مارتین (عضو هیئت مدیره Agile Alliance) معرفی شده‌اند. این اصول به توسعه‌دهندگان کمک می‌کنند تا کدی انعطاف‌پذیر، قابل‌گسترش و آسان برای نگهداری بنویسند. در این مقاله، نحوه کاربرد این اصول در طراحی برنامه‌های اندروید را بررسی خواهیم کرد.اصل تک مسئولیتی (Single Responsibility Principle - SRP)این اصل می‌گوید که هر کلاس باید تنها یک مسئولیت داشته باشد و هر تغییر در آن کلاس باید منحصراً مربوط به آن مسئولیت باشد. در اندروید، می‌توانید از این اصل برای جدا کردن منطق کسب‌و‌کار از رابط کاربری، جداسازی وظایف ارتباط با داده‌ها از سایر وظایف، و ایجاد کلاس‌های با مسئولیت‌های مشخص استفاده کنید.اصل باز/بسته (Open/Closed Principle - OCP)طبق این اصل، واحدهای نرم‌افزاری باید برای گسترش باز و برای تغییر بسته باشند. در اندروید، می‌توانید از الگوهای طراحی مانند استراتژی،  دکوریتور و ... برای رعایت این اصل استفاده کنید. به این ترتیب، می‌توانید رفتار برنامه را بدون تغییر در کد موجود گسترش دهید.در این مثال، می‌توانیم شکل‌های جدید را با پیاده‌سازی رابط Shape اضافه کنیم، بدون نیاز به تغییر در کلاس ShapeRenderer.اصل جایگزینی لیسکوف (Liskov Substitution Principle - LSP)این اصل می‌گوید که زیرکلاس‌ها باید بتوانند جایگزین کلاس پایه شوند، بدون اینکه رفتار برنامه تغییر کند. در اندروید، باید دقت کنید که زیرکلاس‌ها رفتار کلاس پایه را به گونه‌ای تغییر ندهند که با قراردادهای تعریف شده در کلاس پایه ناسازگار باشد.در این مثال، ElectricVehicle می‌تواند جایگزین Vehicle شود، زیرا رفتار startEngine را به گونه‌ای پیاده‌سازی کرده است که با قرارداد تعریف شده در کلاس پایه سازگار است.اصل معکوس وابستگی‌ها (Dependency Inversion Principle - DIP)این اصل می‌گوید که واحدهای سطح بالا نباید به واحدهای سطح پایین وابسته باشند، بلکه هر دو باید به مفاهیم انتزاعی وابسته باشند. در اندروید، می‌توانید از الگوهای طراحی مانند Factory و تزریق وابستگی یا استفاده از کتابخانه هایی مانند (Dagger, hilt, koin) برای رعایت این اصل استفاده کنید.در این مثال، کلاس DataManager به رابط NetworkClient وابسته است، نه به پیاده‌سازی خاص آن (HttpClient). این امر به ما امکان می‌دهد در آینده پیاده‌سازی‌های دیگری از NetworkClient را جایگزین کنیم، بدون نیاز به تغییر در DataManager.هدفم از نوشتن این مقاله  این بود که درک بهتری از کاربرد اصول SOLID در طراحی برنامه‌های اندروید داشته باشید. این اصول به شما کمک می‌کنند تا کد انعطاف‌پذیرتر، قابل گسترش‌تر و آسان‌تر برای نگهداری بنویسید.البته پیاده سازی ها توی پروژه های واقعی به این شکل نیست و شما باید بیشتر در مورد نحوه پیادی سازی ها مطالعه کنید این مقاله بیشتر هدفش اینه شما را به صورت مفهومی با اصل SOLID آشنا کنهممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 02 Jun 2024 13:22:27 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی و پیاده سازی TileService نوار اعلانات در اندروید</title>
                <link>https://virgool.io/@javiddeveloper/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-tileservice-%D8%AF%D8%B1-%D9%86%D9%88%D8%A7%D8%B1-%D8%A7%D8%B9%D9%84%D8%A7%D9%86%D8%A7%D8%AA-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-hswshgufr3j5</link>
                <description>در اندروید TileService یک سرویس است که به برنامه های کاربردی اجازه میدهد تا یک کاشی (Tile) در نوار اعلانات قرار دهند. این کاشی ها می توانند اطلاعات مفید یا دکمه های عملیاتی را به کاربران ارائه دهند و به آنها امکان دسترسی سریع به برخی از ویژگی های برنامه را بدهند.در واقع TileService از نسخه 7.0 اندروید (Nougat) معرفی شد و جایگزین نوار اعلانات قدیمی در نسخه های قبلی اندروید شد. این ویژگی به توسعه دهندگان اجازه داد تا کاشی های سفارشی خود را در نوار اعلانات قرار دهند و تعامل بهتری با کاربران داشته باشند.موارد استفاده TileService می تواند در دسته هایی زیر قرار بگیرد ارائه اطلاعات مهم و آماریدسترسی سریع به تنظیمات و ویژگی های برنامهکنترل دستگاه یا سرویس های خارجیارائه دکمه های میانبر برای عملیات متداول در برنامهپیاده سازیبرای پیاده سازی TileService، شما باید یک کلاس جدید ایجاد کنید که از TileService ارث بری می کند. سپس، متدهای مربوطه را برای تنظیم ظاهر و رفتار کاشی پیاده سازی کنید. این متدها شامل موارد زیر است:onTileAdded(): برای اعلام اینکه کاشی به نوار اعلانات اضافه شده است.onTileRemoved(): برای اعلام اینکه کاشی از نوار اعلانات حذف شده است.onStartListening(): برای شروع گوش دادن به تغییرات در کاشی.onStopListening(): برای توقف گوش دادن به تغییرات در کاشی.onClick(): برای پردازش کلیک کاربر روی کاشی.اضافه کردن TileService به فایل AndroidManifest.xmlدر این مثال، هر بار کاربر روی کاشی کلیک کند متد  فراخوانی می شود. این متد، وضعیت isActive را تغییر می دهد و سپس متد updateTile را فراخوانی میکند.متد updateTile وظیفه به روزرسانی ظاهر و متن کاشی را به عهده دارد که در این مثال، عنوان کاشی را به &quot;Example Tile&quot; تنظیم می کنیم و متن آن را بر اساس وضعیت isActive به &quot;Active&quot; یا &quot;Inactive&quot; تغییر می دهیم. همچنین، آیکن کاشی را با توجه به وضعیت isActive تغییر می دهیم و در نهایت، کاشی به روزرسانی شده را در نوار اعلانات قرار می دهیم.نکات مهمی که باید هنگام پیاده سازی در نظر بگیریددسترسی به TileService از API level 24 به بالا: TileService از API level 24 (اندروید 7.0 Nougat) به بعد در دسترس است. برای پشتیبانی از نسخههای قدیمیتر اندروید، باید از روشهای دیگری مانند استفاده از سرویسهای سیستم (SystemUI Tuner) استفاده کنید.استفاده از قابلیت TileService در دستگاههای مختلف: برخی از سازندگان دستگاههای اندرویدی ممکن است تغییراتی در نحوه نمایش یا رفتار TileService در نوار اعلانات ایجاد کرده باشند. بنابراین، بهتر است برنامه خود را در دستگاههای مختلف تست کنید تا از عملکرد صحیح آن اطمینان حاصل کنید.تعامل با TileService: برای تعامل با TileService از طریق کد برنامه، میتوانید از کلاس TileManager استفاده کنید. این کلاس امکانات مختلفی برای افزودن، حذف، و مدیریت کاشیها در نوار اعلانات را ارائه میدهد.طراحی آیکن و رابط کاربری مناسب: برای ایجاد یک تجربه کاربری خوب، باید آیکنها و رابط کاربری کاشی را طوری طراحی کنید که با سایر المانهای نوار اعلانات هماهنگ باشند و اطلاعات مهم را به صورت واضح و خوانا ارائه دهند.هدفم از نوشتن این مقاله معرفی و نحوه پیاده سازی Tile Service های اندروید به بیان ساده بود. این سرویس ها میتونن توی بیزنس های مختلف مورد استفاده قرار بگیرن و علاوه بر استفاده هایی که بالا اشاره شد رابط کاربری جذابی رو به برنامه بدن ممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Tue, 14 May 2024 10:03:09 +0330</pubDate>
            </item>
                    <item>
                <title>راهکار گوگل برای افزایش طول عمر باتری در اندروید</title>
                <link>https://virgool.io/codenevis/%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%DA%AF%D9%88%DA%AF%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B7%D9%88%D9%84-%D8%B9%D9%85%D8%B1-%D8%A8%D8%A7%D8%AA%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-ppcfvapf8gcd</link>
                <description>واژه Doze Mode یک ویژگی در سیستم عامل اندروید است که از نسخه 6.0 معرفی شده است. هدف اصلی از معرفی این قابلیت، کاهش مصرف باتری و در نتیجه افزایش طول عمر آن است.در گذشته، برنامه های در حال اجرا در پس زمینه می توانستند بدون محدودیت از منابعی مانند CPU، رم، اینترنت و سنسورهای مختلف استفاده کنند که این امر باعث تخلیه سریع باتری می شد. اما Doze Mode با شناسایی زمان هایی که دستگاه در حالت بیکار (idle) قرار دارد، محدودیت هایی را برای این برنامه ها در نظر می گیرد تا از مصرف منابع جلوگیری شود.به طور خاص، وقتی دستگاه برای مدت طولانی بیکار است و صفحه نمایش آن خاموش می ماند، Doze Mode فعال می شود. در این حالت، سیستم عامل دسترسی برنامه ها به شبکه داده ای، سنسورهای حرکتی، سرویس های پس زمینه و غیره را محدود می کند تا باتری کندتر تخلیه شود. البته گوگل برای برنامه های ضروری مانند تماس ها و هشدارها، استثنائاتی را در نظر گرفته است.در نسخه های جدیدتر اندروید از جمله 7.0  و 8.0 ، گوگل بهبودهای بیشتری را به Doze Mode اضافه کرده تا عملکرد آن بهینه تر شود. به طور کلی، Doze Mode در حالی که تجربه کاربری را حفظ می کند، مصرف باتری را به میزان قابل توجهی کاهش می دهد.این مقاله قصد دارد با جزئیات بیشتر به بررسی Doze Mode، نحوه کارکرد آن، مزایا و معایب احتمالی و نیز چگونگی تنظیم یا غیرفعال کردن این ویژگی بپردازد.نحوه عملکرد Doze Modeبرای فعال شدن Doze Mode، دو شرط اصلی لازم است: 1. صفحه نمایش دستگاه باید خاموش باشد. 2. دستگاه نباید در حال حرکت یا لرزش باشد. اگر این دو شرط برای مدت زمان معینی برقرار باشد، Doze Mode فعال می‌گردد. در این حالت، دسترسی برنامه‌ها به اینترنت، سنسورهای حرکتی، واکنش‌های زمان واقعی و سرویس‌های پس‌زمینه به شدت محدود می‌شود.مزایای Doze Modeافزایش چشمگیر عمر باتری به واسطه کاهش مصرف انرژی در زمان بیکاری دستگاهجلوگیری از تخلیه شارژ باتری توسط برنامه‌های پرمصرف در پس‌زمینهکاهش ترافیک داده در زمان عدم استفاده از دستگاهمعایب احتمالی Doze Modeامکان تاخیر در دریافت برخی نوتیفیکیشن‌ها و به‌روزرسانی‌هااحتمال مشکلات سازگاری با برخی برنامه‌های قدیمیکاهش عملکرد دستگاه در زمان بیکاری به دلیل محدودیت دسترسی به منابعتنظیم و غیرفعال کردن در بیشتر دستگاه‌های اندرویدی، Doze Mode به صورت پیش‌فرض فعال است. اما در تنظیمات &gt; باتری معمولا گزینه‌هایی برای تنظیم یا غیرفعال کردن آن وجود دارد. همچنین برخی سازندگان اندرویدی امکان دسترسی به تنظیمات پیشرفته Doze Mode را در بخش تنظیمات باتری فراهم کرده‌اند.برای غیرفعال کردن کامل Doze Mode باید دستگاه را در حالت Developer Options قرار داده و گزینه &quot;Disable Doze Mode&quot; را انتخاب کنید.فهرست سفید (Whitelist) برای برنامه‌هایی که نیاز دارند در حالت Doze Mode نیز به صورت کامل قابل دسترسی باشند، می‌توان آن‌ها را به فهرست سفید Doze Mode اضافه کرد. این کار از طریق تنظیمات دستگاه یا با استفاده از کد در برنامه امکان‌پذیر است. برنامه‌های موجود در فهرست سفید از محدودیت‌های Doze Mode مستثنی خواهند بود.این مقاله در ادامه به جزئیات بیشتری در خصوص Doze Mode و نحوه اضافه کردن یا حذف برنامه‌ها از فهرست سفید آن خواهد پرداخت.خلاصه و نتیجه‌گیری در مورد Doze Modeبه طور خلاصه، Doze Mode یک ویژگی بسیار مفید در سیستم‌عامل اندروید است که هدف اصلی آن افزایش طول عمر باتری دستگاه‌های هوشمند است. این قابلیت با شناسایی زمان‌های بیکاری دستگاه و اِعمال محدودیت‌هایی بر برنامه‌های در حال اجرا در پس‌زمینه، از مصرف بیهوده منابع و در نتیجه تخلیه سریع باتری جلوگیری می‌کند.در مجموع، Doze Mode یک گام مثبت در راستای بهینه‌سازی مصرف انرژی در دستگاه‌های اندرویدی محسوب می‌شود که تجربه کاربری بهتری را برای افراد به ارمغان می‌آورد.در ادامه می‌توانیم به جزئیات فنی‌تر و تخصصی‌تر مانند REQUEST_IGNORE_BATTERY_OPTIMIZATIONS و Wake Locks در ارتباط با Doze Mode بپردازیم.درخواست REQUEST_IGNORE_BATTERY_OPTIMIZATIONSاین یک Intent (درخواست) در اندروید است که به برنامه‌نویسان امکان می‌دهد برنامه خود را برای قرار گرفتن در فهرست سفید Doze Mode، نامزد کنند. برای استفاده از آن، باید در کد برنامه خود یک Intent با عمل &quot;android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS&quot; را ایجاد کنید.سپس کاربر باید از میان لیست برنامه‌ها نرم‌افزار شما را انتخاب کند تا در فهرست سفید Doze Mode قرار بگیرد. وقتی یک برنامه در این فهرست قرار گیرد، دیگر تحت محدودیت‌های Doze Mode برای دسترسی به منابع سیستمی نخواهد بود.بررسی Wake Lock هادر اندروید Wake Lock  یک مکانیزم در می باشد که به برنامه‌ها اجازه می‌دهد دستگاه را از رفتن به حالت خواب (Sleep) بازدارند. با فراخوانی Wake Lock، برنامه می‌تواند سیستم را مجبور کند پردازنده، صفحه نمایش و دیگر قسمت‌های اصلی دستگاه را روشن نگه دارد.اما در حالت Doze Mode، سیستم عامل محدودیت شدیدی را برای Wake Lock های برنامه‌ها اِعمال می‌کند. به این معنی که زمانی Doze Mode فعال است، Wake Lock های برنامه‌ها دیگر نمی‌توانند به طور موثر از خواب رفتن دستگاه جلوگیری کنند.این محدودیت برای جلوگیری از تخلیه باتری توسط برنامه‌های پرمصرف در زمان بیکاری دستگاه، درنظر گرفته شده است. در غیر این صورت، برنامه‌ها می‌توانستند با نگه داشتن Wake Lock، اجرای Doze Mode را مختل کنند.البته برای برنامه‌هایی که در فهرست سفید Doze Mode قرار می‌گیرند، محدودیتی روی Wake Lock ها اعمال نمی‌شود. بنابراین اگر برنامه شما نیاز به حفظ Wake Lock در زمان Doze Mode دارد، باید از REQUEST_IGNORE_BATTERY_OPTIMIZATIONS برای افزودن آن به فهرست سفید استفاده کنید.در ادامه این مقاله، نمونه کدهای مربوط به این موارد را نیز ارائه خواهیم کرد تا درک عملی از آن‌ها فراهم شود.نمونه کدها برای درک بهتر نحوه استفاده از REQUEST_IGNORE_BATTERY_OPTIMIZATIONS و Wake Locks در ارتباط با Doze Mode، به نمونه کدهای زیر توجه کنید:درخواست قرارگیری در فهرست سفید Doze Mode:val isPowerSaveMode = powerManager.isPowerSaveMode
if (isPowerSaveMode) {
   val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
   intent.data = Uri.parse(&amp;quotpackage:$packageName&amp;quot)
   startActivityForResult(intent, REQUEST_IGNORE_BATTERY_CODE)
}در این کد، ابتدا بررسی می‌شود که آیا حالت صرفه‌جویی در باتری (Doze Mode) فعال است یا خیر. اگر فعال باشد، یک Intent برای REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ایجاد می‌شود و با استفاده از startActivityForResult فراخوانی می‌گردد تا کاربر بتواند برنامه را به فهرست سفید اضافه کند.درخواست Wake Lock:val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, &amp;quotMyApp::MyWakelockTag&amp;quot)
wakeLock.acquire()
// Do the work you want to keep the CPU awake for
wakeLock.release()در این مثال، ابتدا یک شیء Wake Lock با استفاده از newWakeLock ایجاد می‌شود. سپس با فراخوانی متد acquire، Wake Lock را فعال می‌کنیم تا سیستم از خواب رفتن بازداشته شود. پس از انجام کارهای مورد نظر، با فراخوانی release، Wake Lock را آزاد می‌کنیم.توجه داشته باشید که در حالت Doze Mode، Wake Lock های برنامه‌ای که در فهرست سفید قرار ندارد، به دلیل محدودیت‌های اعمال شده، کارایی چندانی نخواهد داشت.اگر به این مطالب علاقه دارید پیشنها میکنم از مطالب زیر رو هم بخونیدبهینه سازی عملکرد و مصرف باتری در برنامه های اندرویدهدفم از نوشتن این مقاله درک عمیق تری از محدودیت هایی هست که اندروید سمت باتری داره و شما با دونستن اونا میتونید با دید باز تری توسعه برنامه هاتون رو انجام بدینممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 28 Apr 2024 13:54:02 +0330</pubDate>
            </item>
                    <item>
                <title>بهینه سازی عملکرد و مصرف باتری در برنامه های اندروید</title>
                <link>https://virgool.io/@javiddeveloper/android-optimization-usage-battery-azmfuwj0zxic</link>
                <description>مفهوم بهینه سازی عملکرد و مصرف باتری و اهمیت آن در اندرویدبهینه‌سازی عملکرد و مصرف باتری در برنامه‌های اندرویدی اهمیت بسیاری دارد و درک مفهوم آن می‌تواند به توسعه‌دهندگان و کاربران اندروید کمک کند. بهینه‌سازی عملکرد به معنای بهبود عملکرد و کارایی برنامه است، در حالی که بهینه‌سازی مصرف باتری به معنای کاهش مصرف انرژی توسط برنامه و افزایش عمر باتری دستگاه است. بهینه‌سازی عملکرد و مصرف باتری در اندروید می‌تواند به موارد زیر کمک کند.تجربه کاربری بهتر: برنامه‌هایی که عملکرد بهینه و مصرف باتری مناسبی دارند، تجربه کاربری بهتری را ارائه می‌دهند. زمان پاسخ به دستورات کاربری کاهش می‌یابد و کاربران از سرعت و پاسخگویی برنامه لذت بیشتری می‌برند.افزایش رضایتمندی کاربران: با کاهش مصرف باتری توسط برنامه، کاربران می‌توانند از دستگاه خود بیشتر استفاده کنند بدون نگرانی از نیاز به شارژ مکرر. این موضوع باعث افزایش رضایتمندی کاربران از برنامه می‌شود.افزایش محبوبیت برنامه: برنامه‌هایی که بهینه‌سازی شده‌اند و مصرف باتری کمی دارند، معمولاً توسط کاربران بیشتری دانلود و استفاده می‌شوند. این می‌تواند به افزایش محبوبیت و شناخت برنامه در بازار کمک کند.کاهش هزینه‌ها و منابع: استفاده بهینه از منابع سخت‌افزاری و نرم‌افزاری در برنامه‌ها می‌تواند به کاهش هزینه‌های توسعه و نگهداری کمک کند و در نتیجه، منابع شرکت را صرفه‌جویی کند.بهینه‌سازی عملکرد و مصرف باتری در برنامه‌های اندرویدی می‌تواند از طریق انجام مراحل مختلفی انجام شود. در زیر به چند روش اصلی اشاره می‌کنم:بهینه‌سازی کد:استفاده از الگوریتم‌های بهینه‌تر و بهبود عملکرد کد.کاهش استفاده از حلقه‌های تکراری و جایگزینی آنها با روش‌های بهینه‌تر مانند: توابع بازگشتی یا توابع با وقفه.کاهش فعالیت‌های پس‌زمینه: محدود کردن فعالیت‌های پس‌زمینه غیرضروری مانند سرویس‌ها و نمایش اطلاعیه‌ها.بهینه‌سازی تصاویر و رابط کاربری: استفاده از تصاویر بهینه شده با فشرده‌سازی مناسب با ابعاد مناسب کاهش استفاده از انیمیشن‌ها و افکت‌های زیاد در رابط کاربری که می‌تواند مصرف باتری را افزایش دهد.(این مورد اگه به درستی استفاده نشه به وضوح عملکرد برنامه رو هم علاوه بر باتری تحت تاثیر قرار میده)استفاده از ابزارهای مفید برنامه‌نویسی: استفاده از JobScheduler برای اجرای وظایف پس‌زمینه در زمان‌هایی که دستگاه فعال است و مصرف باتری کمتری دارد.استفاده از Doze Mode برای محدود کردن فعالیت‌های پس‌زمینه و اجرای آنها در زمان‌هایی که دستگاه در حالت استراحت است.کنترل مصرف منابع:مدیریت استفاده از حافظه و پردازنده به شکل بهینه تر و همچنین بهینه‌سازی اتصال به شبکه.تست و بهبود عملکرد:انجام تست‌های عملکردی و استفاده از ابزارهای مربوط به تحلیل عملکرد برنامه برای شناسایی نقاط ضعف و بهبود آنها.(معمولا توی این زمینه Android Profiler یکی از بهترین ابزارهای موجود هست)هدفم از نوشتن این مقاله بیشتر اشاره به موارد کلی بودن که توی زمینه بهینه سازی مصرف باتری در اپلیکیشن های موبایل میتونن حائز اهمیت باشن.ممنون از زمانی که گذاشتین :))خدانگهدارتون</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Sun, 21 Apr 2024 13:05:36 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه استفاده از سوکت Socket.io در اندروید</title>
                <link>https://virgool.io/@javiddeveloper/socketioinandroid-npkeibzq52up</link>
                <description> کتابخانه Socket.IO یک کتابخانه متن باز برای برنامه نویسی ارتباطات درون شبکه برای برنامه های وب و موبایل است. با استفاده از Socket.IO می‌توانید ارتباطات دوطرفه و بر اساس رویدادها (event-based) بین سرور و مشتری را برقرار کنید.استفاده از Socket.IO برای ارتباطات درون شبکه در برنامه های موبایل و وب، بسیار مفید است. برای مثال، اگر در برنامه اندرویدی خود نیاز به ارتباط درون شبکه با سرور دارید، می توانید از Socket.IO استفاده کنید تا بتوانید داده هایی را به صورت بی نهایت ارسال و دریافت کنید.یک مثال ساده از استفاده از Socket.IO در برنامه اندرویدی می‌تواند به شرح زیر باشد:ابتدا کتابخانه Socket.IO را در پروژه اندرویدی خود اضافه کنید. implementation &#039;io.socket:socket.io-client:1.0.0&#039;حالا در برنامه خود یک شیء از کلاس Socket بسازید و با استفاده از آن به سرور متصل شوید. برای مثال، فرض کنید که شما می‌خواهید به یک سرور Socket.IO به آدرس http://example.com و پورت 3000 متصل شوید. در این صوره، باید کد زیر را در برنامه اضافه کنید:socket.emit(&amp;quotmessage&amp;quot, &amp;quotHello, server!&amp;quot, new Ack() {
@Override
public void call(Object... args) {
//receive response.....
String response = (String) args[0];
Log.d(&amp;quotSocket&amp;quot, &amp;quotServer response: &amp;quot + response);
}
});در این کد، با استفاده از رویداد emit، داده &quot;Hello, server!&quot; به سرور ارسال شده است. سپس با استفاده از یک Ack، پاسخ از سرور دریافت شده و در کنسول نمایش داده میشود.این تنها یک مثال ساده از استفاده از Socket.IO در اندروید بود.وقتی گوشی قفل میشود و دوباره باز میشود چطوری میشه اتصال Socket.IO رو باز نگه داشت؟وقتی که گوشی شما در حالت قفل قرار دارد، برنامه‌های اجرا شده در آن به حالت خوابیدن (sleep) در می‌آیند و ارتباط آن‌ها با سرور نیز قطع می‌شود. بنابراین، وقتی گوشی شما دوباره باز می‌شود، برنامه‌ای که شما نوشته‌اید باید دوباره به سرور متصل شود.برای حفظ اتصال socket.io در اندروید هنگام قفل شدن گوشی ، می توانید از موارد زیر استفاده کنید:از سرویس های پس زمینه اندروید استفاده کنید. یک سرویس پس زمینه را ایجاد کنید که اتصال socket.io را برقرار نگه دارد. هنگام باز شدن گوشی ، این اتصال همچنان برقرار خواهد بود. یک Service یک برنامه در پس‌زمینه است که بدون نیاز به نمایش گرافیکی، اجرا می‌شود. با استفاده از یک Service، می‌توانید ارتباط با سرور را در پس‌زمینه بازنگه دارید و هنگامی که گوشی دوباره باز می‌شود، اتصال را دوباره برقرار کنید.برای استفاده از یک Service در برنامه‌ی اندروید خود، ابتدا باید یک کلاس از Serviceبسازید. برای مثال، فرض کنید کلاسی به نام SocketService را برای اتصال به سرور Socket.IO بسازید. این کلاس باید از کلاس Service ارث بری کند. به عنوان مثال:public class SocketService extends Service{
private Socket socket;
private String serverUrl = &amp;quothttp://example.com:3000&amp;quot // آدرس سرور 
}سپس درون کلاس SocketService، می‌توانید متد onCreate را override کنید و اتصال به سرور Socket.IO را در آن ایجاد کنید:@Override
public void onCreate() {
super.onCreate();
try {
socket = IO.socket(serverUrl);
socket.connect();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
disconnectFromSocket();
}حالا می‌توانید این Service را  استفاده کنید. برای شروع Service، باید یک Intent ایجاد کنید و آن را با استفاده از متد startService() اجرا کنید. به عنوان مثال:Intent intent = new Intent(this, SocketService.class);
startService(intent);با اجرای این کد، Service شما شروع به کار می‌کند و اتصال به سرور Socket.IO برقرار می‌شود. حالا وقتی که گوشی شما به حالت قفل درآمده و دوباره باز می‌شود، Service شما نیز در پس‌زمینه اجرا می‌شود و اتصال به سرور Socket.IOرا دوباره برقرارمی‌کند. این روش به شما این امکان را می‌دهد که اتصال Socket.IO را در برنامه خود بازنگه دارید و از قطع شدن اتصال در هنگام قفل شدن گوشی جلوگیری کنید.از رخدادهای مربوط به قفل / باز شدن گوشی استفاده کنید. در اکتیویتی خود، متدهای () و () را پیاده سازی کنید. در () ، اتصال socket.io را متوقف کنید. در () ، مجددا اتصال را برقرار نمایید.یک راه دیگر استفاده از PowerManager و WakeLock برای حفظ اتصال Socket.IO در اندروید هست (که شخصا توصیه نمیکنم ازش استفاده کنید.)برای اینکه بتوانید از PowerManagerو WakeLock برای حفظ اتصال Socket.IO در اندروید استفاده کنید، باید ابتدا اجازه دسترسی به دستگاه در حالت خوابیدن را در فایل AndroidManifest.xml برنامه اضافه کنید. برای این کار، کد زیر را به فایل AndroidManifest.xml اضافه کنید:&lt;uses-permission android:name=&amp;quotandroid.permission.WAKE_LOCK&amp;quot /&gt;حالا برای استفاده از PowerManager و WakeLock، باید ابتدا یک شیء از PowerManager بسازید و سپس با استفاده از آن، یک WakeLock بسازید. به عنوان مثال:درون متد ()onCreate یا ()onStartCommand یا هر جای دیگر که می‌خواهید از WakeLock استفاده کنید:PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, &amp;quotMyApp::MyWakelockTag&amp;quot);
wakeLock.acquire();در این کد، ابتدا یک شیء از PowerManager ساخته شده است. سپس با استفاده از آن، یک WakeLock با نوع PARTIAL_WAKE_LOCK بسازید. نوع PARTIAL_WAKE_LOCK به شما اجازه می‌دهد که دستگاه را در حالت خوابیده نگه دارید، اما صفحه نمایش آن را خاموش نکنید.حالا با استفاده از WakeLock، دستگاه را در حالت خوابیده نگه دارید و اتصال Socket.IO را در پس‌زمینه بازنگه دارید. برای این کار، باید در متد onDestroy یا هرجای دیگر دلخواه خود، WakeLock را آزاد کنید تا بتوانید از منابع دستگاه بهره‌مند شوید. به عنوان مثال:@Override
public void onDestroy() {
super.onDestroy();
if (wakeLock != null &amp;&amp; wakeLock.isHeld()){
wakeLock.release();
}
}در این کد، در متد onDestroy، WakeLock آزاد شده و منابع دستگاه رها شده است.حالا با استفاده از PowerManager و WakeLock، می‌توانید اتصال Socket.IO را در پس‌زمینه بازنگه دارید و از قطع شدن آن در هنگام قفل شدن گوشی جلوگیری کنید. بهتر است توجه داشته باشید که استفاده از WakeLock ممکن است به مصرف بیشتر باطری دستگاه منجر شود، بنابراین باید به دقت کنید آن را فقط در مواردی که برای نگهداری اتصال Socket.IOبه سرور لازم است، فعال کنید.امیدوارم با این مطالب توانسته باشم کمکی کرده باشم :)</description>
                <category>جاوید ستار | Javid Sattar</category>
                <author>جاوید ستار | Javid Sattar</author>
                <pubDate>Wed, 24 May 2023 14:38:49 +0330</pubDate>
            </item>
            </channel>
</rss>