Page 1 of 1

Advices for Android development

PostPosted: Wed Jan 18, 2012 8:33 pm
by tudle_
1. Memory weakness

- не алокирай памет, ако можеш да го избегнеш;
- не прави неща (функциионалности, …), които не са ти нужни;
- за повече информация:
http://developer.android.com/guide/prac ... mance.html

2. Избягвай модални activities и dialogs. Не изпадай в състояние, в което потребителя да чака. Т.е. да не може да прави нищо с телефона си, докато ти обработваш данни.

3. Да се избягва създаване на нови обекти - създаването на обекти кара Garbаdge Collector-a да се извиква по-често, което забавя. Да се избягват short-lived temporary objects.

4. Да се избягват мултидименсионните масиви от примитивни типове. array [int, int] да се разделя на два паралелни arr1[int] и arr2[int].

5. Разликата между Map и HashMap като бързодействие е 6% в полза на Map, а JIT ги прави еднакво бързи.

6. За да работи layout_weight, трябва да използваме 0dp за layout_width или layout_height. Използвай layoutopt или Android Lint - те ще ти подскажат.

7. В RalativeLayout, когато имаме view (layout) на дъното (align_parrentBottom=true), създаваме custom Theme. В ресурсен файл се създава:
<item name="android:windowSoftInputMode">adjustPan</item>
Пример:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TitleBarTheme" parent="android:Theme">
<item name="android:windowTitleSize">45dp</item>
<item name="android:windowTitleBackgroundStyle">@null</item>
<item name="android:windowSoftInputMode">adjustPan</item>
</style>
</resources>

8. Изход от приложение
Intent exitIntent = new Intent(Intent.ACTION_MAIN);
exitIntent.addCategory(Intent.CATEGORY_HOME);
exitIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(exitIntent);

9. Прочети и СПАЗВАЙ препоръките на този адрес
http://source.android.com/source/code-style.html

10. Не игнорирай Exceptions. Как да ги обработваме в линка от точка 9.

11. Да има налични всички ресурси в съответната default папка.

12. При използване на AsynchTask да се показва някакъв progress.

13. Не ъпдейтвай widgets твърде често.

14. Споделяй данни, за се избегнат дупликации. (Share data to minimize duplication).

15. Използвай Receivers и Alarms вместо Services и Threads.

16. Minimize resource contention.

17. User experience трябва да бъде твоят пръв приоритет.

18. Мисли за очакванията на потребителя за навигация в приложението.

19. Придържай се към общоприетите за ОС-мa правила.

20. Back бутона трябва да връща към предишен екран в навигацията между екраните.

21. Винаги поддържай trackball.

22. Избягвай скриването на Status Bar.

23. Не пренаписвай меню бутона.

24. Изпращай данни във фонов режим, само след като си питал потребителя и е разрешил.

25. Не използвай недокументирани API-та.

26. Уважавай цикъла на живот на приложението (activity).

27. Поддържай портретен и пейзажен режим.

28. Не спирай ротацията на екрана.

29. Не прави предположения за размерите на екраните. Използвай релативни мерни единици за размери на view-тата. Оптимизирай екраните за различни резолюции.

30. Осигури хардуерна поддръжка за приложението си. (отбележи <uses-feature /> в AndroidManifest).
Пример:
http://developer.android.com/guide/topi ... ement.html

31. Проверявай за наличие на хадуер преди да използваш API свързано с него.
Пример:
BluetoothAdapter mBluetoothAdapter= BluetoothAdapter.getDefaultAdapter();
// If the adapter is null, then Bluetooth is not supported
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
finish();
return;
}

32. Използвай tools (layoutopt и hirearchyviwer) за да оптимизираш своите екрани.
Пример:
> layoutopt res/layout-port/data_upload.xml
84:117 This LinearLayout layout or its TableRow parent is useless - отговор. Показва между кои редове кодът може да бъде оптимизиран.

33. Стартирай други приложения чрез Intents.

34. Използвай Analytics и Feedback. ( ..... )

35. Слушай за системни събития и за такива от други приложения.
Пример:
IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mBCReceiver, intentFilter);

private final BroadcastReceiver mBCReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice newDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if ((newDevice.getBondState() != BluetoothDevice.BOND_BONDED) && isHealthDevice(newDevice)) {
mNewDevicesArrayAdapter.add(newDevice.getName(), newDevice.getAddress(), newDevice.getBluetoothClass().getDeviceClass());
}
}
}
};
36. Избягвай вътрешни за клас извиквания на getters и setters. Достъпвай до членовете на класа директно. ( this.member;)

37. Не се задоволявай с “добро”.