Android Processes,
Threads
HÜSEYİN ÖZER
Android Processes and Threads
starts App
Service
Broadcast
Receiver
Content
Provider
Activity
Bir uygulama 4 komponente sahip oluyor.
Android Processes and Threads
App
Activity
Service
Broadcast
Receiver
Content
Provider
Durum 1 : Hiç bir komponent çalışmıyor ise;
Activity
main thread
Yeni bir Linux Process oluşturuluyor
Durum 2 : Başka komponent çalışıyor ise;
Activity
main thread
Mevcut Linux Process
Service
Android Processes and Threads
 Manifest altından hangi komponenti kullanmak istiyor isek bunu belirtmemiz gerekiyor.
 Farklı uygulamaların komponentleri aynı process altında çalıştırılabilir. Fakat;
 Aynı Linux User Id’yi paylaşmaları gerekiyor.
 Aynı sertifika ile imzalanmış olmaları gerekiyor.
 Memory’nin yetersiz kaldığı durumlarda process sonlandırılabilir.
<service android:name=".CustomService"></service>
Android hangi process’i sonlandırmalı?
Activity
main thread
Process 1
Activity Activity
main thread
Process 2
Activity
Kullanıcı ile etkileşimde değil Kullanıcı ile etkileşimde
Android sistemi kullanıcıyı da dikkate alarak process’leri (önemlilik seviyelerine göre) önceliklendiriyor.
Örneğin sms uygulamasında mesaj yazıyor
Process’lerin Öncelik Seviyeleri
 En düşük seviyeli process önce sonlandırılır.
 Foreground Process [Highest Importance]
 onResume() metodu,
 Service çalışıyor iken lifecycle metodlarına erişim,
 BroadcastReceiver’da onReceive metodunun çalıştırılması.
 Visible Process [2. Highest Importance]
 onPause() metodu (örnek bir anda "arama" gelmesi)
 Görünür activity’e bağlı bir servisin çağrılması
Process’lerin Öncelik Seviyeleri
 Service Process [3. Highest Importance]
 Burada kullanıcı doğrudan etkileşimde değil,
 Arkaplanda çalışan bir servis. (örneğin müzik uygulaması)
 Background Process [2. Lowest Importance]
 Kullanıcı ile etkileşimde değil
 Kullanıcı ile en son etkileşimde olan process en son kapatılır.
 Empty Process [Lowest Importance]
 Hiç bir komponent çalışmıyor
 Fakat uygulamaya tekrar erişmek istendiğinde hızlı erişim için cache tutuyor.
Process’lerin Öncelik Seviyeleri
Bilgilendirme;
Bir resim indirme işlemi için 2 farklı yol seçilebilir.
1. yol bir servis çalıştırarak indirmek
2. yol yeni bir thread oluşturarak indirmek
Burada yeni bir thread oluşturarak yaparsak Background Process [2. Lowest
Importance] seviyesinde işlemini gerçekleştirir. Fakat Service ile yaptırırsak Service
Process [3. Highest Importance] seviyesine çeker. Böylece service ile önem
derecesini arttırmış oluruz.
The App Sandbox
Process
Storage
App Sandbox
App User Id
Process
Storage
App Sandbox
App User Id
• Uygulamayı yüklerken her
uygulama için unique olarak
AppUserId ataması yapılıyor.
• Her uygulama paketi bir linux
process’i olarak çalışır.
• Farklı uygulama paketleri tek bir
process’in parçaları olarak çalışabilir
veya başka bir uygulama ile data
paylaşımı yapıyor ise 2 ayrı process
olarak da çalışabilir. Bu da
android:shareUserId ataması ile
yapılabilir. (Burada 2 process’inde
aynı sertifika ile imzalanması
gerekiyor.)
• 2 uygulamada birbiririn datalarına
erişebilir.
Processler Arası Veri Paylaşımı
File
Process 1 Process 2
Sandbox
Same App User Id
Multithreading
Senaryo;
Broadcast
Receiver
Activity Service
Message Queue
Content Provider
Looper
Android Thread Mekanizması
Activity
Service
Broadcast
Receiver
Content
Provider
M1 M2Main Thread
doğrucamainthread
• UI kontrollere main thread
üzerinden müdahale
edilebilir.
• Bir butona bastığımızda
mesaj doğruca main
thread’da gönderilir.
• BroadcastReceiver’dan
tetiklenen event’ler main
thread’a gönderilir.
• startService() ve servis
içindeki kodlar main
thread’da işlenir.
Uzun süren işlemler;
• Network istekleri veya database sorguları ui thread’ın belirli bi süre bekletilmesine sebeb
olur.
• UI thread beklediğinde event’ler tetiklenmez. Çizim eventleride tetiklenmediği için ekran
donar.
• Main thread’da bulunmaması gereken işlemlerden bazıları;
• Dosyalarla çalışmak
• Network işlemleri
• Kompleks hesaplamalar
• Tüm bunların yanında background thread’lerde ui üzerinde işlemler yapamaz.
Android Thread Mimarisi
Activity Service
Broadcast
Receiver
Content
Provider
M1 M2
Main Thread/
Looper
Android Process 1
External
Components
Call Activities/
Broadcast Receivers
Thread pool
T1 T2
Call content
providers/ services
Bazı thread metodları;
• Activity;
• void runOnUiThread(Runnable runnable);
• Eğer mevcut thread UI Thread ise yapılan aksiyon hemen çalıştırılır.
• Eğer mevcut thread UI Thread değil ise istenilen aksiyon UI Thread’da kuyruğa
gönderilir.
Bazı thread metodları;
• View;
• boolean post(Runnable runnable);
• Çalıştırılır kod kuyruğa eklenir ve mevcut thread ui thread olduğunda bu kod çalıştırılır.
• Sonuç olarak true döner ise kuyruğa doğru bir şekilde eklenmiş demektir. False döner
ise kuyruğa eklerken hata oluşmuş ve eklenememiş demektir.
• boolean postDelayed(Runnable runnable, long delayMilliseconds);
Bazı thread metodları;
• Process;
• void setThreadPriority(int priority);
• -20 = highest, 19 = lowest
Thread: Looper: Handler
Handler
referance
Thread Looper Handler Mimarisi
M1 M2
Main Thread
Main thread queue
looper
Handler
Handle
Message
Send
Message
Thread 1
Send
Message

Android Processes, Threads

  • 1.
  • 2.
    Android Processes andThreads starts App Service Broadcast Receiver Content Provider Activity Bir uygulama 4 komponente sahip oluyor.
  • 3.
    Android Processes andThreads App Activity Service Broadcast Receiver Content Provider Durum 1 : Hiç bir komponent çalışmıyor ise; Activity main thread Yeni bir Linux Process oluşturuluyor Durum 2 : Başka komponent çalışıyor ise; Activity main thread Mevcut Linux Process Service
  • 4.
    Android Processes andThreads  Manifest altından hangi komponenti kullanmak istiyor isek bunu belirtmemiz gerekiyor.  Farklı uygulamaların komponentleri aynı process altında çalıştırılabilir. Fakat;  Aynı Linux User Id’yi paylaşmaları gerekiyor.  Aynı sertifika ile imzalanmış olmaları gerekiyor.  Memory’nin yetersiz kaldığı durumlarda process sonlandırılabilir. <service android:name=".CustomService"></service>
  • 5.
    Android hangi process’isonlandırmalı? Activity main thread Process 1 Activity Activity main thread Process 2 Activity Kullanıcı ile etkileşimde değil Kullanıcı ile etkileşimde Android sistemi kullanıcıyı da dikkate alarak process’leri (önemlilik seviyelerine göre) önceliklendiriyor. Örneğin sms uygulamasında mesaj yazıyor
  • 6.
    Process’lerin Öncelik Seviyeleri En düşük seviyeli process önce sonlandırılır.  Foreground Process [Highest Importance]  onResume() metodu,  Service çalışıyor iken lifecycle metodlarına erişim,  BroadcastReceiver’da onReceive metodunun çalıştırılması.  Visible Process [2. Highest Importance]  onPause() metodu (örnek bir anda "arama" gelmesi)  Görünür activity’e bağlı bir servisin çağrılması
  • 7.
    Process’lerin Öncelik Seviyeleri Service Process [3. Highest Importance]  Burada kullanıcı doğrudan etkileşimde değil,  Arkaplanda çalışan bir servis. (örneğin müzik uygulaması)  Background Process [2. Lowest Importance]  Kullanıcı ile etkileşimde değil  Kullanıcı ile en son etkileşimde olan process en son kapatılır.  Empty Process [Lowest Importance]  Hiç bir komponent çalışmıyor  Fakat uygulamaya tekrar erişmek istendiğinde hızlı erişim için cache tutuyor.
  • 8.
    Process’lerin Öncelik Seviyeleri Bilgilendirme; Birresim indirme işlemi için 2 farklı yol seçilebilir. 1. yol bir servis çalıştırarak indirmek 2. yol yeni bir thread oluşturarak indirmek Burada yeni bir thread oluşturarak yaparsak Background Process [2. Lowest Importance] seviyesinde işlemini gerçekleştirir. Fakat Service ile yaptırırsak Service Process [3. Highest Importance] seviyesine çeker. Böylece service ile önem derecesini arttırmış oluruz.
  • 9.
    The App Sandbox Process Storage AppSandbox App User Id Process Storage App Sandbox App User Id • Uygulamayı yüklerken her uygulama için unique olarak AppUserId ataması yapılıyor. • Her uygulama paketi bir linux process’i olarak çalışır. • Farklı uygulama paketleri tek bir process’in parçaları olarak çalışabilir veya başka bir uygulama ile data paylaşımı yapıyor ise 2 ayrı process olarak da çalışabilir. Bu da android:shareUserId ataması ile yapılabilir. (Burada 2 process’inde aynı sertifika ile imzalanması gerekiyor.) • 2 uygulamada birbiririn datalarına erişebilir.
  • 10.
    Processler Arası VeriPaylaşımı File Process 1 Process 2 Sandbox Same App User Id
  • 11.
  • 12.
    Android Thread Mekanizması Activity Service Broadcast Receiver Content Provider M1M2Main Thread doğrucamainthread • UI kontrollere main thread üzerinden müdahale edilebilir. • Bir butona bastığımızda mesaj doğruca main thread’da gönderilir. • BroadcastReceiver’dan tetiklenen event’ler main thread’a gönderilir. • startService() ve servis içindeki kodlar main thread’da işlenir.
  • 13.
    Uzun süren işlemler; •Network istekleri veya database sorguları ui thread’ın belirli bi süre bekletilmesine sebeb olur. • UI thread beklediğinde event’ler tetiklenmez. Çizim eventleride tetiklenmediği için ekran donar. • Main thread’da bulunmaması gereken işlemlerden bazıları; • Dosyalarla çalışmak • Network işlemleri • Kompleks hesaplamalar • Tüm bunların yanında background thread’lerde ui üzerinde işlemler yapamaz.
  • 14.
    Android Thread Mimarisi ActivityService Broadcast Receiver Content Provider M1 M2 Main Thread/ Looper Android Process 1 External Components Call Activities/ Broadcast Receivers Thread pool T1 T2 Call content providers/ services
  • 15.
    Bazı thread metodları; •Activity; • void runOnUiThread(Runnable runnable); • Eğer mevcut thread UI Thread ise yapılan aksiyon hemen çalıştırılır. • Eğer mevcut thread UI Thread değil ise istenilen aksiyon UI Thread’da kuyruğa gönderilir.
  • 16.
    Bazı thread metodları; •View; • boolean post(Runnable runnable); • Çalıştırılır kod kuyruğa eklenir ve mevcut thread ui thread olduğunda bu kod çalıştırılır. • Sonuç olarak true döner ise kuyruğa doğru bir şekilde eklenmiş demektir. False döner ise kuyruğa eklerken hata oluşmuş ve eklenememiş demektir. • boolean postDelayed(Runnable runnable, long delayMilliseconds);
  • 17.
    Bazı thread metodları; •Process; • void setThreadPriority(int priority); • -20 = highest, 19 = lowest
  • 18.
  • 19.
    Handler referance Thread Looper HandlerMimarisi M1 M2 Main Thread Main thread queue looper Handler Handle Message Send Message Thread 1 Send Message