Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Girişimciler ve Geliştiriciler için Android - Etkin Android Programlama

1.020 visualizaciones

Publicado el

Girişimciler ve Geliştiriciler için Android

Publicado en: Software
  • Sé el primero en comentar

Girişimciler ve Geliştiriciler için Android - Etkin Android Programlama

  1. 1. Girişimciler ve Geliştiriciler için Fatih Sökmen https://github.com/fatihsokmen/android-seminar-code
  2. 2. Android OS Linux Kernel, (libc, X11 gibi kutuphane ve runtimelar yok) Open Handset Alliance tarafından desteklendi, proje Google tarafından yönetildi Ilk beta SDK in 2007 Apache Software Licence, Version 2.0 (Kernel hariç) SQLLite, Webkit, OpenGL, Medya Yoneticisi CDD - CTS
  3. 3. Android SDK Telephony, Wifi Manager, P2P, Bluetooth & NFC Map, Location Multimedya Kontrolu Sensor Api (Accelerometer, Compass, ...) Process, IPC, Arka plan servisleri Data Stores (SQLite, ContentProviders, ...) UI Framework
  4. 4. Development Framework Android Api Geliştirme Araçları (Compiler, packagers, dextools) Virtual Device Manager ve Emulator Dokümantasyon Örnek Kodlar developer.android.com
  5. 5. Linux Kernel Bionic | Binder IPC | Ashmem | Pmem | Wakelocks | Alarms Low Memory Killer | Paranoid Network Security | ...
  6. 6. Android Runtime Dalvik | ART
  7. 7. JavaVM - stack-based Dalvik - register based
  8. 8. Apk *.java R.java jar Classes.dex dxjavac res/*.* Resources.arc Android Manifest app.jar app.apk aapt
  9. 9. Cihaz Dağılımı Data collected during a 7-day period ending on 4 May, 2015
  10. 10. Device Api %93 > 4.0+
  11. 11. Geliştirme Ortamları Eclipse Android Studio Build System - Gradle
  12. 12. <manifest/>
  13. 13. Güvenlik SandBox Permission Signature
  14. 14. Komponentler Activity Service ContentProvider Intent BroadcastReceiver Notification
  15. 15. MainTread (Main Looper)
  16. 16. Activity Lifecycle
  17. 17. Layout inflate <merge/> LinearLayout FrameLayout RelativeLayout <view/> <ViewStub/>
  18. 18. Fragment Dinamik UI Tekrar Kullanılabilirlik Etkin Hafıza Yönetimi Parametresiz “Constructor”
  19. 19. Uygulama içi haberleşme Fragment -> Activity Service <-> Activity (UI)
  20. 20. UX ve Kullanıcı Etkileşimi
  21. 21. Çözünürlük (px vs dp) xhdpi 2.0 hdpi 1.5 mdpi 1.0 (baseline) ldpi 0.75
  22. 22. Yükseklik & Genişlik wrap_content & match_parent & dp
  23. 23. Nine-Patch
  24. 24. Selector
  25. 25. Navigasyon ActionBar & Toolbar Drawer List & Grid
  26. 26. Memory Management
  27. 27. Active Process Visible Process Started Service Process Background Process Background Process Uygulama Önceliği Low Memory Killer
  28. 28. Application Lifecycle Events public class MyApp extends Application { @Override public void onLowMemory() { super.onLowMemory(); } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); } }
  29. 29. Non-static sınıf tanımı ve dezavantajları
  30. 30. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new SampleTask(this).execute("http://..."); } private void handleData(String data) { ... } private class SampleTask extends AsyncTask<URL, Void, String> { protected String doInBackground(URL... url) { // job in background thread ... } protected void onPostExecute(String data) { handleData(data); } }
  31. 31. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new SampleTask(this).execute("http://..."); } private static class SampleTask extends AsyncTask<URL, Void, String> { private WeakReference<SampleActivity> activityRef; public SampleTask(activity) { activityRef = new WeakReference(activity); } protected String doInBackground(URL... url) { // job in background thread ... } protected void onPostExecute(String s) { if (activityRef.get() != null) { // do some stuff with activity } }
  32. 32. Uzun ömürlü objelerin Context’e bağımlılığını azaltmak için «WeakReference» kullanımı
  33. 33. public class DownloadManager { private static DownloadManager instance = new DownloadManager(); private ArrayDeque<Callback> callbacks; private DownloadManager() { callbacks = new ArrayDeque<Callback>(); } public static DownloadManager getInstance() { return instance; } public void enqueue(String url, Callback callback) { callbacks.add(callback); // enqueue download request } }
  34. 34. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } protected void download(String url) { DownloadManager.getInstance().enqueue(url, new Callback<>() { public void success(...) { } public void failure(...) { } }); }
  35. 35. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } protected void enqueueDownload() { DownloadManager.getInstance().enqueue("http://...", new Callback<>() { public void success(...) { } public void failure(...) { } }); } Anonim inner classlar outer classlara her zaman referans tutarlar
  36. 36. public class DownloadManager { private static DownloadManager instance = new DownloadManager(); private ArrayDeque<<WeakReference<Callback>> callbacks; private DownloadManager() { callbacks = new ArrayDeque<Callback>(); } public static DownloadManager getInstance() { return instance; } public void enqueue(String url, Callback callback) { callbacks.add(new WeakReference<Callback>(callback)); ... } }
  37. 37. Background threadlerinizi activite sonlanırken sonlandırın, runtime bunu sizin yerinize yapmaz. Bunun için thread ve aktiviteler arasında interface metodları tanımlayın
  38. 38. class BackgroundWorker extends Thread { private volatile boolean keepRunning = false; public void run() { keepRunning = true; while (keepRunning) { // do background stuff } } public void finish() { keepRunning = false; } }
  39. 39. private BackgroundWorker worker; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); worker = new BackgroundWorker(); worker.start(); } protected void onDestroy() { super.onDestroy(); worker.finish(); }
  40. 40. Büyük boyutlu bitmap kullanımında nerelere dikkat edilmeli ?
  41. 41. byte[] bitmap = ... //Load from network or resources BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(bitmap, 0, bitmap.length, Options options); int h = options.outHeight; int w = options.outWidth;
  42. 42. Bitmaplerin önbelleğe alınması Bitmaplerin önbelleğe alınması için ‘WeakReference’ yerine LRU’u tercih edin. Peki neden ?
  43. 43. Dinamik datanızı ContentProvider’larda depolayın Bu, etkin hafıza kullanımı için ve etkili bir arayüz deneyimi için önemlidir.
  44. 44. Avantajları Büyük miktarda datayı hafızada tutmazsınız Off-line data Cursor ile listeleme çok hızlıdır. Datanızı diğer uygulamalara açmak için bir arayüz sunar. View-Db arasındaki senkronizasyonu sağlarsınız.
  45. 45. Uygulama secret’lerini saklama MODE_PRIVATE Password-based encryption KeyStore - /data/misc/keystore/ ref: nelenkov.blogspot.jp/2011/11/ics-credential-storage-implementation.html
  46. 46. Keystore User_0 User_1 User_2 keystore keymaster .masterkey key_1 key_2 Hardware .masterkey key_1 key_2 user_0 keystore user_1 keystore http://securityintelligence.com/android-keystore-stack-buffer-overflow-to-keep-things-simple-buffers-are-always-larger-than-needed/#.VVNJc9Oqqkr
  47. 47. Tap-jacking setFilterTouchesWhenObscured = true
  48. 48. Static over virtual method %15-%20 daha hızlı
  49. 49. Yaygın kullanılan kütüphaneler !! 65K Limit !! RxJava Retrofit - REST Client ButterKnife - Injection Picasso - Image Loading Glide - Image Loading OkHttp - Http - SPDY Client Otto - Service Bus
  50. 50. GooglePlay Services Google Analytics Cloud Messaging Google Maps Google Nearby Google Fit Android Wear Google Location Activity Recognition
  51. 51. GooglePlay Services & Gradle compile 'com.google.android.gms:play-services-fitness:7.3.0' compile 'com.google.android.gms:play-services-wearable:7.3.0' compile 'com.google.android.gms:play-services:7.3.0' yerine
  52. 52. Güç Yönetimi WakeLock WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
  53. 53. WakeLock PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
 PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
 "WakelockTag");
 wakeLock.acquire(); <uses-permission android:name="android.permission.WAKE_LOCK" />
  54. 54. Etkin Pil Kullanımı - 1 Şarj Seviyesini Kontrol Edin 4G > 3G > Wifi > 2G (Tüketim) Transfer edebildiğiniz kadar data transfer edin Data bağlantı kontrolu yapın Polling vs GCM
  55. 55. Etkin Pil Kullanımı - 2 AlarmManager.setInexactRepeating() ELAPSED_REALTIME vs ELAPSED_REALTIME_WAKEUP Caching Koyu renkler daha az enerji harcar Hassas konum bilgisi (GPS)

×