<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات devAndroid</title>
        <link>https://virgool.io/devAndroid/feed</link>
        <description>مرجع توسعه دهنده های اندروید</description>
        <language>fa</language>
        <pubDate>2026-06-16 10:44:39</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/zbvpwt8h0uzp/vtrvqk.png</url>
            <title>devAndroid</title>
            <link>https://virgool.io/devAndroid</link>
        </image>

                    <item>
                <title>مقایسه امنیت اندروید و آی او اس (Android vs iOS)</title>
                <link>https://virgool.io/devAndroid/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%A7%D9%85%D9%86%DB%8C%D8%AA-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D9%88-%D8%A2%DB%8C-%D8%A7%D9%88-%D8%A7%D8%B3-android-vs-ios-t0xchgix43fj</link>
                <description>مقایسه امنیت اندروید و آی او اس (Android vs iOS)امروزه همواره یکی از مهمترین مسائل برای دارندگان گوشی‌های موبایل، بالاتر بودن امنیت دو سیستم‌عامل اندروید و آی‌اواس است تا برای کاربران مشخص گردد کدام‌یک می‌تواند بهتر از اطلاعاتشان محافظت کند. همان‌طور که می‌دانیم سیستم‌عامل اندروید توسط گوگل پشتیبانی و توسعه یافته است. این سیستم‌عامل به‌صورت متن باز بوده و هر شرکت سازنده گوشی موبایل می‌تواند از آن بر روی گوشی‌های موبایل خود استفاده کند. از جمله شرکت‌های معروف در این زمینه نیز می‌توان به سامسونگ اشاره نمود که با نصب سیستم‌عامل اندروید بر روی گوشی‌های موبایل خود، طرفداران بی‌شماری را دارد. اما در مقابل سیستم‌عامل آی‌اواس فقط توسط شرکت اپل و برای محصولات خود طراحی گردیده است. این شرکت امریکایی با تولید سالانه دو و یا سه گوشی و تبلت، به مقابله با سیستم‌عامل معروف اندروید پرداخته است.همچنین بخوانید : 10 مورد از مهمترین ویژگی های iOS 13بررسی ویژگی‌های امنیتی اندروید و iOSاگر بخواهیم به‌ بیان برتری امنیتی دو سیستم‌عامل معرفی شده بپردازیم، ابتدا باید بیان کنیم که هر گوشی هوشمند باید دارای چه میزان امنیت و در چه حدی باشد تا در ادامه بتوانیم با بررسی‌های لازم متوجه گردیم که سیستم‌عامل‌ها می‌توانند موارد مذکور را داشته باشند یا خیر. پس در حال حاضر ابتدا باید به بررسی میزان امنیت لازم گوشی‌های موبایل بپردازیم.امکان داشتن نظارت بر روی موبایل برای حذف برنامه بلوت ویر، قفل، پسورد و پین‌کد نظارت بر فروشگاه برنامه‌ها برای دانلود خودکاراز بین بردن باگ و امکان اپدیت سیستم‌عاملنگهداری گوشی در مقابل نرم‌افزارهای مخرب نظیر باج‌افزارهاال با دانستن موارد بیان شده، در این مقاله و در ادامه به‌بررسی امنیت دو سیستم‌عامل اندروید 8 و آی‌اواس 11میپردازیم.امنیت اندروید و آی‌ او اس در زمینه اپلیکیشن هامقایسه امنیت اندروید و آی او اس (Android vs iOS)همه ما می‌دانیم که اگر یک کاربر بتواند بر تمامی کارایی گوشی موبایل خود تسلط و کنترل داشته باشد، بسیار مفید است. اما در واقعیت این مسئله وجود نداشته و هر دو سیستم‌عامل یاد شده دارای برنامه‌های غیر مفید و ضروری برای کاربر و همچنین وجود اپدیت‌های مختلف و گاها بی اطلاع بوده که باعث هدر رفتن فضای حافظه داخلی و میزان حج اینترنت کاربران می‌گردد. اماحال باید بررسی نمود که دو سیستم‌عامل یاد شده تاچه حدی این موضوعات را برای کاربران خویش محدود کرده‌اند.آی‌اواسسیستم‌عامل آی‌ او اس دارای برنامه‌های زیاد بلا استفاده‌ای است. اما در نسخه 11این سیستم‌عامل، برخی از برنامه‌ها اجزای پاک کردن پیدا کرده که کاربران می‌توانند نام آن‌‌ها را در سایت اپل مشاهده کنند. باید گفت این موضوع بسیار مفید و مورد علاقه کاربران بوده اما بهتر است برای داشتن امنیت بیشتر، کاربر اقدام به حذف آن‌ها نکند. باید گفت اگر کاربر به‌صورت ناچار باید این برنامه‌ها را پاک کند، بهتر است دیگر به‌دنبال جایگزینی برای آن‌ها نباشد. چرا که این برنامه‌ها توسط خود شرکت اپل تولید گردیده و این شرکت امنیت آن‌ها را تضمین کرده است. حال برای پاک کردن برنامه‌ها در این سیستم‌عامل باید آن‌ها را نگه داشته و بعد از به‌حرکت در آمدن آن و ضربه زدن بر روی آن، گزینه Delete را زده و بعد کلید Home را لمس کنید.اندرویدباید گفت سیستم‌عامل اندروید دارای تفاوت‌هایی با آی‌اواس هست. همان‌طور که بیان شد مسئولیت توسعه و بهره‌برداری از این سیتم‌عامل با شرکت گوگل بوده اما به‌دلیل متن باز بودن آن، شرکت‌های دیگری نیز اقدام به استفاده از آن کرده و برنامه‌های پیش‌فرض مدنظر خود را بر روی گوشی موبایل خود نصب می‌کنند که در این صورت تعداد بولوت‌ویرها در این سیستم‌عامل بیشتر از آی‌اواس است. به‌عنوان مثال در محصولات جدید پرچمدار شرکت سامسونگ، امکان غیرفعال‌سازی دستیار صوتی بیکسبی صرفا در حالتروت کردن گوشی امکان‌پذیر بود که سامسونگ با ارائه یک اپدیت لازم، این مورد را حل کرد. باید گفت این تیپ مشکلات صرفا برای سامسونگ نبوده و شرکت‌های دیگر گاها با داشتن نرم‌افزارهای پیش‌فرض بیشتر و در ادامه مجبور کردن اپراتورها به استفاده از برنامه‌ها و سرویس‌های موجود، باعث می‌گردند تا کاربر در این مورد آزادی عمل کمتری داشته و لذا نتواند برنامه‌های پیش‌فرض را به‌راحتی حذف کند.باید گفت این سیستم‌عامل بر خلاف آی‌اواس توسط کمپانی‌های سازنده گوشی توسعه می‌یابد و این کمپانی‌ها با سفارشی‌سازی این سیستم‌عامل، باعث وجود باگ‌هایی در آن می‌گردند. در ادامه به خاطر زیاد بودن گوشی‌های تولیدی یک شرکت، کمپانی مربوطه ززمان لازم برای انتشار اپدیت برای تمامی گوشی‌های قدیمی خود را نداشته و لذا برخی از این گوشی‌ها امکان از بین بردن باگ موجود را ندارند. به‌عنوان نتیجه‌گیری از بحث‌های بیان شده باید گفت که آی‌اواس به‌صورت یک سیستم‌عامل بسته بوده و هر شرکتی جز اپل امکان داشتن آن را ندارد. این کار موجب می‌گردد تا امنیت این سیستم‌عامل بالاتر رفته و امکان حذف برنامه‌های پیش‌فرض در آن راحت باشد. اما در سیستم‌عامل رقیب، به‌دلیل متن باز بودن توسط هر شرکنتی می‌تواند مورد استفاده قرار گیرد که این مورد باعث محدود شدن برای حذف برنامه‌های پیش‌فرض سیستمی می‌گردد.همچنین بخوانید : راه های افزایش سرعت گوشی اندرویدیقفل کردن، پین‌ها و پسورد در android و iOSهمان‌طور که می‌دانیم، برای امنیت بیشتر گوشی موبایل، استفاده از روش‌های مختلف برقراری منیت گوشی یک مسئله مهم است. در این خصوص روش‌های مختلفی نظیر استفاده از پین‌کد، پسورد و .... وجود دارد که باید دید کدام یک از این سیستم‌عامل‌ها در این زمینه کارایی بهتری دارد.آی‌ او اسبا منتشر شدن آی‌اواس 11t کاربران زیادی به این سیستم‌عامل گرئویدند. یکی از نکات مثبت و جالب این سیستم‌عامل برای برقراری امنیت، سیستم تشخیص چهره بود. البته این مورد قبلا توسط سیستم‌عامل رقیب به‌کار گرفته شده بود اما این بار با تکنولوژی جدید با نام فیس‌آیدی برای آی‌اواس وجود دارد. اگر چه این ویژگی بسیار دقیق بوده و طبق نتایج گاها دوقلوهای بسیار شبیه را نیز می‌تواند تشخیص دهد، اما اخیرا کمپانی Bkavادعا نموده که با یک ماسک شبیه فرد نیز می‌توان این سیستم‌عامل را فریب داد که البته هنوز به‌طور رسمی این ماجرا اثبات نشده است.باید گفت با وجود فناوری یاد شده، اما هنوز از سال 2013 تا به حال، فناوری حسگر اثر انگشت به نظر خیلی از کاربران دارای امنیت بالاتری است. این مورد برای تمامی گوشی‌های آیفون به جز آیفون ایکس صادق بوده که کاربر با لمس حسگر اثر انگشت می‌تواند قفل صفحه را باز کند. البته این مورد نیز توسط برخی از کرها از بین می‌رود اما باید گفت طبق شواهد موجود، غالبا فناوری تشخیص اثر انگشت از تشخیص چهره بسیار امنیت بیشتری داشته و لذا کاربردی‌تر است.باید گفت فناوری تشخیص اثر انگشت دارای امنیت بیشتری نسبت به پین‌کد و پسورد بوده اما همچنان دارای باگ‌هایی است که شرکت اپل تلاش می‌کند تا آن‌ها را رفع کند. به‌عنوان مثال گاها هکرها با فشردن پنج‌بار پشت سر هم دکمه خاموش/روشن گوشی و رفتن به حالت اضطراری و تماس با شماره‌ها ضروری، حسگر اثر انگشت را از بین می‌بردند.البته به جز روش‌های بیان شده روش‌های دیگری برای امنیت گوشی‌های اپل وجود دارد که عبارت‌اند از: پسورد 6 حرفی ، پسورد 4رقمی، پسورد عددی بدون محدودیت تعداد عدد و رمز ترکیبی از حروف و اعداد.باید گفت در صورت استفاده از رمز عددی و فعال کردن حذف داده‌های گوشی، در صورت وارد نمودن 10 بار رمز اشتباه، تمامی داده‌ها و اطلاعات گوشی حذفمی‌گردد. اگر این مورد فعال نباشد و 10بار رمز عددی اشتباه وارد شود، صرفا فقط به‌وسیله برنامه آیتوز می‌توان وارد گوشی موبایل شد.اندرویدباید گفت باز کردن قفل صفحه گوشی موبایل توسط فناوری تشخیص چهره، سال‌ها قبل توسط اندروید معرفی گردیده بود. اما فریب دادن این سنسور برای اندروید توسط حرها بسیار راحت‌تر بوده به‌نحوی که بیان شده سیستم تشخیص چهره گوشی گلکسی اس8سامسونگ با یه عکس از شخص، فریب هکرها را میخورد. البته باید گفت امنیت سیستم‌عامل اندروید توسط مدل‌های مختلف گوشی و کمپانی‌های تولید کننده، متفاوت بوده به نحوی که سامسونگ در پرچمدار سال 2017 خود از سنسور عنبیه چشم بهره برده است. در هر حال از جمله سیستم‌عامل‌های امنیتی که گوگل برای اندروید نسخه 8استفاده کرده، می‌توان به موارد زیر اشاره کرد.کشیدن انگشت به طرفین: روش بیان شده برای امنیت نبوده و صرفا از اجرای برنامه‌های به‌صورت خودکار حین قرار دادن در جیب جلوگیری می‌کند.کشیدن الگوی رمز: این روش را نیز برای برخی از برنامه‌ها به‌عنوان قفل مورد نیاز بر روی آن‌ها می‌توان مشخص نمود. اما گاها با نگاه کردن بر روی صفحه‌نمایش به‌علت رد اثر حرکت می‌توان آن را تشخیص داد.پین: می‌توان یک پین‌کد تا حداکثر 16 رقم را تعیین کرد که امنیت متوسطی دارد.پسورد: تفاوت این مورد با پین‌کد، استفاده کردن هم‌زمان از عدد و حرف بوده که تعداد آن 16حرف و رقم است.برای اندروید باید گفت بهترین روش استفاده ترکیبی از مارد بیان شده است. به‌عنوان مثال با وجود حسگر اثر انگشت و پین‌کد، هر کدام از کار بیوفتند، دیگری حضور خواهد داشت.باید گفت حالت متن باز بودن برای سیستم‌عامل اندروید دارای مزایا و معایبی است. به‌عنوان مثال این مورد باعث می‌گردد تا کرک کردن اندروید راحت‌تر بوده و به گفتی بعضی افراد، قفل ترسیمی توسط هکرها در کمتر از 5 دقیقه باز گردد و یا به‌وسیله روش‌های موجود بتوان به مرکز این سیستم‌عامل نفوذ پیدا کرد. اما باید گفت متن باز بودن این سیستم‌عامل باعث گردیده تا بتوان برنامه‌های امنیتی زیادی را برای این سیستم‌عامل تولید کرد. همچنین با حالت قفل هوشمند این سیستم‌عامل می‌توان به سیستم وای‌فای متصل شد اما دستگاه همچناندر حالت قفل به سر ببرد.اما باید گفت در این بخش همانند بلوت‌ویر که بیان کردیم، برخی از سیستم‌عامل اندروید توسعه داده شده توسط گوگل که به‌صورت خام است، با شخصی‌سازی توسط شرکت‌ها و کمپانی‌های سازنده گوشی موبایل، دارای مشکلات امنیتی شده است.امنیت اپ استور و گوگل پلی استورامنیت اپ استور و گوگل پلی استور  همان‌طور که می‌دانیم دو فروشگاه مجازی تامین کننده برنامه‌ها برای دو سیستم‌عامل مذکور یعنی همان آی‌اواس و اندروید، به‌ترتیب اپ استور و گوگل پلی استورهستند که توسط اپل و گوگل حمایت می‌گردند. بسیاری از برنامه‌ها در هر دو فروشگاه موجود بودهاما باید میزان امنیت هر دو بررسی گردد. در این خصوص باید گفت هر دو فروشگاه در عرض چند سال اخیر با درس گرفتن از یکدیگر تا حدودی پیشرفت داشته‌اند منتها باید بررسی بهتری انجام بگیرد. ند منتها براید ببررسی تخصصی‌تری انجام گردد.همچنین بخوانید : آموزش ساخت اپل آیدی رایگان (Apple ID)اپ استورباید گفت طبق شواهد موجود، فروشگاه اپل دارای امنیت بیشتری است. چرا که تلاش می‌کند تا تمامی برنامه‌های موجود بر روی فروشگاه خود را بررسی کند و در صورت لزوم آن‌ها را پاک کند. البته باید گفت این فروشگاه بدون عیب و ایراد نیست. طبق شواهد، در سال 2015 این برنامه به ویروس XCodeGhost در صد برنامه خود آلوده شد که این شرکت فورا برنامه‌ها را حذف نمود. همچنین در سال‌های قبل‌تر همWireLurker ،Masque Attack و AceDeceiver باعث ایجاد مشکلاتی در کنار مشکلات SSL شده بودند که در حال حاضر اپل آن‌ها را رفع کرده است. جالب است بدانید که شرکت اپل در هنگام بارگذاری برنامه‌ها برای فروشگاه خود، هر گونه برنامه‌ای که که قوانین را رعایت نکند و یا با داشتن کدهای غیر معمول و تبلیغات، مقررات اپل را نقض کند، به‌سرعت از این فروشگاه پاک می‌گردد. باید گفت این سخت‌گیری‌ها به‌دلیل وجود گزارش‌های دوره‌ای شرکت Skycure می‌باشد و برای همین این سخت‌گیری‌ها وجود دارد.گوگل پلی استورموارد بیان شدن از قبیل بدافزارها برای فروشگاه اندرویدی بیشتر است. دلیل آن امنیت کم این سیستم‌عامل نیست. چرا که با وجود بسیار بیشتر بودن گوشی‌های اندرویدی نسبت به محصولات رقیب، شرکت‌ها فرصت چندانی برای ارائه اپدیت برای همه گوشی‌های موبایل نداشته و این کار را صرفا برای پرچمداران خود انجام می‌دهند و باعث می‌گردند تا هکرها این گوشی‌ها را انتخاب کنند. به‌عنوان مثال برای بدافزارها باید گفت یک سری از برنامه‌های مخرب تا میزان 4.2 میلیون بار دانلود شده بودند. شرکت Check Point اعلام نمود که با حذف برخی از این برنامه‌ها اما برنامه‌های جدیدتر وجود داشته که کاربران به سمت آن‌ها هدایت می‌شوند. همچنین برخی کاربران خبر از برنامه‌های مضر Judy،ExpensiveWall ،Googlian ،Godless و SonicSpyداده‌ بودند.چون این سیستم‌عامل محبوب است مانند ویندوز که سال‌های زیادی است مورد حملات اینترنتی قرار می‌گیرد، این سیستم‌عامل نیز همواره این موارد خرابکارانه در آن باقی است که کاربر باید ریسک داشتن آن را بپذیرد و خود مراقب باشد. فناوری  Google Play Protect هم چندان اثری نداشته و هکرها می‌توانند از آن عبور کنند. به‌دلیل متن باز بودن این سیستم‌عامل، هر شخصی می‌تواندبرنامه خود را بنویسد و به کاربران انتقال دهد و بعد از نصب توسط آن‌ها، موارد خرابکارانه خد را بر روی آن برنامه اجرا کند و گوگل نیز اصلا این مورد را متوجه نشود.پس نتیجه‌گیری می‌کنیم که برتری آی‌اواس در این بخش مشهود است. در واقع اپل با بستن سیتم‌عامل خود موجب نظارت کامل بر روی همه برنامه‌های آن شده و هر شخصی اجازه ندارد تا یک برنامه را برای دانلود کاربران قرار دهد. از این رو کمتر برنامه‌ای را می‌یابیم که کاربر بتواند خارج از اپ‌استور اقدام به نصب آن کند. اما در اندروید، هر شخصی به‌راحتی می‌تواند برنامه‌ای را تولید کرده و از طریق سایت خود اقدام به عرضه برای کاربران کند.باگ‌ها، رخنه‌های امنیتی و استمرار آپدیت‌ها در اندروید و آی او اسمقایسه امنیت اندروید و آی او اس (Android vs iOS)یکی از دلایل استفاده کاربران از محصولات اپل، کمتر بودن باگ‌های این محصولات است. این مورد درست بوده و همواره اپل سعی کرده تا باگ‌های کمتری در سیستم‌عاملش داشته باشد و با ارائه اپدیت‌هایی آن‌ها را تا حد امکان رفع کند. باید گفت این ارائه اپدیت در سال‌های اخیر برای هر دو سیستم‌عامل زیادتر شده و تلاش می‌کنند باگ‌های خود را رفع کنند. باید گفت با انتشار آی‌اواس توسط اپل برای اپدیت، تمامی ویژگی‌ها نظیر برنامه‌ها، شماره‌گیر، دستیار سیری و ... نیز آپدیت می‌شوند و مورد پشتیبانی طولانی‌تری قرار می‌گیرند. اما در طرف مقابل درست است که بسیاری از گوشی‌ها نهایتا یک یا دو سا اپدیت را دریافت می‌کنند اما مزیت بزرگ آن پشتیبانی کردن دستگاه‌های قدیمی از برنامه‌های جدید است تا موجب گردد طرفداران زیادی برای این سیستم‌عامل پدید آید.آی‌اواسشرکت آمریکایی اپل تلاش کرد که همواره امنیت را سر لوحه امور خویش قرار دهد. برای این منظور ویژگی سندباکسینگ را برای این سیستم‌عامل قرار داد. به‌وسیله این ویژگی تمامی برنامه‌ها به‌صورت مستقل اجرا پیدا کرده و فایل‌های سیستم از دسترسی برنامه‌های مخرب و همچنین دسترسی سایر گوشی‌های موبایل به آن‌ها در امان می‌ماند. این موضوع سبب می‌گردد تا امنیت کاربران افزای پیدا کرده و از این رو راضی باشند. بر همین عقیده شرکت اپل تعدادی از برنامه‌های آنتی‌ویروس را در سال 2015 حذف نمود چرا که اعتقاد داشت باعث می‌گردند تا به گوشی موبایل صدمه بزنند.اندرویددر خصوص امنیت برای این سیستم‌عامل نیز دارای ویژگی‌های مفیدی از جمله همان سندباکسینگ و یا Android Application Sandbox است. مثل آی‌اواس اینجا هم فایل‌های اطلاعتی برنامه‌ها کاملا ایمن و حفظ شده و برای ارتباط برنامه به این فایل‌ها، لایه‌های محافظتی وجود دارد. اما در این خصوص دو تفاوت مهم بین دو سیستم‌عامل بیان گردیده وجود دارد. اول اینکه برنامه‌های موجود که توسط کاربران کنترل می‌شوند ممکن است استفاده نادرستی از فایل‌ها کنند. امامورد دوم که بسته به نوع اندروید است، در معرض قرار گرفتن بیشتر این سیستم‌عامل به‌دلیل متن باز بودن آن است. شرکت سیمنتک در سال 2014 و 2015 بیان کرد که تعداد زیادی از این بدافزارها برای سیستم‌عامل اندروید کاهش پیدا کرده اما تغییرات موجود افزایش داشته است. پس در کل باید گفت هر دو سیستم‌عامل دارای امنیت خوبی برای کاربران است امابه‌دلیل متن باز بودن اندروید، برنامه‌های مخرب برای آن بیشتر توسعه داده شده و می‌تواند راحت‌تر توسط هکرها مورد حمله قرار گیرد.نتیجه‌گیریامنیت اندروید و آی او اسدر کل در بخش نتیجه‌گیری باید گفت سیستم‌عامل آی‌اواس دارای برتری‌های امنیتی بیشتری به‌صورت پیش‌فرض نسبت به سیستم‌عامل رقیب است. گفتیم به‌صورت پیش‌فرض چرا که کاربران با نصب برنامه‌های مختلف امنتی بر روی اندروید می‌توانند امنیت آن را بهبود داده و با داشتن دقت در مورد نصب نوع برنامه‌های خود، می‌توانند امنیت گوشی موبایل اندرویدی خود را بالا ببرند.</description>
                <category>devAndroid</category>
                <author>Datismart</author>
                <pubDate>Sun, 20 Oct 2019 19:29:21 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم Declarative UI یا رابط کاربری اعلانی</title>
                <link>https://virgool.io/devAndroid/%D9%85%D9%81%D9%87%D9%88%D9%85-declarative-ui-%DB%8C%D8%A7-%D8%B1%D8%A7%D8%A8%D8%B7-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DB%8C-%D8%A7%D8%B9%D9%84%D8%A7%D9%86%DB%8C-n74m3jhpl9cw</link>
                <description>اول از همه بگم این پست ویرایش خواهد شد ، اگر ایرادی در آن میبینید حتما اعلام کنید.در مسیر یادگیری فریمورک Flutter من به موردی برخوردم که تا حالا بهش توجهی نکرده بودم و اون هم declarative UI بود و خوب طبق معمول گوگل کردم و طبق معمول توی منابع فارسی چیزی پیدا نکردم! که این مفهوم رو توضیح بده پس رفتم دنبال منابع انگلیسی.(یکم تو زبان مشکل دارم متاسفانه ?‍♂️)به طور خلاصه : در  Declarative UI شما فقط تعریف میکنید که چی میخاین!در واقع شما در این الگو ( syntax)  فقط میگین که چه عنصری نیاز دارید و به چه شکل و کاری به نحوه تولید اون نداریدبا یه مثال زبان HTML  بهترین مثال برای این نوع برنامه نویسی هست. در این زبان (میدونم! زبان نیست?) با استفاده از css فقط تعریف میکنید که تصویری با اندازه 100*100 نیاز دارین ، ولی از نحوه انجام این کار در مرورگر های مخطلف اطلاعی ندارید.#myImageId {  height: 100px;  width: 100px; }در مقابل declarative ما imperative  رو داریم که شما مجبورید توصیف کنید که چه چیزی به چه شکلی باید باشد.مثلا در مثال اندازه تصویر در imperative  باید با توابع خاص اون زبان اقدام به تغییر اندازه کنید که گرفتن ، خواندن پیکسل به پیکسل و ذخیره و موارد دیگه رو حودتون انجام میدین.چون فریمورک Flutter یک فریمورک cross-platform هست و برای android , ios و web میتونید خروجی بگیرید پس از برنامه نویسی declarative استفاده شده و شما فقط بیان می کنید به یک edittext نیاز دارید و تمام.نکته : بین declarative ui و declarative programming فرقی وجود ندارد همینطور بین imperative ui و imperative programming و بیشتر با پسوند programming میشناسنش.مزایای  declarative programming :افزایش سرعت توسعه نرم افزارادغام یکپارچه بین طراحی و برنامه نویسیکد کمتر!همون کد کمتر :)نمونه ای از زبان های declarative :زبان sql زبان prologزبان نشانه گذاری xmlمنابع :stack overflowcourses.csail.mit.edu</description>
                <category>devAndroid</category>
                <author>Ahmad H</author>
                <pubDate>Sat, 05 Oct 2019 20:00:55 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت برنامه‌های نیتیو در iOS و Android</title>
                <link>https://virgool.io/devAndroid/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%87%D8%A7%DB%8C-%D9%86%DB%8C%D8%AA%DB%8C%D9%88-%D8%AF%D8%B1-ios-%D9%88-android-gaxg2hai9lhu</link>
                <description>برای طراحی بهترین اپ‌های نیتیو، شما باید تفاوت بین پلتفرم‌های iOS و اندروید را بدانید. این سیستم عامل‌ها نه تنها از نظر برنامه‌های نیتیو متفاوتند، بلکه از لحاظ ساختاری نیز متفاوت می‌باشند. شما باید این تفاوت‌ها را در نظر داشته باشید تا بتوانید بهترین تجربه کاربری (UX) را از طریق طراحی اپلیکیشن نیتیو خود ارائه دهید.نیتیو اپلیکیشن‌های موبایل برای iOS و Android دارای ویژگی‌های خاص عملکردی اجرایی هستند. داکیومنت‌های Apple و Google توصیه می‌کنند که سیستم عامل کنترل استاندارد راهبری را هرزمانی که ممکن است استفاده کنید : کنترل صفحات، نوار صفحه، کنترل بخش، جدول نمایش‌ها، کالکشن ویو، و اسپیلیت ویو.کاربرها با چگونگی کار این کنترل‌ها روی هر سیستم عامل را میدانند بنابراین اگر شما از استاندارد کنترل استفاده کنید، کاربران شما مستقیما میفهمند که چطور به اپ شما دست پیدا کنند. ما روی تفاوت‌های اصلی بین اثر متقابل الگوهای طراحی روی iOS و Android برای توضیح اینکه چگونه اپ‌ها روی iOS و Android متفاوت دیده می‌شوند یا اینکه چگونه باید متفاوت دیده شوند تمرکز کنیم. همچنین ما الگوهای طراحی نیتیو اپ و نمونه‌های نیتیو اپلیکشتن موبایل را ارائه میدهیم تا به تجسم درباره انچه میخواهیم صحبت کنیم، کمک کنیم.تفاوت در الگوهای ناوبری(Navigation)تفاوت الگوهای راهبردی بین صفحات در حال حرکت یک عملکرد رایج در اپلیکیشن‌های موبایل هستند. توجه به اینکه iOS و Android دارای راهنماهای طراحی نیتیو اپ متفاوت به هنگام تبدیل به الگوهای راهبردی هستند مهم است. در قسمت پایینی دستگاه‌های Android یک نوار راهبردی جهانی وجود دارد. استفاده از دکمه پشتی در نوار راهبری راه ساده ای برای برگشتن به صفحه یا قدم قبلی است ، و این تقریبا در تمامی اپ‌های Android کارایی دارد.Global navigation bar (Android) از طرف دیگر نوار راهبری جهانی Android، در رویکرد طراحی Apple مقداری متفاوت است. نوار راهبری در اپل وجود ندارد، بنابراین ما در طراحی نیتیو اپ iOS نمی‌توانیم با استفاده از یک دکمه پشتی به عقب برگردیم. که این کار مسبب طراحی اپلیکیشن‌های موبایل iOS میشود. صفحات درونی باید یک نوار نیتیو راهبردی همراه با یک دکمه پشتی در گوشه چپ قسمت بالایی داشته باشند.Back button (iOS) همچنین Apple شامل یک حالت ضربه‌ای از چپ به راست در اپلیکیشن‌های که به صفحه قبل میروند میشود. این ویژگی تقریبا در تمامی اپ‌ها کارایی داردLeft-to-right swiping gesture — go back (iOS) تفاوت بین iOS و Android در این زمینه این هست که دستگاه های iOS حالت ضربه ای چپ به راست شما را به صفحه قبل برمیگرداند. همان حالت در دستگاه های Android نوارها را جابجا میکند. اما در تفاوت با iOS، یک نوار راهبردی در قسمت پایین همراه با دکمه پشتی در دستگاه‌های اندروید وجود دارد که شما را به صفحه قبل برمیگرداند.همیشه مهم است که تفاوت بین سیستم عامل با سایر اپلیکیشن‌های موبایل درارتباط با ثبات همیشگی را بدانید.Left-to-right swiping gesture — switch between tabs (Android) الگوهای راهبردی داخلی اپ در iOS و Android متفاوت هستندتعداد اختیارات راهبردی کمی در راهنماهای متریال دیزاین وجود دارد. یکی از معروف‌ترین الگوهای راهبردی در اپلیکیشن‌های اندروید تلفیقی از نوارها و یک دراور (Drawer) راهبردی است.دراور راهبری یک منو است که به صورت کشویی با فشار دادن آیکون منو همبرگر از چپ به راست انجام میشود. نوارها در قسمت پایین عنوان صفحه سمت راست قرار دارد و حجم سازماندهی را در لول بالاتر فراهم میکند و به کاربران اجازه میدهد تا بین نمایه‌ها یا صفحه‌های کاربردی یک اپ جابجا شوند.Left — drawer navigation menu; right — tabs (Material Design) همچنین در متریال دیزاین یک جزء بنام راهبرد تحتانی (Bottom navigation) وجود دارد. این جزء همچنین برای یک متریال دیزاین نیتیو اپ دارای اهمیت است. نوارهای راهبرد تحتانی برای جستجو و جابجایی بین نمایش‌های تاپ لول در یک تک ضربه کار راه راحت میکنند. راهنماهای متریال دیزاین استفاده همزمان از راهبرد تحتانی و نوارها را توصیه نمی‌کنند زیرا باعث آشفتگی در حین راهبرد میشود.Bottom navigation (Material Design) در راهنماهای Apple هیچ کنترل راهبرد استانداردی که مشابه منو دراور راهبرد باشد نداریم. در عوض، راهنماهای Appleقراردادن راهبری جهانی را در نوار ابزار توصیه میکند. نوارابزار در قسمت پایینی صفحه اپ قرار دارد و توانایی جابجایی سریع بین قسمتهای مختلف اپ را تامین میکند.معمولا، نوار ابزار حاوی بیشتر از ۵ مقصد نیست. همانطور که ما می‌توانیم ببینیم، این اجزا شبیه راهبرد تحتانی در متریال دیزاین هستند اما اکثرا در اپ‌های iOS مورد استفاده قرار میگیرند.Top left — iOS segmented control; bottom right — iOS tab bar (HIG) اگرچه عوامل مشابهی عملکردهای یکسانی در دو سیستم اجرا میکنند (نوارها و سگمنت کنترل، راهبرد تحتانی و نوار ابزار)، راهبری هنوز یکی از تفاوت‌های اصلی بین iOS و Android هستند. تفاوت‌های عینی در هردو وجود دارد، مانند نوار راهبری جهانی در Android و کمبود آن در iOS، همانند تفاوت‌های تصویری از این دو سیستم.اپل معتقد است که عوامل راهبری باید در پیش نما باشد و منوی همبرگر باید تنها برای ذخیره عملکردهایی که اجرای کاربردی روزانه توسط کاربرها ندارند استفاده میشوند. از طرف دیگر این امر رایج است که راهبری اولیه در منوی همبرگر در اپلیکیشنهای اندروید مخفی شوند.نمایش‌های سفارشی برای کنترل‌های استاندارد خواهان زمان توسعه یافته اضافی است و برای کاربران ناشناس استاگر شما می‌خواهید هر عامل در اپلیکیشن شما شبیه آن طرف سیستم عامل باشد، شما نیازمند تلاش توسعه یافته‌ای برای ساخت بهترین طراحی موبایل هستید. پیچیده‌ترین موارد استفاده شامل کنترل‌های دیفالت مانند دکمه‌های رادیو ، چک باکس‌ها، ضامن‌ها، و غیره که خواهان یک اجرای نمایش سفارشی برای نشان دادن کنترل‌های مشابه iOS روی اندورید یا کنترل های مشابه اندروید روی iOS.هر سیستم عامل فعل و انفعالات خاص خود را دارد. بهترین طراحی، طراحی‌ای است که عادات کاربر را در هر سیستم اجرایی مورد نظر داشته باشد. به یاد داشتن تفاوت‌های بین سیستم عامل‌ها به هنگام طراحی یک اپلیکیشن موبایل برای iOS و Android مهم است بنابراین شما اپلیکیشن‌هایی را که توقعات کاربران را برطرف میکند طراحی می‌کنید.یک نمونه از عاملی که بطور نمونه روی هردو سیستم عامل طراحی شده است یک دیت پیکر (date picker) است. کاربران اندروید با اسلات ماشین حالت حلقه ای انتخاب کننده تاریخ که در iOS رایج است آشنا نیستند. استفاده از این استایل دیت پیکر در اندروید خواهان نمایشهای سفارشی است، که میتواند پیچیده باشد، با افزایش پیچیدگی و دوره توسعه و بیگانه سازی طراحی اپ شما به سیستم عامل اندروید.Left — standard iOS controls; right — standard Android controls Left — standard iOS pickers; right — standard Android pickers حالت‌های دکمه‌ای در iOS و Androidدو حالت دکمه در راهنمایی‌های متریال دیزاین وجود دارد:· صاف· برافراشتهاین دکمه‌ها در موقعیت‌های مختلفی استفاده می‌شوند. حروف روی دکمه‌ها در متریال دیزاین معمولا همگی حروف بزرگ هستند. گاهی اوقات ما دکمه حروف بزرگ را در اپ‌های نیتیو هم می‌بینیم، اما اکثرا به حالت عنوان دار می‌یابیم.Left — standard Material Design buttons; right — standard HIG buttons همچنین نوعی دیگر از دکمه وجود دارد دکمه‌های Floating Action در اندروید و فراخوان به عمل در iOS. یک دکمه عملکرد متغیر فعالیت اولیه در یک اپلیکیشن را به نمایش می‌گذارد. برای مثال دکمه تنظیم کننده در یک اپ پیامرسان یا دکمه پست جدید در یک رسانه اینترنتی می‌تواند دکمه فعالیت متغیر باشد.طراحی انالوگ برای فعالیت اولیه در اپ‌های iOS دکمه فراخوان به فعالیت است که در مرکز نوار ابزار قرار گرفته است.Left — standard floating action button in iOS; right — standard CTA button in Android تفاوت‌های موجود در صفحات پایینی نیتیو در Android و صفحات عملکرد و نمایش های فعالیت در iOSدو نوع صفحات تحتانی در Android وجود دارد :صفحات تحتانی مقید (Modal Bottom Sheets) و صفحات تحتانی پایا (Persistent Bottom Sheets).صفحات تحتانی مقید دو نوع محتوی دارند: صفحات تحتانی مقید با عملکرد متفاوت و یک اپ لیست که بعد از ضربه کاربر روی آیکون اشتراک نمایان میشود. ما می‌توانیم محتوای یکسانی در صفحات عملکرد نیتیو iOS و نمایش‌های فعالیت‌ها پیدا کنیم. ولی این اجزا با صفحات تحتانی اندروید متفاوت اند.Left — standard Material Design bottom sheets; right — action sheet in iOS app ‌تفاوت‌ها در اهداف لمسی و شبکه‌هاiOS و Android راهنمایی‌های تقریبا متفاوتی برای اهداف لمسی دارند.(44px @1x for iOS and 48dp/48px @1x for Android).راهنمایی‌های متریال دیزاین همچنین ردیف کردن همه عوامل برای یک مربع 8dp شبکه مبنا را توصیه میکند.تفاوت‌های نشانه‌ایسن فرانسیسکو سیستم طرح حروف در iOS است. روبوتو طرح حروف استاندارد در اندروید است. نوتو طرح حروف استاندارد برای تمام زبان‌ها در کروم و اندروید است که توسط روبوتو پشتیبانی نمی‌شوند. شما بایدبه انجمن‌های طرح بندی و چاپی هر سیستم عامل توجه کنید.Left — Material Design typography; right — HIG typography ریز دستورهاوقتی زمان طراحی فرا میرسد، اولین حدس و گمان برای کاربران آخرین حدس و گمان است.برای همین این عمل برای جلب توجه کاربران از ابتدای امر بسیار حائز اهمیت است. در طی طراحی اپ و توسعه، ما می‌توانیم تجربه جذابی برای کاربران در طی ریزدستورها و تحرک‌ها بسازیم.حال میخواهیم قوانین بزرگتر(مهمتر) و توصیه‌هایی در ارتباط یا فعل و انفعالات و حرکت‌ها برای هردو سیستم عامل را توضیح دهیم و به نمونه‌های همراه با جزئیاتی نگاهی بیندازیم.توجه و اهمیت فعل و انفعالات تمرکز روی توجه کاربران در آنچه که حقیقتا در اپ‌ها اهمیت دارد، بنابراین استفاده از آن‌ها فقط زمانی که واقعا خواسته شده‌اند لازم است. هردو سیستم عامل تحرک بیش از اندازه را سست می‌کند همانطور که کاربران را گیج و خسته می‌کنند.ثبات و سلسه مراتب بسیار حائز اهمیت است که بدانیم فعل و انفعالات به کاربران کمک می‌کند تا خود را دریک جهت با نشان دادن اینکه چگونه عوامل دیگر بهم مرتبط‌اند، در اپ هدایت کنند. راحت و محبوب است جابجایی از یک صفحه به صفحه دیگر و کاربران را مجذوب می‌کند. تحرک‌ها حاکی از چگونگی اجرای عملکردها است و توصیه‌های کمک کننده‌ای را پیشنهاد میدهد.اگرچه توصیه اصلی برای استفاده از میکرو انیمیشن‌ها تقریبا در راهنماهای متریال دیزاین و HIG مشابه است، اما تفاوت‌هایی وجود دارد که بطور واضح توضیح داده شده است. کاربران به این سیستم عامل‌های خاص عادت دارند و آن‌ها را طبیعی می‌دانند.به همین دلیل توجه خاص به فعل و انفعالات آشنایی که تجربه کاربر را بهبود می‌بخشند و در هر سیستم عامل طبیعی جلوه می‌کنند بسیار مهم است.iOSکاربران iOS به انیمیشن‌های دقیق که در iOS استفاده شده، مانند جابجایی راحت عادت کرده‌اند، تغییرات روان در جهت‌یابی و ثبت فیزیکی‌. کاربران iOS می‌توانتد به هنگام حرکت‌هایی که منطقی نیستند یا قوانین فیزیک را به چالش بر می‌انگیزند احساس بی نظمی داشته باشند. اگر یک کاربر با پایین کشیدن صفحه یک نمایش از بالا را آشکار کند، برای مثال آن‌ها توقع دارند که بتوانند با به عقب کشیدن آن نمایش را تمام کنند. HIG به شدت ساختن یک تجربه عمیق مثل یک بازی را توصیه می‌کند مگر اینکه شما جابجایی‌های سفارشی را برای ساخت در انیمیشن‌ها قابل مقایسه کنید.Androidباتوجه به راهنماهای متریال دیزاین، در طی یک جابجایی، عوامل مشترک که تبدیل شده‌اند بصورت خروجی، ورودی یا ثابت طبقه بندی شده‌اند. دسته بندی مورد نظر که آیتم‌ها به آن وابسته‌اند در چگونگی تبدیل شدن آن موثرند.یک انیمیشن توجه کاربران را هدایت میکند. وقتی یک UI ظاهر را تغییر میدهد، حرکت آن پیوستگی بین موقعیت مکانی و ظاهر عوامل را قبل و بعد از جابجایی تامین میکند.جابجای‌های راهبری عامل مهمی در فعل و انفعال سراسری با یک تقابل می‌باشند. آن‌ها به کاربران کمک می‌کنند تا توسط شرح سلسله مراتب خود را عادت دهند. برای مثال وقتی یک عامل برای پر کردن صفحه کامل توسعه می یابد، عمل توسعه توضیح میدهد که صفحه جدید یک عامل کوچک است. صفحه‌ای که از آن توسعه یافته است عامل والد است.Example of a parent-to-child transition (Material Design Guidelines) از یک صفحه منشا یک عامل کوچک جاسازی شده به هنگام لمس بالا کشیده میشود و در مکان توسعه می یابد.جابجایی روی صفحه کوچک تمرکز میکند درحالی که ارتباط بین بزرگ و کوچک را تقویت میکند‌.صفحاتی که منشا یکسانی را به اشتراک میگذارند (مانند تصاویر یک آلبوم، قسمت‌های یک پروفایل، یا گام‌هایی در یک جریان) در اتحاد به تقویت رابطه آن‌ها پیش میرود. صفحه اسلایدهای جفت در یک طرف درحالی که متعلقات آن در جهت مخالف از صفحه خارج میشوند‌‌.Tabs are at the same elevation and move together on the horizontal در بالاترین لول یک اپ اهداف معمولا در کارهای عمده جمع آوری می‌شوند (که ممکن است بهم مرتبط نباشند) جابجایی صفحات در مکان توسط تغییر ارزش‌ها مانند کدر بودن و تراز آن انجام میشود.نتیجهقطعا توقعاتی وجود دارد: بعضی از اپلیکیشن‌های iOS راهنماهای متریال دیزاین را دنبال می‌کنند (مانند جیمیل) و بعضی از اپ‌های Android راهنماهای HIG (مانند اینستاگرام)Left — Gmail on iOS; right — Gmail on Android Left — Instagram on iOS; right — Instagram on Android اما یک موضوع مشخص است. با استفاده از اجزای نیتیو برای هردو سیستم عامل برای طراحی یک اپلیکیشن موبایل سریعتر است. بنابراین، بهتر است که زمان را روی طراحی صرف کنید تا اینکه یک ماکت اپلیکیشن بسازید که تلفیقی از راهنماهای HIG Apple و اجزای دیزاین متریال گوگل است، و سپس زمان زیادی در توسعه بابت عوامل سفارشی صرف کنید‌.زحمت ترجمه این مقاله رو خانم فاطمه عباسی کشیدن و من فقط ویراستاری کردمامیدوارم که از این مقاله لذت برده باشید</description>
                <category>devAndroid</category>
                <author>Mahan PoorYazdanKhah</author>
                <pubDate>Thu, 03 Oct 2019 23:18:59 +0330</pubDate>
            </item>
                    <item>
                <title>کلمه کلیدی Nothing در زبان Kotlin</title>
                <link>https://virgool.io/devAndroid/%DA%A9%D9%84%D9%85%D9%87-%DA%A9%D9%84%DB%8C%D8%AF%DB%8C-nothing-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-kotlin-wxabdcdx7664</link>
                <description>چی میشه اگه بهتون بگم یه کلاسی هست به اسم Nothing که کارش اینه که هیچ کاری نکنه!این کلاس هیج instance نداره و به یه مقداری اشاره داره که هیچ وقت وجود نداشته!این کلاس به یه مقدار بازگشتی از متد اشاره داره که هیچ وقت قرار نیست باز بگرده! والا منم نفهمیدم!گیج شدی‌!؟ این که چیزی نیست منم شدم توی کاتلین کامپایلر با داده ایی که تو به یه متغیر میدی، میفهمه که نوع اون متغیر چی هستش مثلا زمانی که میگی var a = 10 میفهمه که a یک متغیر هستش از جنس Int ولی زمانی که بهش یه نوع ندی کامپایلر میگه این نوعش Nothing  هستش، مثل var b = null الان نوع متغیر b نوع Nothing هستش. fun main() {
    var a = 10// این نوع عدد صییح هستش یا همون Int
    
    var b = null//این نوع هیچی هست Nothing
}این Nothing یعنی بدون نوع  یا حتی برای زمانی استفاده میشه که میخوای بگی، این کد هایی که دارم  هیج وقت کامپایلر قرار نیست بهشون برسه مثلا میخوای یه اررور پرت بکنی !fun partK(matenError:String):Nothing{
    throw IllegalArgumentException(matenError)
    
    //مثلا بازگشت متد اینجاهاست
}توی متد بالا میدونیم چون هیچ وقت اصن قرار نیست که متد return بشه چون اکسپشن داریم قبلش. میتونیم Nothing رو هم نزاریم اینجا و از پیشفرض خودش که Unit هست استفاده بکنیم. اما کامپایلر مطمئن نمیشه که متد قرار هست return داشته باشه یا نه قرار هست Exception بده. با ست کردن Nothing روی قسمت نوع داده بازگشتی متد، کامپایلر ما مطمئن میشه که این متد قرار نیست return داشته باشه و Exception هستش. این آخر سر دیگه بگم من مشکل ژنتیکی املا دارم و املام اصلا خوب نیست! چنل یوتوب من سایت من اینستگرام من چنل تلگرام من منبع : https://medium.com/@agrawalsuneet/the-nothing-type-kotlin-2e7df43b0111</description>
                <category>devAndroid</category>
                <author>Amirahmad Adibi</author>
                <pubDate>Tue, 01 Oct 2019 14:15:01 +0330</pubDate>
            </item>
                    <item>
                <title>پلاگین CodeGlance برای اندرویداستدیو !...</title>
                <link>https://virgool.io/devAndroid/%D9%BE%D9%84%D8%A7%DA%AF%DB%8C%D9%86-codeglance-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%B3%D8%AA%D8%AF%DB%8C%D9%88-cj9cgwao6fk1</link>
                <description>سلامماه قبل تیم‌اپل یک پلاگین روی xcode به‌نام ‌MiniMap معرفی کردن که خیلی بچه‌های ios رو خوشحال کرد و فکر کردن انقلابی توی کدنویسی دنیا اتفاق افتاده ولی یک‌چیز میگم یادتون نره jetbrains is the best foreverحالا چرا ؟؟ چون از سال ۲۰۱۵ این ویژگی عادی توی intellij idea بوده (هسته اصلی اندرویداستدیو کنونی)پلاگین Code glance :یک پلاگین مختص تمام پلتفرم‌هایی که با هسته intellij هستن، از جمله اندرویداستدیو .میتونید از محل زیر جهت نصب این پلاکین اقدام کنید :On MAC:Go Preference &gt; Plugins &gt; Browse repositories, then search  codeglance.On Linux or Windows:Go File &gt; Settings... &gt; IDE Settings &gt; Plugins &gt; Browse repositories, then search codeglance.یا دستی فایل پلاگین رو دانلود کنید و از قسمت import plugins وارد کنید .تصویرس پلاگین داخل اندرویداستدیو :
به ابزار متکی نباشیم و هر روز چیز جدید یاد بگیریم .....در پناه حق</description>
                <category>devAndroid</category>
                <author>محمد نصرآبادی</author>
                <pubDate>Mon, 23 Sep 2019 10:03:28 +0330</pubDate>
            </item>
                    <item>
                <title>دو پلاگین اجباری اندرویداستدیو !</title>
                <link>https://virgool.io/devAndroid/%D8%AF%D9%88-%D9%BE%D9%84%D8%A7%DA%AF%DB%8C%D9%86-%D8%A7%D8%AC%D8%A8%D8%A7%D8%B1%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%B3%D8%AA%D8%AF%DB%8C%D9%88-bdnrhzljtvnj</link>
                <description>سلاماندرویداستدیو همیشه دو تا پلاگین کم داره :۱.   انجام کارهای تکراری مثل حدف اپ از روی گوشی یا حذف کش برنامه توسط adb ۲.  پلاگین اتصال گوشی به دیباگر با وای‌فای (پست قبلی)از این دوتا پلاگین استفاده کنید قول میدم پوست‌تون شفاف‌تر بشه.۱ . پلاگین ADB Idea :پلاگینی که دستورات پر کاربرد adb رو براتون سریع اجرا میکنه.این دستورات دستورات زیره :ADB Uninstall AppADB Kill AppADB Start AppADB Restart AppADB Clear App DataADB Clear App Data and RestartADB Revoke PermissionsADB Start App With DebuggerADB Restart App With Debuggerمیتونید از محل زیر جهت نصب این پلاکین اقدام کنید :On MAC:Go Preference &gt; Plugins &gt; Browse repositories, then search  ADB Idea.On Linux or Windows:Go File &gt; Settings... &gt; IDE Settings &gt; Plugins &gt; Browse repositories, then search  ADB Idea.یا دستی فایل پلاگین رو دانلود کنید و از قسمت  import plugins  وارد کنید . تصویرس پلاگین داخل اندرویداستدیو :ADB Idea- دو راه برای اجراش وجود داره :از تب‌های بالا :Through the Tools-&gt;Android-&gt;ADB Idea menuبا کلید های میانبر :By searching for &amp;quotADB&amp;quot in &amp;quotFind Actions&amp;quot (osx: cmd+shift+a, windows/linux: ctrl+shift+a) ۲. پلاگین  ADB WiFi Connect :پلاگینی که کمک میکنه شما tcp رو کنترل کنید !!!!!!!!!!!توی پست قبلی یاد دادم چطوری همیشه گوشی رو برای کار با سیم به کامپیوتر وصل نکنیم و البته ما میدونیم هر کاری که تکراری باشه میشه براش کدنویسی کرد تا با کمترین دخالت ما به ترتیب کارها رو انجام بده پس بجای یک روال همیشگی زدن کد adb connect و وارد کرد ip این پلاگین با یک حرکت گوشی رو بدون سیم به دیباگر وصل میکنه :)  بدون هرچ کار اضافه‌ای سمت شما .....قابلیت ویژه : اتصال و مدیرت چندین دستگاه متصل با wifi و بدون سیم به دیباگرمسیر نصب :On MAC:Go Preference &gt; Plugins &gt; Browse repositories, then search  ADB WiFi Connect.On Linux or Windows:Go File &gt; Settings... &gt; IDE Settings &gt; Plugins &gt; Browse repositories, then search  ADB WiFi Connect.یا دستی فایل پلاگین رو دانلود کنید و از قسمت  import plugins  وارد کنید . وقتی نصب میشه یک آیکون جدید براتون بالای توبار اندرویداستدیو میاد :محیط پلاگین : ADB WiFi Connect.همیشه سرچ کنیم . تقریبا برای همه چیز راه حل بهتر از کاری که ما میکنیم وجود داره در پناه حق</description>
                <category>devAndroid</category>
                <author>محمد نصرآبادی</author>
                <pubDate>Sun, 22 Sep 2019 16:39:09 +0330</pubDate>
            </item>
                    <item>
                <title>جادوی گریدل برای برنامه نویسان اندروید:متغیرها</title>
                <link>https://virgool.io/devAndroid/%D8%AC%D8%A7%D8%AF%D9%88%DB%8C-%DA%AF%D8%B1%DB%8C%D8%AF%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-ip5ivuodsirw</link>
                <description>Image From Unsplashدر gradle می‌تونیم دو نوع متغیر تعریف کنیم.این دو نوع به صورت buildConfigField و resValue هستند.buildConfigField  رو وقتی تعریف می‌کنیم داخل کلاس BuildConfig  یک متغیر استاتیک تعریف میشه که  داخل کد جاوا قابل دسترسی هست.در عوض resValue بصورت کد جاوا تولید نمیشه بلکه به صورت resource می‌باشد.خب کاربرد این متغیرها چیه؟به عنوان یک تجربه کاری،اپلیکیشن من قرار بود برای نسخه debug که به واحد تست تحویل داده می‌شد،از وب سرویس‌های سرور A استفاده کنه و برای نسخه release که به کارفرما تحویل می‌دادیم از سرور B دیتا بگیره.در ابتدا اومدم یک کلاس Constant به صورت زیر ساختم:وقتی می‌خواستم به کارفرما اپلیکیشن رو بدم،آدرس release رو از حالت کامنت در می‌آوردم و خروجی می‌گرفتم.خب کار اشتباهی بود ولی کار راه انداز بود.البته احتمال خطا بالا بود.بعد از مدتی با متغیر‌های gradle آشنا شدم و در فایل build.gradle  به صورت زیر اول دو نوع buildType ساختم:یکی برای release و  یکی برای debug.در مرحله بعدی یک متغیر به اسم BASE_URL تعریف کردم به این صورت:وقتی gradle رو sync کردم،داخل کلاس BuildConfig دیدم متغیر BASE_URL اضافه شده.حالا برای دسترسی به این متغیر کافی بود بصورت زیر ازش استفاده کنم و در کنارش از منو BuildVariants نوع buildType  مورد نظر رو انتخاب کنیم:دیگه دردسر کامنت کردن برطرف شد و مطمئن بودم نسخه ای که به کارفرما میدم،با آدرس درست خروجی گرفته شده است.از کاربردهای دیگه ، مثلا API_KEY رو میشه داخل فایل gradle ذخیره کرد و مثلا داخل AndroidManifest بهش دسترسی داشت،به این شکل:تعریف در فایل گریدلاستفاده در فایل manifest در پایان ممنون میشم دوستان تجربیاتتون را با من به اشتراک بذارید و اگر تجربه مشابه و کاربرد مفیدی برای متغیرهای گریدل دارید بیان کنید.ممنون از توجه شما.</description>
                <category>devAndroid</category>
                <author>الیاس محمدی</author>
                <pubDate>Thu, 11 Jul 2019 02:48:18 +0430</pubDate>
            </item>
                    <item>
                <title>چگونه مدرن شد؟</title>
                <link>https://virgool.io/devAndroid/android-uuzfytw6kew3</link>
                <description>Androidاین روز ها اگه Modern Android Development رو سرچ کنید مقالات و ویدیو های خوبی می بینید. من هم مدتی بود که با این مقالات آشنا شده بودم ولی بر روی پروژه ای کار می کردیم که علاوه بر بزرگ بودن و هیجان انگیز بودنش پر شده بود از یک سری کار های تکراری که از شیرینی توسعه کم می کرد. همیشه صحبت این بود که یک تغییر اساسی داخل پروژه بدیم ولی هیچوقت وقت کافی پیدا نمی شد. تا اینکه یک جایی تصمیم گرفتم این تغییرات باید شروع بشه (و خداروشکر موافقت شد). چرا؟ چونکه علاوه بر اینکه به نتیجه رسیدن مهمه انجام کار با بهترین روش هم مهمه. این مهمه که توسعه پروژه راحت بشه مخصوصا برای اعضای جدیدی که وارد تیم توسعه میشن، باید کاری کنیم سریع تر بتونن روی پروژه سوار بشن. برای مثال تا قبل از این تغییرات توسعه دهنده جدید باید اول مثلا با شیوه بایندینگ ما توی پروژه آشنا می شد ولی الان می تونه خیلی راحت لایو دیتا رو یاد بگیره با کلی منبع آموزش که توی نت موجوده.توی این راه چندتا قدم طی کردیم که به ترتیب براتون می نویسم البته نکته مهم اینه که هیچکدوم از این تغییرات باعث نشد پروژه متوقف بشه یعنی اینکه هر مرحله با کد های قبلی سازگاری داشت و این دلیلی شد که این فرآیند به صورت عالی طی بشه.پیش به سوی تغییراتThe business changes. The technology changes. The team changes. The team members change. The problem isn&#x27;t change, per se, because change is going to happen; the problem, rather, is the inability to cope with change when it comes. -kent beckAndroidXاولین تغییری که انجام دادیم و خیلی هم به موقع بود مهاجرت از لایبرری های ساپورت به اندروید x بودهمچنین شروع به استفاده از کامپوننت های متریال این باعث شد که در طراحی برنامه نیاز نباشه همه کامپوننت ها رو خودمون طراحی کنیم و یک سری کامپوننت های خوشگل دریافت کردیم.Kotlinدومین تغییری که دادیم شروع به کد زنی با کاتلین بود و مسئله ای که وجود داشت این بود که این یه تغییر مهم بود ولی ما شدیدا درگیر توسعه بودیم یجورایی یک تصمیم گرفتم و خب موافقت شد اینکه کد های تست برنامه با کاتلین نوشته بشه و این باعث شد کاتلین وارد پروژه بشه البته ما هنوز نتونسته بودیم برای توسعه سراغ کاتلین بریم تا اینکه شروع کردیم به استفاده از جت پک!!!JetPackاین قسمتی هست که خیلی دوست دارم جت پک یک سری کامپوننت هست که توسعه اندروید رو واقعا راحت می کنه ما هم چندتاش رو استفاده کردیم و مزیتی که داشت تا قبل از استفاده از این کامپوننت ها توسعه معماری برنامه به مراتب سخت تر از طراحی ui برنامه بود چونکه دیتابیس رو خودمون باید sql خام می زدیم البته یک سری orm وجود داشت ولی برای هرکدوم یک سری دلایلی داشتیم که استفاده نکنیم. برای بایند کردن دیتا ها به ویو ها کد هایی داشتیم که باید همیشه کپی پیست می کردیم و اگه باگی پیدا می شد یک فرآیند دیباگ وحشتناکی داشت و مورد بعدی باید چرخه برنامه رو حواسمون بهش می بود این ها باعث شد که به سمت کامپوننت هایی از جت پک بریم.این تغییر یک مزیتی که داشت این بود که ما از کدهایی استفاده می کردیم که وقت توسعه و بهبودش پیدا نمی شد ولی الان از جت پک استفاده می کنیم که توسط گوگل در حال توسعه هست و بهبود پیدا می کنه:)Roomاولین کامپوننتی که استفاده کردیم روم بود روم یک orm هست که به راحتی با annotation یک سری کد می زنیم و خودش کد های لازم برای sqlite رو تولید می کنه شاید تا قبل استفاده از روم قسمت ذخیره سازی دیتا ترسناک ترین جای پروژه بود :)Live Dataکامپوننت بعدی لایو دیتا بود که باعث شد بایند کردن دیتا به ویو ها به شدت راحت بشه و به شدت میزان خط کد ها کم شد و سرعت توسعه رو افزایش داد. تا قبل از استفاده از این کامپوننت مجبور بودیم برای هر ساب سیستم کار های بایندینگ رو خودمون انجام بدیم و وحشتناک بود.چند تا کار دیگه هم کردیم که به جذابیت کمک این ها شاید نبود یکی استفاده از کوروتین ها بود که خب ما همه جا از پرامیس یا کال بک استفاده می کردیم که استفاده از این کامپوننت ها در جای مناسب خودش باعث راحت تر شدن فرآیند توسعه شد و تغییر بعدی استفاده از کامپوننت پیجینگ بود.راستی یک چیز دیگهما توی فرآیند جذب نیرو های جدید یک کار مفیدی که کردیم این بود که پروژه های تستی تعریف کردیم که باید با استفاده از کاتلین و کامپوننت های جت پک می زدن این کار رو کردیم چونکه اکثر کسایی که میومدن با کاتلین یا به خصوص جت پک آشنایی نداشتن این کار رو کردیم که حداقل بتونیم مهارت همکارامون رو ارتقا بدیم هرجایی که باشن :)خلاصه توصیه ای که می تونم بکنم اینه که نسبت به تغییر مقاومت نکنید:) </description>
                <category>devAndroid</category>
                <author>امیرعباس</author>
                <pubDate>Fri, 14 Jun 2019 10:42:38 +0430</pubDate>
            </item>
                    <item>
                <title>چالش RxJavaیی - یافتن شهرهای هر استان</title>
                <link>https://virgool.io/devAndroid/%DA%86%D8%A7%D9%84%D8%B4-rxjava%DB%8C%DB%8C-%DB%8C%D8%A7%D9%81%D8%AA%D9%86-%D8%B4%D9%87%D8%B1%D9%87%D8%A7%DB%8C-%D9%87%D8%B1-%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-phra8x9x2rit</link>
                <description>بهترین راه یادگیری RxJava بعد از اینکه مفاهیم اولیه‌اش رو خوندید، حل مسئله‌های متفاوت با اون هست. اینکار باعث میشه به مرور تسلطتون روی RxJava و اپراتورهاش زیادتر بشه. امروز یه مسئله‌ای رو با هم بررسی میکنیم که تاحالا چند نفری در موردش ازم سوال پرسیدن. سه تا نکته رو فقط در نظر داشته باشید.شاید بدون RxJava بشه این مسئله رو راحت‌تر حل کرد ولی اینجا هدفمون RxJava هست.احتمال داره از چند روش بشه این مسئله‌ رو حل کرد، اصراری نیست که فقط راه‌حل من درسته.برای اینکه کد تمیزتر باشه کاتلین استفاده کردم ولی خب میشه همینو با جاوا پیاده کرد.خب مقدمه دیگه بسه، بریم ببینیم سوال یا مسئلمون چیه.تعریف مسئلهدو تا کلاس City (شهر) و Province (استان) بصورت زیر داریم، از اون دو طرف هم دو تا متد داریم که یکیشون لیست استان‌ها و اون یکی لیست شهرهای یه استان رو از اینترنت بهمون میدن. توی برناممون نیاز داریم که لیست استان‌هارو رو با شهرهاشون از اینترنت بگیریم. چطوری میشه اینکارو با یه زنجیره RxJava انجام داد؟؟؟ (راهنمایی: میتونید به کلاس Province فیلد اضافه کنید) https://gist.github.com/abbas-oveissi/25f0922846386f13a831e7f39fd573cf حتما سعی کنید قبل اینکه کد راه‌حل رو بخونید، تلاش کنید تا خودتون پیاده‌سازیش کنید. راه‌حل (هشدار اسپویل)اگر با کد راحت‌تر هستید، این توضیحات رو نیاز نیست بخونید و بجاش مستقیم نمونه کد رو اینجا یا در آخر مقاله بررسی کنید. در ضمن توی این توضیحات فرض کردم که شما با RxJava و اپراتورهایی مثل flatmap و map و ... آشنایی دارید. پس اگر باهاشون آشنا نیستید، بهتره قبلش توی گوگل یه جستجویی در موردشون بکنید.خب اولین کار برای حل مسئله اینه که لیست استان‌هایی که از متد getProvinces میگیریم رو تبدیل به دونه‌های Province بکنیم. اینکار رو میشه با Observable.from انجام داد. فقط چون خروجی این اپراتور از نوع observable هست، باید از flatmap استفاده کرد.حالا در ادامه باید لیست شهرهای این استان‌هارو تک تک بگیریم. اینجا هم باید از flatmap استفاده کنیم ولی یه نکته داره. بذارید با این نکته رو با یه مثال توضیح بدم. توی بخش اول با flatmap لیست Province رو تبدیل به دونه‌های Province کردیم. اینجوری:List&lt;Province&gt;  ========FlatMap==========&gt; Provinceالان اگر به همون مدل از flatmap استفاده کنیم، اینجوری میشه:Province  ========FlatMap==========&gt; List&lt;City&gt;توی این حالت درسته لیست شهرهارو گرفتیم!! ولی خب دیگه به آبجکت Province دسترسی ندارید. در نتیجه بدردمون نمیخوره. چاره‌ی کار اینه که نگاهی به داکیومنت‌ اپراتور flatmap توی RxJava بندازیم. غیر از flatmapیی که بالاتر استفاده کردیم، یه flatmap دیگه هست که میشه دو ورودی بهش داد و این شکلی هست:flatMap(final Func1&lt;&gt; collectior, final Func2&lt;&gt; resultSelector)توضیح پارامتر اول collectior - این همون تابعی هست که داخلش بهمون یه Province میده و ما خروجی متد getCityByProvinceId که یه observable هست رو return میکنیم.توضیح پارامتر دوم resultSelector - داخل این تابع اصل کارو انجام میدیم. داخلش بهمون یه آبجکت Province و نتیجه‌ی اون Observable که توی collectior براش return کرده بودیم رو میده. در نتیجه تنها کاری که باید بکنیم اینه یه فیلد به Province اضافه کنیم و این لیست رو بهش ست کنیم.در آخر زنجیره‌مون هم از toList استفاده میکنیم تا دوباره دونه‌های Province رو یه لیست بکنه و بهمون تحویل بده. نمونه کد راه‌حل رو میتونید در ادامه مشاهده کنید. https://gist.github.com/abbas-oveissi/170036ed900e5d148c113038669bc2ce اگر شمام راه‌حل بهتری به ذهنتون میرسه توی بخش نظرات لینک gistشو بفرستید.</description>
                <category>devAndroid</category>
                <author>عباس اویسی</author>
                <pubDate>Thu, 13 Jun 2019 19:24:29 +0430</pubDate>
            </item>
                    <item>
                <title>معماری اندروید : از دالویک تا آرت</title>
                <link>https://virgool.io/devAndroid/from-dalvik-to-art-clofmpbfgzde</link>
                <description>سلام به همه دوستان.اول از همه چیز بگم که از هم اکنون میتوانید ویدیوهای مربوط به آموزش برنامه نویسی مخصوصا فلاتر و دارت رو در کانال یوتوب من دنبال کنید. لینکشم میزارم همین پایین :https://www.youtube.com/c/FlutterStanمن میخواستم که اولین مقالم رو در رابطه با فریمورک فلاتر که این روزا سر و صدای خیلی زیادی به پا کرده منتشر کنم ولی دیدم که تا زمانی که مفاهیم اصلی و اولیه رو بلد نباشیم نمیتونیم روی چیزی کاملا مسلط شیم. به همین خاطر تصمیم گرفتم که توی اولین مقاله ساختار و معماری سیستم عامل اندروید رو به صورت کامل توضیح بدم و بعدش بریم سراغ فلاتر :)خب اول با این شروع کنیم که اندروید چی هست و چه زمانی وارد بازار شده :اگه بخوام به صورت خلاصه بگم سیستم عامل اندروید توسط گوگل در تاریخ ۵ نوامبر ۲۰۰۷ به دنیا معرفی  شد. در ابتدا نام شرکت کوچکی با بنیان گذارانی به نام های اندی رابین ریچ  ماینر نیک سیرز و کریس وایت بود. این شرکت در حوزه طراحی و ساخت نرم  افزارهای موبایل و ساخت سیستم عامل جدیدی برای رقابت با سیستم عامل موفق آن  زمان یعنی سیمبین که در گوشی های نوکیا استفاده می شد فعالیت میکرد.امتیاز این شرکت در سال ۲۰۰۵ توسط شرکت قدرتمند گوگل با مبلغ  ۵۰ میلیون دلار خریداری شد و سیستم عامل اندروید را بر پایه هسته لینوکس طراحی نمود. تقریبا هم زمان با اندروید شرکت اپل موبایل های هوشمند خود با سیستم عامل جدید خود یعنی IOS به بازار عرضه کرد و این آغاز رقابتی بزرگ در  عرصه سیستم عامل های موبایل بود.خب حالا بریم سراغ اصل کار یعنی ساختار اندروید :ساختار سیستم عامل اندروید شامل چهار لایه است که این لایه ها عبارتند از:(البته این طرز لایه بندی اونقدر ها هم رسمی نیس چون بعضی جا ها جوری دیگر لایه بندی کردند ولی خب اصل همه لایه بندی ها یه چیز است مثل تفاوت OSI و TCP/IP در شبکه میمونه)ApplicationApplication FrameworkLibrariesLinux Kernelکه میتونین در شکل زیر این ساختار را مشاهده کنید :)خب به ترتیب از اولین لایه شروع میکنیم تا برسیم به تهش.لایه Application :این لایه قابل لمس ترین لایه برای ما کاربران گوشی های اندرویدی هست. و از طریق این لایه ما میتوانیم با گوشی خود ارتباط داشته باشیم.در واقع به زبان خیلی ساده تمام برنامه هایی که ما نصب میکنیم در این لایه است از مرورگر گرفته تا برنامه مخاطبین و ... لایه Application Framework :این لایه بیشتر به درد برنامه نویسان اندروید میخوره .میتوان گفت که تمام ویژگی های مجموعه سیستم عامل اندروید از طریق API های نوشته شده در زبان جاوا در دسترس برنامه نویسان است. در واقع این لایه به برنامه ما اجازه میدهد تا به سرویس های سطح بالا تر دسترسی پیدا کنند. حالا ممکنه بگین که این سرویس ها چیا هستن ؟Activity Manager :این سرویس همه جنبه های زمان حیات نرم افزار را کنترل می کند(life cycle) و هم چنین قابلیت navigation back-stack را فراهم میکند.اما navigation back-stack چیه ؟ شما اگه کمی کدنویسی اندروید کار کرده باشید حتما میدونین جابجایی بین صفحات(activity) چگونه است. کنترل این صفحات با ساختمان داده پشته(stack) پیاده سازی میشود. مثلا اگه تو برنامه دیجی کالا روی محصول کلیک کنیم میره تو یه صفحه دیگه و اینجا این صفحه جدید push میشه تو پشته وحالا اگه این صفحه رو ببندید این صفحه onDestroy() اش فراخوانی میشه و باعث میشه که از پشته pop بشه و اکتیویتی قبلی دوباره بیاد بالا. تمام این کارها وظیفه Activity Manager میباشد.Content Providers :این سرویس به برنامه ها این اجازه را می ده تا داده ها را انتشار و با برنامه های دیگر به اشتراک بگذارند.مثلا ما برنامه ای نوشتیم که در آن از داده های برنامه مخاطبین استفاده کرده ایم. خب این سرویس باعث شده که ما بتونیم همچین کار باحالی رو انجام بدیم.Resource Manager :این سرویس دسترسی به منابع غیر کد مانند رشته های محلی، گرافیک و فایل های طرح بندی را فراهم می کند. مثلا اگه ما تو کد زدن با جاوا واسه اندروید یک فایل واسه رشته هامون در نظر گرفته باشیم میتونیم با زدن کد R.id.string_name به اون رشته دسترسی داشته باشیم که اینجا R به همون resource های ما اشاره میکنه.Notifications Manager :این سرویس به برنامه ها این اجازه را می دهد تا اعلان ها و هشدار ها را به کاربر نمایش دهند حتی هنگام بسته بودن اپ.View System :از مجموعه توسعه پذیر  view ها برای طراحی ظاهر نرم افزار استفاده می کند.لایه Libraries : بسیاری از اجزای اصلی سیستم عامل اندروید و خدمات مانند ART(که جلوتر میگم چی هس) و ... از کد native ساخته شده اند که نیاز به کتابخانه های native در C و C ++ دارند. پلتفرم اندروید API های جاوا را فراهم می کند تا برخی از این کتابخانه های native را به برنامه ها بیفزایند. برای مثال، ما میتونیم OpenGL ES را از طریق API جاوا برای اضافه کردن پشتیبانی از نقاشی و دستکاری گرافیک های 2D و 3D در برنامه خودمون اضافه کنیم.چندتا از کتابخونه های مهم دیگه عبارتند از :Android.appAndroid.contentAndroid.openglAndroid.databaseAndroid.os Android.text Android.view Android.widget Android.webkit بخش Android Runtime : این بخش خیلی مهمیه ما برنامه اندروید رو به صورت کلاس های جاوایی مینویسیم ولی این کد جاوا چجوری روی گوشی اجرا میشه ؟ روال کار اینجوریه که ما کلاس های جاوایی خودمون رو مینویسیم بعد که ما کد جاوا رو کامپایل میکنیم به bytecode تبدیل میشن بر خلاف زبان هایی مثل c یا c++ که مستقیم به زبان ماشین تبدیل میشوند. خب حالا ما بایت کد را داریم( که اصطلاحا به بایت کد، کد قابل حمل هم میگن که از یک سری کدهای عددی فشرده، آدرس های عددی و ثابت ها تشکیل شده است) اما این کافی نیس برای اجرا روی اندروید خب پس باید چکار کرد ؟ قبل از اندروید ۵ گوگل از ماشین مجازی جاوایی به اسم دالویک برای اجرا برنامه ها استفاده میکرد اما سوال بعدی این است که دالویک چیست ؟دالویک : برخلاف ماشین های مجازی جاوا، که پشته ای هستند، دالویک ماشینی مبتنی بر معماری ریجستری است. ماشین‌های مجازی پشته‌ایی باید از دستورات برای بارگذاری داده‌های در پشته و اعمال تغییرات بر روی آن‌ها استفاده نماید بنابراین نسبت به ماشین‌های مبتنی بر رجیستر به دستورات بیشتری برای کد سطح بالاتر نیاز دارد ولی دستورات در ماشین رجیستری باید به صورت مبدأ و مقصد باشد که منجر به بزرگ شدن دستورات خواهد شد.این ماشین مجازی توسط دن برونستین جهت اجرا شدن برنامه ها بر روی دستگاه  های مختلف با منابع محدود ساخته شد. این ماشین بر روی دستگاه های موبایلی  استفاده می شود که منابع محدود با توان پردازش پایین و عمر باتری کم و حافظه اندک هستند ماشین مجازی دالویک فایل های با پسوند .dex اجرا می کند.خب تا اینجا ما یک بایت کد که حاصل از کامپایل کد جاوا هست و یک دالویک داریم که .dex رو اجرا میکنه.ابزارهایی وجود دارد که بایت کد ما را به فایلی با پسوند dex تبدیل میکند مانند dx و Jack که این ابزار ها توی خود اندروید هستن. حالا که کد جاوا ما به dex تبدیل شد این کد به دالویک داده میشه و دالویک اون رو اجرا میکنه به همین سادگی :)به این کارهایی که گفتم تا در نهایت به کدی برسیم که دالویک بتونه اون رو اجرا کنه JIT compile( اختصار شده Just In Time) میگن. یعنی هر باری که ما یک اپ را روی گوشی باز میکنیم تمام کارهای گفته شده در بالا انجام میشود واسه همین بش میگن Just In Time که یعنی همون موقعی که ما اپ رو باز میکنیم کدهای ما توسط دالویک به زبان ماشین تبدیل میشه تاکید میکنم که درست در همون موقع.ولی مشکل این دالویک چیه ؟ کد تولیدی ما باید در هر بار اجرا روی دستگاه، از یک ران‌تایم(همون فرایند دالویک) عبور کرده و  پس‌از تفسیر، اجرا شود. این روش بهینه نیست و در هر بار اجرا، کل منابع سخت افزاری را درگیر می‌کند، ولی در عوض امکان تولید آسان نرم‌افزار برای دستگاه‌ها و معماری‌های مختلف را می‌دهد.ولی گوگل که دست رو دست نمیزاره واسه همین توی نسخه ۴.۴ ،اندروید آرت(ART) رو معرفی کرد و به صورت آزمایشی در کنار دالویک در گوشی ها استفاده کرد، به گونه ای که کاربر حق انتخاب بین این دو را داشت.اما در نسخه ۵ اندروید اون رو دیگه جایگزین دالویک کرد.نحوه عملکرد آرت : آرت به روشی کاملاً متفاوت از دالویک، نرم افزارها رو اجرا می‌کند.در آرت بار اولی که یک نرم‌افزار  نصب می‌شود، کد بایتی (ByteCode) آن را به کد ماشین (MachineCode) تبدیل  می‌کند تا در واقع آن نرم‌افزار به یک نرم افزار native تبدیل شود.با این روش جدید که کامپایل جلوتر از زمان (Ahead-Of-Time یا AOT) نام دارد، نیاز به فعال‌سازی هر باره یک ماشین مجازی یا یک کد مفسر(همون کار دالویک که هر بار باید کد ما به dex تبدیل میشد تا دالویک اون رو اجرا کنه) از بین خواهد رفت و اجرای اپلیکیشن‌ها  بسیار سریع‌تر خواهد شد. طبق بررسی‌های انجام شده، زمان بازشدن نرم‌افزارها به‌طور میانگین به نصف کاهش یافته، زمان پاسخگویی دستگاه سریع‌تر شده و عمر  باتری آن نیز بالا رفته‌است.مزایای آرت : استفاده از AOT و JIT به صورت تلفیقی همچنین دارای garbage collection بهبود یافته تر و مواردی دیگر مانند پشتیبانی از اشکال زدایی بهتر و تشخیص بهتر استثنا ها و گزارش دهی بهتر crash ها.معایب آرت : افزایش نسبی زمان اولیه برای نصب هر نرم‌افزار و همچنین افزایش فضای مورد نیاز برای ذخیره‌سازی نرم‌افزارها.JIT vs AOT :پس به صورت خلاصه JIT شد اینکه هر بار که ما اپی رو اجرا میکنیم یک ماشین مجازی دالویک اجرا میشه و کد جاوا ما تبدیل میشه به .dex و بعد تازه کد ما اجرا میشه ولی در AOT کد ما قبل از اجرا به زبان ماشین تبدیل میشه و دیگر برای هر بار اجرا نیاز به ماشین مجازی برای تفسیر کد نداریم.لایه Linux Kernel : کرنل، هسته سیستم عامل می باشد که تمام منابع سیستم را مانند پردازنده،  حافظه و ... را به برنامه های دیگر اختصاص می دهد. سورس کد کرنل لینوکس  شامل بیش از 21 میلیون خط کد و یکی از پر استفاده ترین سورس کد ها در دنیا  می باشد.کرنل لینوکس یک هسته سیستم عامل اپن سورس است که در سال 1991 توسط  لینوس توروالدز ساخته شد و پس از او هسته لینوکس به کمک توسعه دهندگان دیگر  در سراسر جهان پیشرفت داده شد. از وظایف کرنل لینوکس می توان به موارد زیر  اشاره کری: ذخیره سازی اطلاعات:  حافظه  با دسترسی تصادفی (رم) به منظور خواندن ونوشتن متغیر وداده ها در حافظه و  دسترسی به حافظه دائمی برای ذخیره سازی و بازیابی اطلاعات بر روی ابزار های  ذخیره سازی دائمی مانند هارد دیسک مدیریت ابزار ها: مدیریت ابزار های خارجی مانند : USB، دوربین، بلوتوس، وای فای زمان بندی کارها: تقسیم کردن زمان پردازشگر بین پردازش های مختلف و اولویت بندی کردن کار ها برای پردازشو ...پایه و اساس پلتفرم اندروید هسته لینوکس است. به عنوان مثال، ART به هسته لینوکس برای ویژگی هایی مانند نخ ها (threads) و مدیریت سطح پایین حافظه وابسته است.خب دوستان این بود معرفی ساختار اندروید امیدوارم که به دردتون خورده باشه و تونسته باشم به اطلاعاتتون چیزی رو اضافه کنم.با مقاله های بعدی من در رابطه با فلاتر همراه باشد(البته اونم از بیس شروع میکنیم.):)لینک کانال یوتوب من لطفا سر بزنید : https://www.youtube.com/c/FlutterStan</description>
                <category>devAndroid</category>
                <author>Ali Hoseinpoor</author>
                <pubDate>Mon, 03 Jun 2019 05:20:42 +0430</pubDate>
            </item>
                    <item>
                <title>وقت اینه که دست های خودمون رو با Epoxy رنگی کنیم [سری آموزش پیاده سازی لیست های با ساختار پیچیده با استفاده از کتابخانه Epoxy در Android]</title>
                <link>https://virgool.io/devAndroid/epoxy-part1-qxnxb9c0l5jf</link>
                <description>اگر با Epoxy آشنایی ندارید می تونید یه سری به صفحه گیت هاب این کتابخانه بزنید  https://github.com/airbnb/epoxy یا همین جا بمونید و ادامه بدید !توجه کنید که در این سری آموزش فرض شده است که با  RecyclerView  آشنا هستید ، در غیر این صورت می توانید از طریق آموزش های موجود در اینترنت نسبت به یادگیری این موارد اقدام کنید .What is Epoxy ?اپوکسی یک لایه  Abstraction است که بر روی کتابخانه RecyclerView بنا شده است (اینی که گفتی یعنی چه ؟!!)بزارید راحت باشیمهمیشه وقتی صحبت از لیست ها باشه ناخود آگاه به تعدادی آیتم که دقیقا شبیه هم هستند فک می کنیم . مثلا لیستی از نام ، شماره ، غذا ، ماشین و ... و برای اجرای این لیست عادی این مراحل رو طی می کنیم : (صرفا به عنوان مثال)داخل لایه activity یک RecyclerView اضافه میکنیم یک لایه برای آیتم های که قراره داخل لیست نشون داده بشن می سازیمیک Adapter از نوع  RecylerView.Adapter می سازیم یک layoutManager می سازیم که بسته به نیاز می تونیم LinearyLayoutManager باشه یا GridLayoutManager یا ...و تمام این موارد رو بهم متصل می کنیم تا لیست درست بشه یک فرایند تکراری به شدت خسته کننده با کدهایی که هر بار مجبوری تکرار کنی (البته روش هایی برای کم کردن میزان این کد ها هست ولی به این سری آموزش ربطی نداره)چیزی که شاید کمتر بهش فک کنیم اینه که اگر حتی 100,000،000 آیتم به Adapter اضافه کنیم باز هم اسکرول نرم و بدون لگی رو داریم و تعداد آیتم ها هیچ تاثیری نداره (این از برکات استفاده از RecyclerView ِ) .حالا فرض کنید که ازتون بخوان یک لیست با دو نوع لایه متفاوت بسازید . خوب خیلی راحت می تونید لایه جدید رو داخل فولدر layout تعریف کنید و متد getItemViewType اداپتر رو override  کنید و مشخص کنید که برای هر position کدام لایه استفاده بشه  و داخل onCreateViewHolder  لایه مورد نظر رو inflate کنید . به این صورت : final int VIEW_TYPE_1 = 0;
final int VIEW_TYPE_2 = 1;

@Override
  public int getItemViewType(int position) {
    if (position % 2 = 0) {
                return 1;
        } 
        return 0;
  }
  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int                      viewType) {

// لایه نوع یک 
View itemLayoutViewType1 = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.item_type_1, parent, false);

// لایه نوع دو
View itemLayoutViewType2 = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.item_type_2, parent, false);

    switch (viewType) {
      case VIEW_TYPE_1 :
        ViewType1Holder type1Holder = new ViewType1Holder        (itemLayoutViewType1);
        return type1Holder ;
      default :
        ViewType2Holder type2Holder = new ViewType2Holder        (itemLayoutViewType2);
        return type2Holder ;
    }
    
    
class ViewType1Holder extends RecyclerView.ViewHolder {
        ...
}
class ViewType2Holder extends RecyclerView.ViewHolder {
         ...
 }کار به اینجا ختم نمیشه و باید داخل onBindViewHolder  هم منطقی مناسب رو اضافه کنید :@Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

    if (holder instanceof ViewType1Holder ) {
      ...
    }

     if (holder instanceof ViewType2Holder ) {
      ...
    }
  }حالا اگر درخواست دیگری مبنی بر اضافه کردن نوع سومی از لایه بشه چی ؟ به زودی می بینید که با اضافه کردن viewType های بیشتر به لیست ، حجم Adapter زیاد میشه و خوانایی کدها و کمتر میشه و نتیجتا نگهداریش سخت میشه . دقت کنید که ممکنه لایه نوع n ام  خودش یک لیست باشه (nested lists) و برای این مورد نیاز است کد و اقدامات بیشتری انجام داده بشه . استفاده از nested لیست ها در طراحی برنامه اندرویدی خیلی مرسوم هستند . مثلا اکثر برنامه فروشگاهی مانند google play و دیجی کالا یا موارد دیگر از این ساختار استفاده می کنند . لیست های تو در تو (nested list) :تصویر بالا رو ببینید ، لیست اصلی یک لیست عمودی است و آیتم های موجود در این لیست خودشان لیست های افقی هستند . درست کردن یک همچین لیستی کار تقریبا ساده ای است . کافیه دو  Adapter جداگانه تعریف کنیم که یکی از آنها لیست مادر را اداپت کند و اون یکی هم لیست ها فرزند رو . داخل onBindViewHolder لیست مادر باید یک همچین منطقی اضافه کنیم : childRecyclerView.setHasFixedSize(true);       
childRecyclerView.setLayoutManager(new ChildLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));        
childRecyclerView.setAdapter(adapter);        childRecyclerView.setRecycledViewPool(viewPool); تعیین کردیم که سایز تمام آیتم ها یکسانه (setHasFixedSize) . اینطوری لیست مادر دیگه لیست لازم نیست با اضافه کردن آیتم جدید به محاسبات بپردازه  کافیه از اندازه های موجود استفاده کنه  و تمام لیست های فرزند به یک viewPool یکسان متصل هستند اینطوری آیتم های موجود در داخل لیست های فرزند بین اونها به اشتراک گذاشته می شه (recycle میشه). در نگاه اول هیچ مشکلی خاصی با پیاده سازی لیست های تو در تو نداریم . ولی مشکلات به زودی نمایان می شوند .گفتیم که viewPool آیتم های موجود در لیست های فرزند رو recycle میکنه و دوباره استفاده میکنه . یعنی ممکنه آیتمی که الان داخل لیست  n ام داریم می بینیم قبلا داخل لیست m ام بوده باشه . توجه کنید که viewPool وقتی کاربرد داره که آیتم ها یکسان باشند درست مث google play که 90 درصد یا بیشتر آیتم های موجود در لیست های افقی یکسان هستند . وجود آیتم های یکسان باعث میشه که اسکرول نرم و بدون لگی داشته باشیم . اما با در نظر گرفتن لایه های متفاوت برای هر کدام از لیست های افقی دیگه این اسکرول رو نرم رو نخواهیم داشت و با لگ های طولانی مواجه می شیم . علتش اینکه هیچ view ای بازیافت نمیشه و لیست ها افقی مجبورا هر بار آیتم هاشون رو inflate کنند  که زمان بره . مشکل بعدی اینه که state لیست های افقی ذخیره نمیشه و scroll position خودشون رو زمانی که از لیست اصلی detach بشن از دست میدن .البته برای این مورد میتونیم منطقی بنویسیم که state ها رو ذخیره کنه و بعدا اینا رو برگردونیم .لیست با چند view typeخوب اینجاست که Epoxy خود نمایی میکنه برای ساخت لیست هایی با آیتم های با ساختار پیچیده و همزمان تعداد viewType های متفاوت (در حد اینکه هیچ آیتم یکسانی نداشته باشیم !) از Epoxy  استفاده می کنیم . ادامه دارد ...</description>
                <category>devAndroid</category>
                <author>داریوش فتحی</author>
                <pubDate>Sat, 01 Jun 2019 22:48:36 +0430</pubDate>
            </item>
                    <item>
                <title>تغییر فونت فارسی در پروژه های اندروید</title>
                <link>https://virgool.io/devAndroid/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%81%D9%88%D9%86%D8%AA-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-clrqiu2jsmf6</link>
                <description>فونتبرای ما فارسی زبان های تغییر فونت اصلی اپلیکیشن هایی که مینویسیم تقریبا یه اصله . چون با فونت های جدید رابط کاربری زیباتری می تونیم بگذاریم و از حالت زمخت در میاد . میخوام روش ساده و سر راست افزودن فونت جدید به پروژه برنامه رو بگم که احتمالا جسته و گریخته آموزش هاش رو میشه پیدا کرد ولی گاهی وقت ها یه راه حل امتحان شده سر راست بهتر از توصیه های آموزشیه . با من همراه باشیدانتخاب فونت از نظر ما برنامه نویس ها انتخاب یه فونت درست و حسابی که به کلیت رابط کاربریمون بخوره کار سختیه ! چون ما فقط بلدیم کد بزنیم ، طراحی با دوستان دیگه است . فونت ایران یکی از سایت های تخصصی در این کاره ولی من نتونستم فونت مجانی توش پیدا کنم . برای ما که پروژه های عام المنفعه ! انجام میدیم فونت رایگان دوای درده . اینجا میتونید یه چند تا فونت فارسی رایگان پیدا کنید که من خودم از فونت شبنم استفاده میکنمافزودن فایل به پروژه روی پوشه res راست کلیک کرده و New و مثل شکل زیر یه پوشه با نام font ایجاد کنید . حالا فایل فونت مورد نظر رو در این پوشه قرار بدید . حواستون باشه اسم فایل فونت با حروف بزرگ شروع نشه که اندروید استودیو اشکال میگیرهفونت ها اصولا از اندروید 26 به بالا میتونن استفاده بشه و برای اینکه بشه تا اندروید 16 هم از فونت استفاده کرد باید این روش رو بکار بگیرید و گرنه فونت اعمال نمیشه یه فایل xml با نام مثلا shabnam_font ایجاد کنید و کد زیر رو توش بنویسید :  https://gist.github.com/githubmor/f96b6a99cd5fa487feb6b3e90ceee010 قطعه كد app:font=&quot;@font/shabnam&quot; همون آدرس فایل فونت ( ttf ) هست که قبلا اضافه کردیم . حالا فایل style در پوشه Values رو باز کنید و کد زیر رو بهش اضافه کنید : https://gist.github.com/githubmor/94f3aab38c8134ad5e2750e4b91d585a دیگه کار تمومه و میتونید از فونت جدید در جایی که خواستید استفاده کنید : https://gist.github.com/githubmor/9ab5827af06f3ce43f39c46b620a7fc0 اگر هم بخواهید از این فونت مثلا در تمام TextView های برنامه استفاه کنید کافیه کد زیر رو به theme برنامتون اضافه کنید تا هر جا TextView داریم با این فونت تغییر کنه : https://gist.github.com/githubmor/305463e63a804f02f2bf43fc4618a1f6 منبع : تجربيات يك برنامه نويس موفق باشید  </description>
                <category>devAndroid</category>
                <author>مرتضي درزي</author>
                <pubDate>Wed, 24 Apr 2019 16:02:47 +0430</pubDate>
            </item>
                    <item>
                <title>تغییر UI در زمان اجرا با استفاده از ViewStub</title>
                <link>https://virgool.io/devAndroid/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-ui-%D8%AF%D8%B1-%D8%B2%D9%85%D8%A7%D9%86-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-viewstub-g8jywmdzdjam</link>
                <description> اصول برنامه نویسی و طراحی میگه تا حد امکان باید از کد های تکراری بپرهیزیم و اینکار برای طراحی رابط کاربری هم بسیار مورد نیازه . یه مثال ساده ای که در این مورد همیشه زده میشه جداسازی کد های یک قسمت طراحی بصورت یک فایل جدا layout و استفاده از اون در layout های دیگه است که میشه با تگ های include , merge اون قسمت رو اضافه کرد . البته اگر قسمت ضمیمه شونده منطق خودش رو داشته باشه باید بصورت fragment به اکتیویتی اضافه بشه تا بتونیم برای هر قسمت منطقش رو اجرا کنیم . اینکار هم با تگ fragment , framelayout قابل انجامه . در چنین مثالهایی ما یک بخش ثابت داریم که میتونه در فضاهای بزرگ دیگه مثل فرگمنت یا اکتیویتی تکرار بشه حالا بزارید یه فرض دیگه رو هم بررسی کنیم . اگر ساختار اصلی فرگمنت هامون یک شکل باشه ولی یه بخش خاص برای هر فرگمنت تغییر کنه چطور ؟ یعنی فرض کنید چند فرگمنت یا اکتیویتی داریم که شکل ساختاری یکسانی دارند ولی مثلا بخش بالای صفحه در هر فرگمنت متفاوته و شکلش تغییر میکنه . اینجاست که ViewStub به کار میاد . بزارید اول بدونیم ViewStub چیه ؟ViewStub طبق تعریف خود گوگل :A ViewStub is a zero-sized invisible View which is used to load &quot;layout resource&quot; at runtime. یعنی ViewStub ویویی بدون سایز و مخفی است که در زمان اجرا به عنوان layout نمایش داده خواهد شد . این یعنی اینکه با اضافه کردن این ویو به layout هیچ جایی رو نخواهد گرفت و زمانی که متد ()inflate یا visible آن اجرا شود ، یه ویو دیگر را در خود نمایش خواهد داد .  &lt;ViewStub
    android:id=&quot;@+id/view_stub&quot;
    android:inflatedId=&quot;@+id/replace_view&quot;
    android:layout=&quot;@layout/replace_layout&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    /&gt;همانطور که در کد بالا می بینید attribute های ViewStub شامل موارد زیر می باشد :android:id=&quot;@+id/view_stub&quot;یک id مختص خود ViewStub که بتوان بعدا در برنامه به آن دسترسی داشت android:inflatedId=&quot;@+id/replace_view&quot;یک id که بعد از اجرای متد ()inflate یا visible به ویو جایگزین شده داده خواهد شد android:layout=&quot;@layout/replace_layout&quot;همان layout ای که باید جایگزین شود . البته اینکار را بصورت کد نویسی انجام می دهیم تا بتوانیم همانند مثال گفته شده layout های اختصاصی را برای هر فرگمنت جایگزین کنیمviewStub.setLayoutResource(R.layout.my_checkbox);
View inflatedView = viewStub.inflate();میتونید نحوه استفاده از ViewStub رو در اینجا و اینجا و اینجا و اینجا ببینید . با استفاده از ViewStub عملا ما میتونیم یک جایی اختصاصی جدا در layout در نظر بگیریم که برای هر فرگمنت یا اکتیویتی بتونه ویو مختص به خود رو در آن جایگزین کند . اما یکی از کاربرد های مهم دیگه ViewStub نیز لود کردن قسمت های مختلف layout در زمان های مختلفه . فرض کنید layout شلوغی داریم که اگر بخواهیم بصورت یکجا لود بشه زمان زیادی رو میگیره ، در این حالت با استفاده از ViewStub میشه زمان نمایش ویو رو تا زمان اجرای متد ()inflate یا visible به تاخیر بندازیم پی نوشت : یکی از ویژگی های ViewStub اینه که زمان inflate شدن ، خود ViewStub حذف خواهد شد و جای آن را ویو تعریف شده خواهد گرفت در نتیجه زمان استفاده از ViewStub در ConstraintLayout بعد از inflate شدن دیگه هیچ قید و بندی به ConstraintLayout نخواهد داشت ، برای حل این مشکل کافیه همانند راه حل ارائه شده در اینجا ، inflatedId رو با id یک مقدار قرار بدیم .منبع : تجربیات یک برنامه نویس</description>
                <category>devAndroid</category>
                <author>مرتضي درزي</author>
                <pubDate>Sat, 13 Apr 2019 12:31:14 +0430</pubDate>
            </item>
                    <item>
                <title>شناسه یکتای دستگاه اندرویدی android device unique id</title>
                <link>https://virgool.io/devAndroid/andorid-device-unique-id-svwj310ydunj</link>
                <description>سلام. در برنامه نویسی اندروید، یه موضوعی که خیلی وقت پیش بهش برخورده بودم و جدیداً دوباره توی یکی از پروژه ها برام پیش اومد، پیدا کردن کد یکتا برای احراز هویت بود! در حقیقت میخواستیم مطمئن شیم که شناسه ی اصطلاحاً uniqueی رو برای دستگاه میتونیم بدست بیاریم. گفتم شاید بهتر باشه راه حلش رو با بقیه به اشتراک بذارم:روش اول: AndroidIdخب اولین راه حل شاید استفاده از android_id باشه:String AndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); ولی باید حواسمون باشه که این روش ممکنه null برگردونه و توی داکیومنت نوشته شده که با فکرتوری ریست میتونه تغییر کنه.روش دوم: IMEI خب روش بعدی که ممکنه به ذهن همه برسه IMEI هست. این کد در واقع خلاصه ی عبارت &quot;International Mobile Equipment Identity&quot; یا «شناسه بین المللی تجهیزات موبایل» هست که بصورت زیر بدست میاد:TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String imei = TelephonyMgr.getDeviceId();این روش هم مشکلاتی داره مثل اینکه برای دسترسی به این کد باید اجازه ی READ_PHONE_STATE رو داشته باشیم و همونطور که میدونیم از نسخه ی اندروید لالیپاپ به بعد این پرمیشن جزو پرمیشن های ران-تایم هست (زمان اجرا باید از کاربر گرفته بشه) و طبیعتاً زیاد خوشآیند نیست.روش سوم: MAC وای فایخب هر دستگاهی که وای فای داشته باشه، طبیعتاً باید یه mac هم داشته باشه که به  WLAN MAC معروفه و بصورت زیر بدست میاد:WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String macAddress = wm.getConnectionInfo().getMacAddress();مشکل این روش هم (علاوه بر اینکه با درصد خیلی پایینی ممکنه دستگاه اندرویدی wifi نداشته باشه) دقیقاً مثل مورد قبلی نیاز به اجازه ی دستری READ_PHONE_STATE هست. علاوه بر اینکه توی بعضی دستگاه ها null برگردونده میشه.روش چهارم: MAC بلوتوثو دقیقاً شبیه مورد قبلی ولی این بار میتونیم به mac بلوتوث دسترسی پیدا کنیم:BluetoothAdapter m_BluetoothAdapter	= null;
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();که البته باز هم علاوه بر اینکه ممکنه دستگاهی بلوتوث نداشته باشه (هرچقدر هم احتمالش کم باشه)، ممکنه توی بعضی دستگاه ها null برگردونده بشه، همچنین با این روش نیاز به اجازه ی android.permission.BLUETOOTH داریم.روش پنجم: Pseudo-UniqueIDمیشه از روش های ترکیبی هم استفاده کرد، برای مثال تابع لینک زیر که اصطلاحاً Psuedo رو پیاده سازی کرده:https://gist.github.com/pedja1/fe69e8a80ed505500caaیا برای مثال استفاده از یسری اطلاعات که احتمال بسیار کمی وجود داره که بین دو دستگاه این مورد تکراری بشه:String m_szDevIDShort = &quot;35&quot; + //we make this look like a valid IMEI
        	Build.BOARD.length()%10+ Build.BRAND.length()%10 + 
        	Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + 
        	Build.DISPLAY.length()%10 + Build.HOST.length()%10 + 
        	Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + 
        	Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + 
        	Build.TAGS.length()%10 + Build.TYPE.length()%10 + 
        	Build.USER.length()%10 ; //13 digitsروش ششم: ترکیبیخب همونطور که توی هر کدوم از این روشا گفته شد، مشکلاتی وجود داره که ممکنه برای ما مهم باشه یا نباشه حتی بعضی از خروجی های این روش ها میتونه با روت شدن دستگاه توسط کاربر و دستکاری، تغییر بکنه. اما بصورت کلی برای کاهش احتمال خطا، میتونین هر محدودیتی خودتون بخواین رو به روش ها اعمال کنین! (مثلاً تعداد کاراکترهای روش پنجم رو تغییر بدین یا ...)حتی میتونین ترکیبی از چند روش رو پیاده کنین، مثلاً تمامی رشته های چهار روش اول رو بگیرین (که ممکنه بعضیاشون null باشن یا دسترسی نداشته باشین بهشون) و یجوری که خودتون دوست دارین ترکیبشون کنین، یا اینکه نتیجه ی ترکیب رو به md5 تبدیل کنین. حتی توی مواردی شاید لازم باشه که اگه کاربر توی نرم افزار لاگین کرده، از id، توکن یا هرچیزی که ازش نگه میدارین هم استفاده کنین.ممکنه روش های دیگه ای موجود باشه که خوشحال میشم اگه میدونین بگین تا با بقیه به اشتراک گذاشته بشه.</description>
                <category>devAndroid</category>
                <author>Mohammad Ghodsian</author>
                <pubDate>Sat, 10 Nov 2018 16:02:08 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت بین نسخه های RC و Beta و Canary در Android Studio</title>
                <link>https://virgool.io/devAndroid/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%DB%8C%D9%86-%D9%86%D8%B3%D8%AE%D9%87-%D9%87%D8%A7%DB%8C-rc-%D9%88-beta-%D9%88-canary-%D8%AF%D8%B1-android-studi-rgwtqe5f4stf</link>
                <description>آیا تابحال فکر کرده اید که تفاوت بین نسخه های RC و Beta و Canary در Android Studio چیست؟اگر شما از کانال پایدار(stable channel) استفاده میکنید شاید متوجه شده اید که همه آپدیت ها را دریافت نمیکنید.منظورم از کانال پایدار چیست؟ شما فقط نسخه تست و منتشر شده &quot;پایدار&quot; را دریافت خواهید کرد، اما اگر شما در کانال قناری (canary channel) باشید ، شما همه آپدیت ها اعم از تست شده یا تست نشده را دریافت خواهید کرد. بنابراین اگر شما میخواهید جدیدترین امکانات را در اولین زمانی که منتشر میشوند را تست کنید، باید از کانال قناری استفاده کنید. چگونگی تغییر کانال :File &gt; Settings (on Windows/Linux), or Android Studio &gt; Preferences (on Mac)در پنل چپ Appearance &amp; Behavior &gt; System Settings &gt; Updatesو از طریق drop-down میتوانید کانال خود را تغییر بدهید(مطمعن باشید که گزینه چک آپدیت اتوماتیک فعال باشد).اگر شما یک نسخه ناپایدار و نسخه پایدار اندروید استادیو کنار هم و جداگانه میخواهید، میتوانید نسخه قناری را از این لینک دانلود کنید.خب، شما میخواهید امکانات جدید را تست کنید و برخی از باگ ها را گزارش بدهید، اما جز کانال قناری، کانال Dev و بتا هم وجود دارد. کدام کانال مناسب شماست :کانال قناری کانال قناری جدیدترین ریلیزها را دریافت میکند (شامل ریلیزهای پایدار هم هست).بدین معنیست که شما میتوانید جدیدترین امکانات را به محض ساخت آن تست کنید. معمولا آپدیت ها بصورت هفتگی منتشر میشوند و اغلب برای نمایش جدیدترین و بهترین ویژگی های جدید استفاده می شود. شما نباید انتظار یک تجربه بدون باگ را داشته باشید.کانال Devکانال Dev شامل ریلیزهای گلچین شده از ریلیزهای قدیمی کانال قناری که برای مدتی تست شده اند، هست.درست مثل کانال قناری، این کانال برای نشان دادن، در اسرع وقت جدیدترین امکاناتی که محتملا پایدار منتشر خواهد شد، استفاده میشود. هنوز این کانال خیلی ناپایدار است و باید فقط برای تست ویژگی های جدید مورد استفاده قرار گیرد. معمولا ریلیزهای کانال Dev بصورت هفتگی یا ماهانه منتشر میشود.کانال بتااگر شما علاقمند به  استفاده از امکانات جدید هستید، با کمترین ریسک، کانال بتا برای شماست. ریلیزهای کانال بتا بطور معمول حاوی تمام امکاناتی هست که یک تیم تصمیم میگیرد که در آن قرار گیرد، اما هنوز انتظار میرود که بعضی باگ ها را داشته باشد و همچنین مشکلات مربوط به عملکرد.کانال پایدارنهایتا، کانال پایدار. این کانال ریلیزهای کاملا تست شده را دریافت میکند و بهترین گزینه بدون مشکل است. در این کانال اندروید استادیو ورژن های جاری را زیاد تغییر نمیدهد. شما باید انتظار عملکرد قابل اطمینان و خوبی را داشته باشید. این احتمالا دلیلی بر استفاده همه از این کانال برای تولید محصول است.خب، من تفاوت بین کانال ها را توضیح دادم و احتمالا نگاهتون به  لیست پایینی افتاده، کانال های پایین تر، بیشتر و بیشتر پایدارتر هستند.بنابراین اکنون بر روی ریلیز های مختلف تمرکز می کنیم. به عنوان مثال من برای توضیح از نسخه 3 اندروید استادیو استفاده خواهم کرد. این نسخه از IDE در نسخه های زیر منتشر شد:ریلیز قنارینسخه 3 اندروید استادیو سفر خود را با ریلیز قناری شروع کرد، زیرا همانطور که قبل از ریلیز قناری اشاره کردم ،هدف این است که ویژگی های جدید را به نمایش بگذارند. با اینکه این ریلیزها تست میشدند، باز بسیار ناپایدار بودند. ورژن 3.0 اندروید استادیو 9 ریلیز قناری داشت. هر ریلیز قناری تقریبا همیشه موقعیت رفع برخی از اشکالات را فراهم میکرد یا گاها برخی از امکانات جدید را شامل میشد. مستندات آخرین ریلیز قناری را می توانید در اینجا ببینید.ریلیز بتاریلیز قناری برخی از رفع اشکالات را شامل میشد و قدم بعدی ریلیز بتا میباشد. ریلیز بتا معمولا پایدارتر و قابل استفاده تر است، اما هنوز تجربه بعضی باگ ها کاملا طبیعیست. ورژن 3.0 اندروید استادیو، 7 ریلیز بتا داشت و آن را به آرامی به محصول نهایی تبدیل میکرد. اگر شما علاقمند به آخرین نسخه بتا منتشر شده باشید، شما می توانید به مستندات در اینجا دسترسی پیدا کنید.ریلیز RCریلیز RC نامزدی از آخرین ریلیزی که قرار است منتشر شود است و آن را به عنوان &quot;گام نقره ای&quot; میشناسند. این آخرین مرحله قبل از ریلیز پایدار است .در این مرحله ورژن 3.0 اندروید استادیو برای استفاده در سایت تولید آماده است، اما در صورتی که باگ های  بیشتری ظاهر شوند به عنوان یک نسخه پایدار مشخص نمی شود.نسخه 3.0 اندروید استادیو دارای 2 نسخه RC بود و فقط با رفع اشکالات عمومی معرفی میشد. آخرین مستندات RC منتشر شده را در اینجا می توانید پیدا کنید.ریلیز پایدارریلیز پایدار ، همانطور که ممکن است آن را حدس بزنید، به عنوان &quot;گام طلایی&quot; شناخته می شود.این ریلیزی است که بیشتر مردم از آن استفاده می کنند، چون امیدوار هستند اشکالات آزار دهنده ای نداشته باشد و قابل اجرا و قابل اعتماد باشد. لینک مستندات.خب، بلاخره دفعه بعد زمانی که نسخه جدید از اندروید استودیو منتشر شد، شما می دانید فرایند ها به چه صورتی خواهند بود.ممنونم که این پست را مطالعه کردید! اگر موردی در متن بیان نشده یا هر مشکل و اشتباهی متوجه شدید ممنون میشم برام اطلاع بدید.</description>
                <category>devAndroid</category>
                <author>حسین حسن نژاد</author>
                <pubDate>Wed, 24 Oct 2018 15:18:18 +0330</pubDate>
            </item>
                    <item>
                <title>Android Developer Tips</title>
                <link>https://virgool.io/devAndroid/android-developer-tips-iyydy4538clt</link>
                <description>۱-با فریمورک های اندروید آشنا شویدمنظور کد خام اندروید است ! کلاس های اندروید را تجزیه و تحلیل کنید Bug های آن را پیدا کنید برخی از آنها را درست کنید شاید این کار ماه ها زمان ببرد هروقت خسته شدید اندروید را کلا کنار بگذارید !۲-ترس از دست دادن (FOMO) را کنار بگذارید(Fear of Missing Out) یا Fomo تنها باعث گم شدن شما در دنیای برنامه نویسی اندروید می شود اندروید بسیار بزرگ است بسیار ! شما نمی توانید اندروید را به صورت کامل از ابتدا تا انتهای یک ماه یادگیرید حتی دو ماه الی سه ماه نیز کافی نیست هرچقدر که یاد گیرید مشاهده می کنید چیز جدیدتری نیز وجود دارد و هروز چیز جدیدتری نیز اضافه می شود اگر تازه کار هستید ترس از FOMO داشته باشید.۳-کدهای دیگران را بخوانیداغلب برنامه نویسان حوصله خواندن کدهای دیگران را ندارند و سعی می کنند همان چیز را با استفاده از دانش خود پیاده سازی کنند ولی این کار خیلی بیهوده است ولی با این کار شما توسعه دهنده نمی شود توسعه دهنده باید حوصله تمام نشدنی ای داشته باشد. شاید بپرسید چه کدهایی را مطالعه کنیم از کتاب خانه یا پروژه های Open Source شروع کنید روزی حداقل ۳۰ دقیقه کدهای دیگران را خوانده و آنها را تجزیه و تحلیل کنید. کلی ایده به دست میارید !۴-زبان های جدید یاد بگیریدمنظورم یادگیری زبان هایی مثل اسپانیایی یا چینی نیست بلکه زبان های برنامه نویسی جدید است واقعیت عمل این است که شما باید چند زبان برنامه نویسی را مورد مطالعه قرار دهید شاید یک زبان برنامه نویسی جایگزین اندروید شد و این کار باعث می شود ذهن برنامه نویسی پیدا کنید مثلا JavaScript یاد بگرید هرچند که خیلی سخت است اما کاربردی است.۵-الگوهای طراحی (Design Patterns) جاوا را یاد گیریدDesign Patterns یکسری الگوی خاص طراحی هستند که در زمان کار با پروژه و آپدیت پروژه فعلی مورد استفاده قرار می گیرند مثلا زمانی که ۳ نوع Design Patterns مثل Factory , Decorator و Facade را شنیدید بدونید درباره چی در حال بحث هستید ! ۶-بروی پروژه های Open-source مشارکت کنیددر نظر بگیرید پروژه باگی شخصی را از github گرفته و بروی آن کار کرده و خطا های آن را حل کنید یا پروژه های خود را که Bug دارند در Github قرار داده و به دیگران بگویید با شما مشارکت کنند تا بتوانید آن مشکل ها را حل کنید.۷-بروی IDE کار کنیدکاری کنید IDE شما برای شما کار کند و بیشترین حد بازدهی را در زمان کد زنی به شما بدهد اگر از اندروید استودیو استفاده می کنید کلیدهای میابنر آن را یاد گیرید برخی از آنها فوق العاده کاربردی هستند اندروید استودیو از آن چیزی که فکر می کنید قدرتمند تر است.۸-وقت آن است که برنامه خود را به درستی طراحی کنیدطراجی یک معماری درست برای برنامه سخت ترین کار ممکن است ولی یک معماری را یاد بگیرید و در برنامه خود از آن استفاده کنید. مثلا معماری های MVVM یا MVP یا MVC برخی از معماری های اپلیکیشن هستند که می توانید مورد استفاده قرار دهید. ۱۰-کد نویسی تمیز را تمرین کنیدیکی از مواردی باید رعایت شود کد نویسی تمیز است شما باید به گونه ای کد نویسی کنید تا در صورتی که پروژه از شما به شخصی دیگر منتقل شد امکان فهم پروژه به سادگی توسط شما ایجاد شده باشد و نیاز به توضیح دوباره پروژه توسط شما و کدهای شما نباشد.۱۱- کدهای اندروید بیشتری تست کنیدتست کردن یکی از عواملی است که باعث می شود شما در شرایط های مختلف نیاز به تست دوباره یک کد نداشته باشید شاید بگوید من یک کد را قبلا دیدم ولی آن را تست نکرده باشید زمانی که آن را در پروژه استفاده می کنید با کلی خطای عجیب و غریب برخورد می کنید بهترین راه تست کردن از قبل است.۱۲-یاد بگیرید چه گونه از کوتلین استفاده کنیدیکی از زبان هایی که بسیار ساده است و به تازگی وارد اندروید شده است kotlin است و همه جا سخن از کوتلین بر سر زبان هاست و به عنوان زبان رسمی اندروید نیز معرفی شده است هرچند که این زبان تکمیل نشده است ولی خیلی زود در حال توسعه است شاید روزی جاوا کلا از اندروید کنار رفت حتما باید کوتلین را جایگزین آن کنید پس یاد گیرید.۱۳-با توسعه دهندگان دیگر مکاتبه کنیدسعی کنید با برنامه نویسانی که تجربه بیشتری دارند صحبت کنید همیشه آنها چندین قدم از شما جلوتر هستند و راهکاری خیلی خوبی برای مشکل های خیلی بزرگ دارند شاید بتوانند در عرض چند ثانیه مشکلی را که شما چند روز بروی آن فکر کرده اید حل کنند.۱۴- بهترین سیستم را تهیه کنیدتا حد امکان همیشه بهترین سیستم را برای برنامه نویسی اندروید انتخاب کنید اگر دقت کرده باشید اندروید استودیو نیازمند memory فوق العاده بالایی است و تعداد process های آن در ثانیه بسیار زیاد است بهترین سیستم برای برنامه نویسی اندروید بدون شک Mac Book Pro با ۵۱۲ گیگ فضا است اگر یکبار Android Studio را بروی آن اجرا کنید فرق آن را با سیستم های ویندوزی درک خواهید کرد ! </description>
                <category>devAndroid</category>
                <author>خانم نیایش</author>
                <pubDate>Thu, 26 Jul 2018 10:48:51 +0430</pubDate>
            </item>
            </channel>
</rss>