فرق بین دیباگ (Debug) و ریلیز (Release) در اندروید هم از نظر رفتار اپلیکیشن متفاوته، هم از نظر نحوه ساخت، امضا، بهینهسازی و دسترسیها. اینها رو در ادامه توضیح میدم:
فرق بین دیباگ (Debug) و ریلیز (Release) در اندروید هم از نظر رفتار اپلیکیشن متفاوته، هم از نظر نحوه ساخت، امضا، بهینهسازی و دسترسیها. اینها رو در ادامه توضیح میدم:
ویژگی | git reset |
git restore |
---|---|---|
محدوده تأثیر | روی history (commit) و staging (index) اثر داره | روی فایلهای working directory یا staging اثر داره |
مناسب برای | برگشت دادن commit یا unstaging فایلها | برگردوندن فایلها به حالت قبل |
خطرناک؟ | ممکنه commit حذف کنه (بسته به نوع reset مثلاً --hard ) |
نه، فقط فایلها رو به حالت قبلی برمیگردونه، امنتره |
reset = بیشتر برای commit history و stage هست، خطرناکتره مخصوصاً با --hard
restore = بیشتر برای فایلهای فعلی هست، امنتره، مخصوصاً وقتی فقط بخوای یه فایل رو برگردونی
برای تغییر رنگ پراگرس بار، باید توی فایل styles، واسش یه استایل کاستوم تعریف کنیم:
<style name="ProgressBarTheme" parent="Widget.AppCompat.ProgressBar">
<item name="android:indeterminateTint">#BBE6FF</item>
</style>
و بدین شکل توی پراپرتی های xml براش ست کنیم:
style="@style/ProgressBarTheme"
V1 (Jar Signature)
V2 (APK Signature Scheme v2)
V3 (APK Signature Scheme v3)
V4 (APK Signature Scheme v4)
امضای دیجیتال (Signing) در اپلیکیشنهای اندرویدی فرآیندی است که به تایید اصالت و یکپارچگی فایل APK کمک میکند.
وقتی یک برنامه اندروید (فایل APK) ساخته میشود، نیاز است که امضا شود. این امضا برای موارد زیر ضروری است:
اگر از اپراتور null safety کاتلین که .? هست، برای چک کردن نهایی null بودن متغیر باید به صورت زیر عمل کرد:
var word: String? = "Elvis"
val length: Int = if (word != null) word.length else -1
یعنی باید به صورت Explicit بررسی کرد که آیا word مقدار null دارد یا خیر. به جای بررسی کردن با if میشه از :? استفاده کرد.
val word: String? = "Elvis"
val length: Int = word?.length ?: -1
به این اپراتور Elvis گفته میشه و میگه اگر word مقدارش null بود، 1- جایگزین بشه.
1. سینگل تون
2. بیلدر (با توجه به وجود named constructor و کلاس data در کاتلین این دیزاین پترن معنی نداره)
3. فکتوری
4. dependency Injection (DI)
5. Facade:
امکان این را می دهد که رابط ساده ای را برای دسترسی به یک سیستم پیچیده ایجاد کرد. در واقع، زیر ساخت های پیچیده سیستم را مخفی کرده و به کاربر اجازه می دهد تا بدون آگاهی از پیچیدگی داخلی، با سیستم تعامل داشته باشه. مثل اینترفیسی که در رتروفیت برای تعریف متدهای نتورک استفاده میشه.
6. Adapter:
این دیزاین پترن برای اتصال دو کلاس با ساختارهای متفاوت استفاده می شود. به عبارت دیگر، یک میانجی بین دو ساختار دیگر است. این میانجی تغییرات لازم را روی داده های سورس انجام میده تا در مقصد نشون داده بشه بدون اینکه داده های اصلی تغییر پیدا کنه. مثل اداپتر در ریسایکلر ویو که لیستی از داده های منبع که عموما لیست یا آرایه هست را به view holder که قابل نمایش برای ریسایکلر ویو است را تبدیل میکند.
در برنامه نویسی imperative باید step by step مشخص کنیم چیا میخوایم. (How) - در این حالت مثلا میگیم میخوایم فلان تکست توی textView نمایش داده بشه
در برنامه نویسی declarative فقط میگیم چیا میخوایم. (What) - در این حالت state داریم و میگیم قراره state تکست جدیدی رو نشون بده.
مثال imperative programming:
val list = listOf(1, 2, 20, 3, 4, 25, 5)
val newList: MutableList<Int> = ArrayList()
for (i in list) {
if (i < 10) {
newList.add(i)
}
}
Log.d(TAG, "imperative newList: $newList")
مثال declarative programming:
Log.d(TAG, "declarative newList: ${list.filter { i -> i < 10 }.toList()}")
1. چنل Canary: این چنل unStable ترین هست و زود به زود (هفتگی) آپدیت میشه. برای اینه که یوزرا متوجه بشن چیا جدید اومده ولی این نسخه اصلا مناسب پروداکشن نیست.
2. چنل Dev: نسخه این کانال از Canary با ثبات تر هست. به روز رسانی هایی کمتر از Canary داره و مناسب توسعه دهندگانی است که میخواهند قبل از انتشار عمومی، نسخه های جدید اندروید استودیو را آزمایش کنند. مناسب پروداکشن نیست.
3. چنل Beta: این چنل شامل نسخه ای است که به طور کامل آزمایش شده و آماده انتشار عمومی هست. اما ممکن است شامل تمام ویژگی های جدید نباشد.
4. چنل Stable: نسخه پایدار که مناسب پروداکشن و تمامی کاربران است.
Modifier یکی از مهم ترین Composableها هست که میتونه ویژگی های زیادی رو برای دیزاین در اختیار ما بذاره. در compose، ترتیب (order) قرار گرفتن پراپرتی های Modifier مهمه و میتونه نتیجه رو تغییر بده. این مثال نشون میده که چجوری جا به جایی padding میتونه در جواب نهایی تاثیر داشته باشه.
Modifier کاستوم شده
fun Modifier.socialMedia(): Modifier = composed {
if (isSystemInDarkTheme()) {
this
.border(shape = RoundedCornerShape(16.dp), width = 2.dp, color = BlueGray)
.background(Color.Transparent)
} else {
this
.border(shape = RoundedCornerShape(16.dp), width = 2.dp, color = LightGray)
.background(LightBlueWhite)
}
}
this همون آنجکت Modifier هست که میتونه نوشته نشه.