Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Girişimciler ve Geliştiriciler için
Fatih Sökmen
https://github.com/fatihsokmen/android-seminar-code
Android OS
Linux Kernel, (libc, X11 gibi kutuphane ve
runtimelar yok)
Open Handset Alliance tarafından desteklendi, proje
...
Android SDK
Telephony, Wifi Manager, P2P, Bluetooth & NFC
Map, Location
Multimedya Kontrolu
Sensor Api (Accelerometer, Com...
Development Framework
Android Api
Geliştirme Araçları (Compiler, packagers, dextools)
Virtual Device Manager ve Emulator
D...
Linux Kernel
Bionic | Binder IPC | Ashmem | Pmem |
Wakelocks | Alarms
Low Memory Killer | Paranoid Network
Security | ...
Android Runtime
Dalvik | ART
JavaVM - stack-based
Dalvik - register based
Apk
*.java
R.java
jar Classes.dex
dxjavac
res/*.*
Resources.arc
Android Manifest
app.jar
app.apk
aapt
Cihaz Dağılımı
Data collected during a 7-day period ending on 4 May, 2015
Device Api
%93 > 4.0+
Geliştirme Ortamları
Eclipse
Android Studio
Build System - Gradle
<manifest/>
Güvenlik
SandBox
Permission
Signature
Komponentler
Activity
Service
ContentProvider
Intent
BroadcastReceiver
Notification
MainTread
(Main Looper)
Activity Lifecycle
Layout
inflate
<merge/>
LinearLayout
FrameLayout
RelativeLayout
<view/>
<ViewStub/>
Fragment
Dinamik UI
Tekrar Kullanılabilirlik
Etkin Hafıza Yönetimi
Parametresiz “Constructor”
Uygulama içi
haberleşme
Fragment -> Activity
Service <-> Activity (UI)
UX ve Kullanıcı Etkileşimi
Çözünürlük (px vs dp)
xhdpi 2.0
hdpi 1.5
mdpi 1.0 (baseline)
ldpi 0.75
Yükseklik & Genişlik
wrap_content & match_parent & dp
Nine-Patch
Selector
Navigasyon
ActionBar & Toolbar
Drawer
List & Grid
Memory Management
Active Process
Visible Process
Started Service
Process
Background
Process
Background
Process
Uygulama
Önceliği
Low Memory ...
Application Lifecycle Events
public class MyApp extends Application {
@Override
public void onLowMemory() {
super.onLowMem...
Non-static sınıf tanımı ve
dezavantajları
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new SampleTask(this).execute("htt...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new SampleTask(this).execute("htt...
Uzun ömürlü objelerin
Context’e bağımlılığını
azaltmak için
«WeakReference» kullanımı
public class DownloadManager {
private static DownloadManager instance = new DownloadManager();
private ArrayDeque<Callbac...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void download(String ...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void enqueueDownload(...
public class DownloadManager {
private static DownloadManager instance = new DownloadManager();
private ArrayDeque<<WeakRe...
Background threadlerinizi
activite sonlanırken
sonlandırın, runtime bunu
sizin yerinize yapmaz.
Bunun için thread ve aktiv...
class BackgroundWorker extends Thread {
private volatile boolean keepRunning = false;
public void run() {
keepRunning = tr...
private BackgroundWorker worker;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
Büyük boyutlu bitmap
kullanımında nerelere dikkat
edilmeli ?
byte[] bitmap = ... //Load from network or resources
BitmapFactory.Options options = new BitmapFactory.Options();
options....
Bitmaplerin önbelleğe alınması
Bitmaplerin önbelleğe alınması için
‘WeakReference’ yerine LRU’u tercih
edin. Peki neden ?
Dinamik datanızı
ContentProvider’larda
depolayın
Bu, etkin hafıza kullanımı için ve
etkili bir arayüz deneyimi için
önemli...
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 uyg...
Uygulama secret’lerini
saklama
MODE_PRIVATE
Password-based encryption
KeyStore - /data/misc/keystore/
ref: nelenkov.blogsp...
Keystore
User_0
User_1
User_2
keystore
keymaster
.masterkey
key_1
key_2
Hardware
.masterkey
key_1
key_2
user_0 keystore
us...
Tap-jacking
setFilterTouchesWhenObscured = true
Static over virtual method
%15-%20 daha hızlı
Yaygın kullanılan kütüphaneler
!! 65K Limit !!
RxJava
Retrofit - REST Client
ButterKnife - Injection
Picasso - Image Loadi...
GooglePlay Services
Google Analytics
Cloud Messaging
Google Maps
Google Nearby
Google Fit
Android Wear
Google Location
Act...
GooglePlay Services & Gradle
compile 'com.google.android.gms:play-services-fitness:7.3.0'
compile 'com.google.android.gms:...
Güç Yönetimi
WakeLock
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
WakeLock
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

PowerManager.WakeLock wakeLock =
pow...
Etkin Pil Kullanımı - 1
Şarj Seviyesini Kontrol Edin
4G > 3G > Wifi > 2G (Tüketim)
Transfer edebildiğiniz kadar data trans...
Etkin Pil Kullanımı - 2
AlarmManager.setInexactRepeating()
ELAPSED_REALTIME vs ELAPSED_REALTIME_WAKEUP
Caching
Koyu renkle...
Nächste SlideShare
Wird geladen in …5
×

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

1.075 Aufrufe

Veröffentlicht am

Girişimciler ve Geliştiriciler için Android

Veröffentlicht in: Software
  • Als Erste(r) kommentieren

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)

×