یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم: آنکس که تخصص ندارد و کاری را می پذیرد، بی تقواست!

تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران
بایگانی

در ادامه مقاله قبلیم که شماره چهار "نکات و اصول مهم در برنامه نویسی Java/Android" بود، در این مقاله شماره پنج همین موضوع رو ارائه میدم...

 

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- نکته جزیی: متد length برای گرفتن طول String و متد length() برای گرفتن طول Array استفاده میشه.

 

8- همیشه در طراحی لیست/آرایه Boolean از BitSet استفاده کنید. BitSet سی پی یو و مموری cache friendly هستش.

 

9- آیا می دونید هر Object در جاوا 16 بایت فضا اشغال میکنه؟ 12 بایت برای خود شی و 4 بایت برای هدر شی. بدون متد و فیلد.

 

10- آیا می دونید String x = new String("abc"); با String y = new String("abc"); برابر(==) نیست؟

 

11- هیچ کدام از کالبک های موجود در کلاس ویدجت(AppWidgetProvider) نیاز به صدازدن Superclass ها ندارن، بجز کالبک onReceive. (چون خالی هستن)

 

12- جدول زیر، لیست مواردی هست که درکجا باید از Context نوع Application یا Activity استفاده کنید:

 

مورد/نوع Application Activity
Toast X  
Dialogs   X
Intent/Activity   X
Layout inflation   X
Service X  
Send broadcast X X
Broadcast Receiver X X
Resource values X 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 هستش.

۹۶/۰۱/۱۲

نظرات (۴)

۰۱ مهر ۹۶ ، ۱۵:۴۷ علی احمدی
دمتون گرم.
واقعا حرف دلم رو زدید.
چرا آخه باید این مملکت به این روز بیفته !!!
پاسخ:
کدوم حرف؟
به چه روزی؟
بسیاری از آن ها بازی هایی را بازی می کنند که همه آنها می خواهند.
در لیست بالا Terius 'The Dream' Nash، تاج را برای موسیقی کلی می گیرد
توانایی و محتوای منحصر به فرد. بلند کردن روند مد محبوب خود را و تا حدودی بیشتر!
I believe what you wrote made a ton of sense. But, what about this?
suppose you added a little information? I am not saying
your information isn't solid., however what if you added
a title that grabbed a person's attention? I mean #5 - نکات و اصول مهم در برنامه نویسی Java/Android :: یوشا آل ایوب is kinda plain. You might look at
Yahoo's front page and note how they create post headlines
to grab people interested. You might try adding a video or a related picture or two to grab people excited about what you've got to say.
Just my opinion, it could bring your website a little livelier.
My brother recommended I might like this web site. He was
entirely right. This post truly made my
day. You can not imagine simply how much time I
had spent for this info! Thanks!
کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">