مزین کردن اپلیکیشن‌ اندرویدیتون به رمزعبور

استاندارد

چند روز پیش یکی‌ از دوستانم ازم پرسید ، تاحالا شده واسه اپلیکیشن‌هایی که توسعه دادی این امکان رو بذاری که کابر بتونه برای وارد شدن به اپلیکیشن پسورد ست کنه !؟

جواب من در ابتدا نه بود ! ولی‌ از اونجایی که سوال جالبی‌ بود، دست به کد شدم و انجامش دادم ، بعدش گفتم پست وبلاگیش کنم شاید به درد آدمای دیگه‌ای هم خورد.

locked-doors

خب قبل از هر چیز بیاین یه بار دیگه مسئله رو به صورت دقیقتر برسی کنیم.

کاری که ما قراره انجام بدیم اینه که به کاربر امکان ست کردن رمزعبور برای اپلیکیشن رو بدیم و بعد از اون هر زمانی که کاربر از اپلیکیشن خارج شد ، برای ورود مجدد ازش تقاضای وارد کردن رمزعبور کنیم . پس در قدم اول باید بفهمیم که کاربر چه زمانی اپلیکیشن رو ترک کرده و با ذخیره کردن یه flag نشون بدیم که کاربر از اپلیکیشن خارج شده ، در زمان بازگشت کاربر بتونیم اونو به صفحه وارد کردن رمزعبور بفرستیم .

اما نکته مهم اینجاس که متاسفانه اندروید برخلاف IOS ، مستقیما به ما دسترسیی نمیده که با  اون بتونیم چک کنیم که آیا اپلیکیشن ما به حالت background (خارج شده) رفته یا نه ! این مشکل خودش رو زمانی نشون میده که کاربر با استفاده از دکمه Home یا دکمه Recent Application از اپلیکیشن خارج بشه و برنامه کاملا از memory خارج نشده باشه . پس تنها راهی که میمونه اینه که خودمون یجوری این موضوع رو متوجه بشیم .

برای انجام این کار میتونیم از ActivityLifecycleCallbacks کمک بگیریم و به وسیله اون تعداد دفعات شروع (start) و پایان (stop) تمام Activityهای اپلیکیشنمون رو بدست بیاریم و بعد از محاسبه هرجا که تعداد شروع‌ها بیشتر از تعداد پایان‌ها بود یعنی‌ اپلیکیشن ما به اصطلاح در foreground هست یا به زبان دیگه کاربر درحال کار با اپلیکیشنه. و اگه مقدار شروع ها بیشتر یا مساوی تعداد پایان‌ها بود اپلیکیشن در حالت background خواهد بود . تو کد زیر کلاس MyLifecycleHandler  رو نوشتم که توی اون تابع isApplicationVisible دقیقا همین کار رو انجام میده .

توی کلاس بالا داخل تابع onActivityStopped چک میکنم که آیا اپلیکیشن به حالت background میره یا نه ! و در صورتی که به background میرفت به وسیله SharedPreferences یه flag به اسم isAppLeaved رو ذخیره میکنیم . تا در صورت باز شدن دوباره اپلیکیشن و صدا شدن تابع onActivityStarted با چک کردن اون و درصورت true بودن مقدار isAppLeaved ، کاربر رو به صفحه دریافت رمزعبور بفرستیم .

و در آخر هم لازمه که کلاس MyLifecycleHandler  رو برای اپلیکیشنمون ‌ست کنیم . پس یه کلاس میسازیم به اسم MApplication و از Application ارث بری می‌کنیم ، و بعد در متد onCraete کد زیر رو قرار میدیم .

حتما حواستون باشه توی فایل AndroidManifest پروژتون اسم MApplication رو قرار بدین .

خب کار تمومه .

کدهای بالا بخشی از اپلیکیشن sample ای هست که توی گیت‌هاب قرار دادم . اگه خواستید میتونید  از اینجا اپلیکیشن sampleرو دریافت کنید .

لازم به ذکره ، راه حل بالا برای آندروید ۱۴ به بالا جواب میده .

ادغام اپلیکیشن‌های مجزا در اندروید

استاندارد

فکرش رو بکنید که چندتا اپلیکیشن مجزا رو توسعه دادید و حالا نیاز به این دارید که از ترکیب این اپلیکیشن‌ها یه اپلیکیشن جدید تولید کنید . اینجا میخوام یه روش تر و تمیزی که خودم واسه این کار استفاده میکنم رو براتون توضیح بدم.

۱ . در ابتدا بیاید قضیه رو خیلی ساده ببینیم ، پس دو تا پروژه میسازیم و فرایند توسعشون رو تماماً طی میکنیم .

۲ . بعد از اتمام مرحله توسعه باید یکی از پروژه‌ها رو به فرم کتابخونه در بیاریم . واسه اینکار ابتدا فایل gradle پروژه مد نظرتون رو باز کنید و apply plugin: رو به فرم  زیر تغییر بدین .

بعد تکه کد مربوط به applicationId رو از فایل gradle حدف کنید.

۳ . حالا وقتشه این پروژه رو به عنوان ماژول توی پروژه دیگمون import کنیم . برای اینکار اول باید اسم ماژول اصلی پروژه رو تغییر بدیم چون ماژول اصلی پروژه‌هایی که توسط اندروید استودیو ساخته میشن همگی به شکل پیش فرض به اسم app هستند و موقع import کردن ما نمیتونیم یک ماژول با نام مشابه ماژول‌های موجود رو وارد پروژه کنیم . اینجا چگونگی انجام اینکار رو توضیح دادم .

۴ . بعد از تغییر نام ماژول پروژه رو از طریق New > import module به پروژه دیگمون اضافه میکنیم .

۵ . توی قسمت Project Structure برید و پروژه‌ای رو که به عنوان ماژول اضافه کردین رو به لیست dependencies پروژه اضافه کنید .

Untitled

۶ . حالا واسه اخرین کار فقط لازمه چک کنیم که توی فایل AndroidManifest دو تا پروژمون فقط برای یکی از Activity ها کد زیر ست شده باشه.

کد بالای مشخص کننده اولین Activity هست که بعد از شروع برنامه قراره اجرا بشه و چون حالا ما هر دو تا پروژه رو به صورت یک پروژه در آوردیم، طبیعا نمیتونیم دوتا Activity برای شروع داشته باشم .

 

و تمام ، حالا دو تا پروژه‌ای که در ابتدا داشتیم به صورت یک پروژه در اومده .

 

تغییر اسم ماژول اصلی پروژه توی اندروید استودیو

استاندارد

اگه براتون پیش اومده که بخواین اسم ماژول اصلی پروژتون رو تغییر بدین حتما متوجه این شدید که این کار به راحتی تغییر اسم سایر فایل‌های پروژه‌تون نیست . یعنی اگه بخواهید با روش معمول این تغییر نام رو انجام بدین، توی پروژه‌تون با خطا مواجه میشید .

این ماژول اصلی که اندروید استودیو به صورت پیش‌فرض برای پروژه شما میسازه app نام داره که حتما توی پروژه‌تون دیدینش . اینجا ما میخوایم اسم اون ماژول رو به یه اسم دیگه تغییر بدیم .

حالا چطور باید این کار رو انجام بدیم ؟ به روش زیر .

مرحله اول

مثل تغییر اسم برای فایل‌های دیگه عمل میکنیم ، روی ماژولمون کلیک میکنیم و shift + F6 رو همزمان فشار میدیم و گزینه rename module رو انتخاب میکنیم و بعد از اون اسم مورد نظرمون رو وارد میکنیم ( اینجا من میخوام app رو به store تغییر میدم ) .

Untitled

مرحله دوم

حالا فایل setting.gradle رو باز کنید و app: رو به اسمی که توی مرحله اول وارد کردین تغییر بدین . مثلا store: .

مرحله سوم

پیغامی با مضمون Sync Now بالای صفحه به شما نشون داده خواهد شد ، روش کلیک کنید تا عمل sync کردن انجام بشه .

اگه این پیغام به شما نشون داده نشد روی دکمه sync project with gradle files توی نوار بالای اندروید استودیو کلیک کنید تا عمل sync کردن انجام بشه .

sd

مرحله آخر

دایرکتویی که فایل پروژه توی اون ذخیره شده رو باز کنید و اسم فولدر app رو به اسمی که توی مرحله اول وارد کردین تغییر بدین و پس از اون پروژه‌تون رو دوباره باز کنید .

حالا میتونید ببینید که به جای ماژول app یه ماژول دارید با اسم دلخواه خودتون .

 

برسی signature اپلیکیشن‌های اندروید

استاندارد

همونطور که میدونید در انتهای کار توسعه اپلیکیشن‌های اندرویدی ، توسعه دهندگان اپلیکیشن‌ خروجی اپلیکیشن‌ (Apk) خودشون رو بصورت sign شده منتشر میکنند تا مدریت اپدیت‌ها و انشار اپدیت برای اپلیکیشنشون رو فقط و فقط خودشون بتونند انجام بدهند .

ولی خب این sign کردن باعث نمیشه دیگران نتونند کدی که توسعه دهنده اپلیکیشن‌ زده رو تغیر بدند، اما (یه امای بزرگ) واسه خروجی گرفتن از تغییرات انجام شده نیاز هست که دوباره اپلیکیشن sign بشه و با توجه به اینکه keystore که برای sign کردن توسط توسعه دهنده استفاده شده رو اصولا فقط خودش در اختیار داره و کسایی که این تغییرات رو اعمال کردند باید با یه keystore جدید sign کردن رو انجام بدند .

پس حالا نگرانی که پیش میاد چیه ؟ اینکه از کجا میتونیم بفهمیم اپلیکیشنی که دانلود کردیم اپلیکیشن‌ رسمی هست یا نه (توسط توسعه دهنده اصلی sign شده یا نه ) !

کاری که میتونیم بکنیم اینکه با keytool که ابزار جاوا برای مدیریت certificateها و keyها هست اطلاعات مربوط به certificate هر کدوم از apk ها بگیریم و برسی کنیم .

اینجا من apk اپلیکیشن تلگرام رو که از بازار گرفتم رو قراره با apk موجود تو گوگل پلی مقایسه کنم .

مرحله اول

دو تا apkای که قرار هست برسی کنیم رو توی یه فولدر میریزیم .

مرحله دوم

دستور زیر رو توی terminal اجرا کنید . این دستور اطلاعات مربوط به certificate هر apk ای که توی فولدرمون هست رو به ما نشون میده .

مرحله اخر

حالا تنها کاری که میمونه مقایسه اطلاعات بدست اومده با هم هست که باید یکی باشن .

چیزی که این مقایسه به ما نشون میده این هست که هر دوی این نسخه‌ها توسط توسعه دهنده اصلی sign شده و از این بابت مشکلی ندارن .

پینوشت : اگه پسورد فایل keyStore اپلیکیشنتون رو فراموش کردین ، حتما این پست رو بخونید ، شاید بتونه تو پیدا کردنش کمکتون کنه.

پنج تا از بهترین کتابخونه‌هایی که تو توسعه اندروید باید حتما بشناسیم

استاندارد

همونطور که میدونید تو چند سال اخیر شاهد رشد روزافزون استفاده از تلفن‌های هوشمند بین مردم بودیم که این موضوع باعث افزایش تقاضا و به تبع اون افزایش تولید اپلیکیشن‌های این پلتفورم شده . محبوب‌ترین و پرکاربرترین سیستم‌عامل مورد استفاده توی گوشیهای هوشمند اندروید هست .چیزی که این محبوبیت و تعداد زیاد دولوپررهای اندروید به همراه داشته، بوجود اومدن و توسعه تعداد زیادی کتابخونه‌ متن باز بوده(که اتفاق خیلی جذابی هم هست :دی) ،البته این وسط نباید از نقش استفاده از زبان جاوا برای توسعه اپلیکیشن‌های اندرویدی هم چشم پوشی کنیم .

خوبی و بدیهای استفاده از کتابخونه‌ها رو هممون میدونمیم. و اینکه استفاده از کتابخونه‌ها خیلی وقتا باعث افزایش سرعت تو کارهامون میشن و ما میتونیم تمرکزمون رو بجای انجام کارهای غیر اصلی کاملا متوجه کارهای اصلی اپلیکیشنمون بکنیم .

من اینجا میخوام ۵ تا از پر کاربردترین کتابخونه‌های اندرویدی رو براتون بنویسم که میتونند توی برنامه نویسی اندروید خیلی به ما کمک کنند و زندگی رو واسمون شیرین‌تر بکنن  .

01082013AndroidSupportLibrary

GSON .۱

gson کتابخونه‌ای هست که توسط google معرفی شده و به شما این امکان رو میده که به راحتی موجودیت‌های جاوایی خودتون رو به json تبدیل کنید و بالعکس .
اگه توی اپلیکیشنتون درگیر کار با Api ها باشید حتما gson خیلی به کارتون میاد .

همچنین این کتابخونه dependency خیلی از کتابخونه‌های دیگه‌ای هست که شاید استفاده میکنید .

 

RETROFIT

خود توسعه دهندهاش راجع به اون میگن: با retrofit شما میتونید REST API هاتون رو تبدیل به Java interface بکنید .

یکی از راه حل‌های بسیار خوب برای مرتب و تمیز کردن فراخوانی متدهای API ها استفاده از retrofit هست . retrofit به ما اجازه میده که با استفاده از annotation ها بتونیم نوع متدهای مورد استفاده و url هرکدوم رو مشخص کنیم و body مربوط به requestهامون و پارامترهای مربوط به Query رو خیلی راحت اضافه کنیم . همینطور خیلی ساده میتونیم به request مون header اضافه کنیم . همه این امکانات باعث میشه کدهامون خیلی تمیزتر و خواناتر بشن که خیلی نکته مهمی هم هست .

 

 

SUGAR ORM

sugerOrm یه ORM مخصوص اندروید هست ، همونطور که میدونید ORM مخفف Object-relational mapping هست و همونطور که از اسمش معلومه، کاری که orm انجام میده اینکه object های ما رو به نوع داده‌ای قابل ذخیره تو Relational Databaseها تبدیل میکنه و بلعکس . با استفاده از orm میتونیم کارهایی که با استفاده از دستورات طولانی sql انجام میشند رو خیلی ساده انجام بدیم . کد زیر رو در نظر بگیرید .

همونطور که میبینید با ORM میتویند خیلی ساده‌تر عملیات create, read, update و delete رو انجام بدید .

 

PICASSO

Picasso رو هم که حتما باهاش اشنا هستید . این کتابخونه امکان دانلود تصاویر و cache کردن اونها روی memory و دیسک رو میده . همچنین به شما امکانتی مثل resize کردن، برش و امکان تایین فرمت ذخیره سازی هر کدوم از پیکسل‌ها توی حافظه ( ALPHA_8  ARGB_4444 , RGB_565 )و … رو به شما میده که به واسطه اونها میتونید حجم مصرفی memory توسط اپلیکیشنتون رو کاهش بدین .

 

EVENTBUS

این کتابخونه قراره برقراری ارتباط بین بخش‌های مختلف اپلیکیشن رو برای ما ساده‌تر کنه. فرض کنید که میخواید یه متغیری رو از Activity تون به یه سرویس که در حال اجرا هست بفرستید یا یه ارتباط ساده بین fragmentهای موجود تو برناممون ایجاد کنیم. تو مثال پایین وقتی اتصال اینترنت قطع میشه به وسیله eventbus میتونیم هر activity رو که میخوایم از این موضوع باخبر کنیم .

 

همه کتابخونه‌هایی که تو بالا معرفی شد، متن باز هستند و شما میتونید کد مربوط به هرکدوم رو بخونید .