1- فراموش نکنید که مقدار صفت android:updatePeriodMillis
در تگ <appwidget-provider
فایل xml/widget_info.xml بیانگر تایمری هست که کالبک onUpdate
کلاس ویدجت صدا زده میشه.
2- در metadata ویدجت، مقدار صفت android:minHeight
و android:minWidth
تعیین کننده حداقل اندازه ویدجت هستش که باید 72dp (یعنی 1x1) باشه. ولی صفت android:layout_width
و android:layout_height
در layout ویدجت، تعیین کننده اندازه کنونی ویدجت هستش.
3- از انجایی که List
متدی برای اضافه کردن عنصر نداره و سایزش هم ثابت هست، برای تبدیل Array
به ArrayList
باید به این روش عمل کنید:
ArrayList<String> _arrayList = new ArrayList<String>(Arrays.asList(myArray));
4- برای چک کردن وجود یک مقدار در آرایه کافیست به این صورت عمل کنید:
Arrays.asList(myArray).contains(targetValue);
5- نکته جزیی: فراموش نکنید که HashMap
در جاوا در واقع همون data structure هستش و نه آرایه!
6- نکته جزیی: زمانی از LinkedList
استفاده کنید که قراره تعداد بسیار زیادی عملیات add/remove انجام بشه و نه عملیات random access.
7- مزایای استفاده از dependency injection در طراحی کلاس/متد:
- تمیز شدن کد و افزایش خوانایی کد
- آزاد شدن اتصالات و روابط کلاسها(loosely coupled)
- افزایش reusable شدن کد
- ساده شدن فرایند test کد
8- همیشه در طراحی لیست/آرایه Boolean
از BitSet
استفاده کنید. BitSet
سی پی یو و مموری cache friendly هستش.
9- آیا می دونید در اندروید کانال STDOUT و STRERR یا همون System.out
و System.err
به /dev/null/ منتقل میشن؟
10- آیا می دونید String x = new String("abc");
با String y = new String("abc");
برابر(==) نیست؟
چون آدرس(رفرنس) هرکدوم در حافظه متفاوت هست.
11- هیچ کدام از کالبک های موجود در کلاس ویدجت(AppWidgetProvider
) نیاز به صدازدن Superclass ها ندارن، بجز کالبک onReceive
. (چون خالی هستن)
12- درکجا باید از Context نوع Application و درکجا باید Context نوع Activity استفاده کرد:
مورد/نوع | Application | Activity |
Toast | X | |
Dialogs / Views | X | |
Intent/Activity | X | |
Layout inflation | X | |
Service | X | |
Send broadcast | X | X |
Broadcast Receiver | X | X |
Resource values | X |
13- نکته جزیی: آیا می دونید android.util.Patterns.IP_ADDRESS
فقط IPv4 رو شامل میشه؟
14- نکته جزیی: با uninstall شدن برنامه، cache و تنظیمات برنامه هم حذف خواهند شد.
15- توسط متد ActivityManager.clearApplicationUserData()
در اندروید 4.4 به بعد می تونید data تنظیمات برنامه رو حذف کنید.
16- هنگام کار با WebView
، برای امنیت بیشتر بهتره تنظیمات setJavaScriptEnabled, setGeolocationEnabled, setAllowFileAccess
رو false
قرار بدید.
17- برنامه هایی که با یک کلید Sign شده و همگی از shared user Id یکسانی استفاده می کنن(در فایل AndroidManifest.xml) می تونن از فایلهای private یکدیگر استفاده کنن.
18- از اونجایی که جاوا از optional parameter پشتیبانی نمی کنه، به روش زیر می تونید این قابلیت رو شبیه سازی کنید:
public void myMethod(final Object object, final boolean... enabled) { // ... if (enabled[0]) { // خخخخخخ } return; }
19- سعی کنید متغیرهای کلاس رو در خارج از متد constructor آماده سازی/Initialize کنید. (اینها مقادیر پیشفرض دارن و حتی قبل از اینکه سازنده کلاس صدا زده بشه مقدار دهی می شوند. پس دوباره به اونها مقدار ندید. بعلاه خوانایی کلاس راحت تر و سریع تر انجام میشه)
20- صفت android:layout_gravity
محل قرار گیری (کل) ویدجت رو تعیین می کنه و صفت android:gravity
محل قرارگیری محتوای ویدجت رو تعیین می کنه.
21- یادتون باشه که: فایلهای layout فقط برای طراحی قالب و چهارچوب صفحات برنامه هستن، styles.xml برای شکل دهی به عناصر قالب، dimens.xml برای تعیین اندازه و ابعاد عناصر، colors.xml برای رنگ بندی عناصر، strings.xml برای متون موجود در عناصر و... هستند. پس در ترکیب و قرارگیری اینها دقت کنید.
22- تغییر رفتار و امکانات keyboard اندروید در مقابل مقدار صفت inputype
عنصر EditText:
<EditText android:id="@+id/et_test" android:inputType="?????"/>
نوع inputtype | نوع Keyboard | رفتار دکمه Enter | شکلک | Case حروف | Suggestion | کاراکترهای اضافی |
textLongMessage | الفبا / پیشفرض | ارسال / بعدی | دارد | lowercase | دارد | , و . و همه چیز |
textFilter | الفبا / پیشفرض | ارسال / بعدی | دارد | lowercase | ندارد | , و . و همه چیز |
textCapWords | الفبا / پیشفرض | ارسال / بعدی | دارد | Camel Case | دارد | , و . و همه چیز |
textCapSentences | الفبا / پیشفرض | ارسال / بعدی | دارد | Sentence case | دارد | , و . و همه چیز |
time | اعداد | ارسال / بعدی | ندارد | - | ندارد | فقط : |
textMultiLine | الفبا / پیشفرض | خط بعدی | دارد | lowercase | دارد | , و . و همه چیز |
number | اعداد | ارسال / بعدی | ندارد | - | ندارد | ندارد |
textEmailAddress | الفبا / پیشفرض | ارسال / بعدی | ندارد | lowercase | ندارد | @ و . و همه چیز |
بدون نوع | الفبا / پیشفرض | خط بعدی | دارد | lowercase | دارد | , و . و همه چیز |
textPassword | الفبا / پیشفرض | ارسال / بعدی | ندارد | lowercase | ندارد | , و . و همه چیز |
text | الفبا / پیشفرض | ارسال / بعدی | دارد | lowercase | دارد | , و . و همه چیز |
textShortMessage | الفبا / پیشفرض | شکلک | دارد | lowercase | دارد | , و . و همه چیز |
textUri | الفبا / پیشفرض | ارسال / بعدی | ندارد | lowercase | ندارد | / و . و همه چیز |
textCapCharacters | الفبا / پیشفرض | ارسال / بعدی | دارد | UPPERCASE | دارد | , و . و همه چیز |
phone | اعداد | ارسال / بعدی | ندارد | - | ندارد | * # . - / () W P N , + |
textPersonName | الفبا / پیشفرض | ارسال / بعدی | دارد | lowercase | دارد | , و . و همه چیز |
نکته: در صورتی که تنظیم Auto-capitalization در تنظیمات Keyboard فعال باشه، Case حروف رفتار پیشفرض خواهد داشت، در غیر اینصورت همه حروف کوچیک خواهند شد.
نکته 2: زبان نوع Keyboard اعداد همگی انگلیسی 1234567890 می باشد.
نکته 3: در صورتی که تنظیم Correction/Suggestion در تنظیمات Keyboard فعال باشه، Suggestion بدرستی رفتار خواهد کرد، درغیر اینصورت در همه موارد خاموش خواهد ماند.
23- مقدار center
با مقدار center_vertical|center_horizontal
و مقدار fill
با مقدار fill_vertical|fill_horizontal
در صفت android:gravity
و صفت android:layout_gravity
برابر هست.
24- برای حل مشکل موقعیت متن EditText
در اندروید 5.0 کافیه مقدار صفت android:spacing
رو 0dp قرار بدید.
25- برای نمایش تصاویر بسیار بزرگ(بیشتر از 2000 پیکسل) بهترین گزینه استفاده از WebView
هستش.
26- رفتارهای متفاوت مقادیر FIT_CENTER و CENTER_INSIDE در صفت android:scaleType
:
- اگر تصویر بزرگتر از container باشه، مقدار FIT_CENTER و CENTER_INSIDE رفتار یکسانی خواهند داشت.
- اگر تصویر کوچکتر از container باشه، مقدار FIT_CENTER تصویر رو scale خواهد کرد.
- اگر تصویر کوچکتر از container باشه، مقدار CENTER_INSIDE تصویر رو بدون تغییر در مرکز قرار خواهد داد.
27- کاربرد تگ include
با ویدجت ViewStub
متفاوته! تگ include
صرفاً محتوای XML فایل دیگر رو در جایی دیگر ضمیمه می کنه. ولی ویدجت ViewStub
کلکسیونی از ویدجت ها می تونه باشه که در زمان نیاز نمایش یا مخفی شون کنه.
28- خلاصه اصطلاحاتی درباره سایز و کیفیت صفحه دستگاه اندروید:
Screen size: بیانگر سایز فیزیکی صفحه دستگاه هستش که برای layout و ویدجت ها استفاده میشه. گروه بندی: small, normal, large, extra-large
Screen density / DPI: بیانگر تراکم پیکسل های موجود در صفحه دستگاه هستش که به DPI یا همون Dot Per Inch معروفه. برای مثال دستگاهی با DPI low فقط تعداد اندکی پیکسل در صفحه فیزیکیش وجود داره پس تصاویر هم از کیفیت پایینی برخوردار هستن... گروه بندی: low-dpi, medium-dpi, high-dpi, xhigh-dpi, xxhigh-dpi, x*xxhigh-dpi (برای دسته بندی تصاویر و گرافیک استفاده میشه)
Orientation: بیانگر شیوه نمایش به کاربر هستش. گروه بندی: ایستاده/portrait, خوابیده/landscape
Resolution: بیانگر تعداد کل پیکسل های موجود در صفحه دستگاه هستش. گروه بندی: 320x240, 480x320, 800x480 و...
Inch: بیانگر قطر فیزیکی صفحه هستش که از رادیکال ((طول*2)+(عرض*2)) بدست میاد. گروه بندی: 4.4", 4.7", 5", 10", 15" و...
29- نکته جزیی: از واحد sp فقط برای اندازه متون/font و از واحد dp برای اندازه ویدجت ها باید استفاده بشه.
30- شیوه صحیح و کوتاه full screen کردن Dialog
:
_dialog = new Dialog(this, LayoutParams.MATCH_PARENT); یا _dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); یا _dialog = new Dialog(this, WindowManager.LayoutParams.FLAG_FULLSCREEN);
31- در صورتی که پیچیدگی در عناصر صفحه برنامه وجود نداره، بجای RelativeLayout از LinearLayout استفاده کنید... به دلیل اینکه:
1- در LinearLayout عناصر Visibility.GONE و Visibility.VISIBLE شده بدرستی در کنار هم قرار میگیرن، ولی در RelativeLayout خیر.
2- در دستگاه های کوچیک، عناصر موجود در LinearLayout ثابت و منظم می مونن ولی عناصر موجود در RelativeLayout با به هم ریختگی بر روی هم قرار می گیرن.
3- برای تنظیم عناصر در LinearLayout نیازی به تعریف ID برای عناصر نیست، ولی در RelativeLayout نیاز هست تا تک تک عناصر ID گذاری بشن.
4- LinearLayout قابلیت تنظیم weight داره، ولی RelativeLayout نداره.
32- رایجترین resolution های دستگاه های اندروید:
240x320, 320x480, 480x800, 540x960, 640x360, 600x1024, 768x576, 800x400, 960x540, 1024x600, 1280x720, 1280x800, 1366x768, 1440x904, 1600x1200, 1920x1080, 1920x1200, 2048x1536, 2560x1440, 2560x1600
33- از انجایی که کلاس های Anonymous سازنده ندارن، بهترین راه استفاده از instance initializers هستش.
34- یادتون باشه که تقدم اجرای initializer ها در یک کلاس همیشه بصورت: Static initializer -> Instance initializer -> Constructor هستش.
public class MyClass { // Constructor initializer public MyClass() { // #3 } // Static initializer static { // #1 } // Instance initializer { // #2 } }
35- یک دلیل رخداد خطای Performing stop of activity that is not resumed میتونه متغیرهای اکتیویتی باشن که توسط اندروید آزاد/free شده و اکتیویتی شما دیگر به مقدار اصلی/نهایی متغیر دسترسی نداره... لذا مقدار متغیر به پیشفرض/default تغییر کرده. (البته این مسله زمانی رخ میده که سیستم اندروید نیازمند حافظه بیشتری برای برنامه foreground داشته باشه، بنابراین توسط پاکسازی حافظه برنامه های background تامینش میکنه)
36- فقط زمانی متدهای setter/getter رو پیاده سازی کنید که در متد پردازش یا محاسباتی صورت میگیره... درغیر این صورت باید از field استفاده کنید که سرعتش هم 3 برابر بیشتر از متد هستش. (مگر اینکه نیاز به تصریح در Interface رو داشته باشید)
37- اگر در جاوا 5 به قبل، کلاس Thread
رو instantiate کنید و متد start()
ش رو صدا نزنید، memory leak انجام دادید!
38- دلیل رخداد خطای error: Error retrieving parent for item: No resource found that matches در برنامه Eclipse، نسخه اندروید و theme ای هست که انتخاب کردید... برای نمونه تم Holo در اندروید 2 موجود نیست و در صورت ایجاد پروژه با این مشخصات با این خطا مواجه میشید.
39- هرگز اطلاعات حساس و مهم رو بر روی SD Card ذخیره نکنید، مگر بکمک encryption و سطح دسترسی MODE_PRIVATE
.
40- حتاالمکان سطح دسترسی ContentProvider برنامه رو محدود یا کلاً غیرفعال کنید... برای اینکار کافیه مقدار صفت android:exported
در تگ activity
رو false
قرار بدید:
<activity android:name="mypackage.myapp.myactivity" android:exported="false"> ... </activity>
نکته: این کلاس ContentProvider
، امکان دسترسی و اشتراک گذاری اطلاعات و دیتای برنامه شمارو برای دیگر برنامه ها فراهم میکنه. بنابراین لازمه که سطح دسترسیش محدود بشه.
توجه: در اندروید نسخه 4.1 به قبل، بطور پیشفرض مقدار این صفت public هستش و در اندروید نسخه 4.2 به بعد مقدار این صفت private یا همون false هستش.
مقالات مرتبط
نکات و اصول مهم در برنامه نویسی Java/Android
#2 - نکات و اصول مهم در برنامه نویسی Java/Android
#3 - نکات و اصول مهم در برنامه نویسی Java/Android
#4 - نکات و اصول مهم در برنامه نویسی Java/Android
نوشتن و سپس شما باید این روش را به وبلاگ خود برسد.