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
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
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
Development Framework
Android Api
Geliştirme Araçları (Compiler, packagers, dextools)
Virtual Device Manager ve Emulator
Dokümantasyon
Örnek Kodlar
developer.android.com
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 Killer
Application Lifecycle Events
public class MyApp extends Application {
@Override
public void onLowMemory() {
super.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
}
}
Non-static sınıf tanımı ve
dezavantajları
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);
}
}
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
}
}
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<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
}
}
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(...) {
}
});
}
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
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));
...
}
}
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
class BackgroundWorker extends Thread {
private volatile boolean keepRunning = false;
public void run() {
keepRunning = true;
while (keepRunning) {
// do background stuff
}
}
public void finish() {
keepRunning = false;
}
}
private BackgroundWorker worker;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
worker = new BackgroundWorker();
worker.start();
}
protected void onDestroy() {
super.onDestroy();
worker.finish();
}
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.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(bitmap, 0, bitmap.length,
Options options);
int h = options.outHeight;
int w = options.outWidth;
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
önemlidir.
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.
Uygulama secret’lerini
saklama
MODE_PRIVATE
Password-based encryption
KeyStore - /data/misc/keystore/
ref: nelenkov.blogspot.jp/2011/11/ics-credential-storage-implementation.html
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
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 Loading
Glide - Image Loading
OkHttp - Http - SPDY Client
Otto - Service Bus
GooglePlay Services
Google Analytics
Cloud Messaging
Google Maps
Google Nearby
Google Fit
Android Wear
Google Location
Activity Recognition
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
Güç Yönetimi
WakeLock
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
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" />
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
Etkin Pil Kullanımı - 2
AlarmManager.setInexactRepeating()
ELAPSED_REALTIME vs ELAPSED_REALTIME_WAKEUP
Caching
Koyu renkler daha az enerji harcar
Hassas konum bilgisi (GPS)

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