Süreçlere ve ileti dizilerine genel bakış

Bir uygulama bileşeni başladığında ve uygulamanın başka bileşeni olmadığında çalışırken, Android sistemi uygulama için tek bir iş parçacığı ile yeni bir Linux işlemi başlatır: birkaç adım var. Varsayılan olarak aynı uygulamanın tüm bileşenleri aynı işlem ve iş parçacığında çalışır. ana ileti dizisi olarak adlandırılır.

Bir uygulama bileşeni başlarsa ve zaten bir işlem varsa uygulamadaki başka bir bileşen zaten başlatıldığından, bu süreç içinde başlar ve aynı yürütme ileti dizisini kullanır. Bununla birlikte, zaman çizelgesine sadık kalmak için uygulamanızdaki farklı bileşenlerin ayrı işlemlerde çalışmasını sağlayabilir ve ek bileşenleri de .

Bu dokümanda, Android uygulamasındaki işlemlerin ve iş parçacıklarının nasıl çalıştığı açıklanmaktadır.

İşlemler

Varsayılan olarak, bir uygulamanın tüm bileşenleri aynı işlemde çalışır ve çoğu uygulama bunu değiştirmeyin. Ancak belirli bir işlemin hangi işlem için bunu manifest dosyasında yapabilirsiniz.

Her bileşen öğesi türüne (<activity>, <service>, <receiver> ve <provider>) ait manifest girişi, aşağıdakileri belirtebilen bir android:process özelliğini destekler: bileşenin çalıştığı işlem. Bu özelliği, her bir bileşenin çalışması için veya bazı bileşenler bir süreci paylaşırken bazılarının paylaşmamasını sağlayabilir.

Ayrıca, android:process Böylece farklı uygulamaların bileşenleri aynı işlemini gerçekleştirmeniz gerekir, ancak uygulamaların aynı Linux kullanıcı kimliğini paylaşması ve emin olun.

<application> öğesi, bir değer ayarlamak için kullanabileceğiniz bir android:process özelliğini de destekler. tüm bileşenler için geçerli olan varsayılan değere sahiptir.

Android, kaynaklar yeterli olmadığında bir noktada işlemi kapatmaya karar verebilir. kullanıcıya daha hızlı hizmet veren diğer işlemlerin gerektirdiği. Uygulama Alanı Sonuç olarak kapatılan işlemde çalışan bileşenler de imha edilir. Bir işlem başlatıldı bu bileşenler için tekrar kullanılabilir.

Android sistemi hangi işlemlerin kapatılacağına karar verirken bunların her birinin temsil eder. Örneğin, artık güncelliğini yitirmiş etkinlikler barındıran bir işlemi daha kolay ekranda görünür olması gerekir. Projenin gidişatına dair bir işlemi sonlandırdığından, işlemde çalışan bileşenlerin durumuna bağlıdır.

Sürecin yaşam döngüsünün ayrıntıları ve uygulama durumlarıyla ilişkisi şurada açıklanmıştır: Süreçler ve uygulama yaşam döngüsü.

Mesaj dizileri

Bir uygulama çalıştırıldığında, sistem uygulama için bir yürütme dizisi oluşturur. ana ileti dizisi olarak adlandırılır. Bu ileti dizisi çok önemlidir, çünkü etkinlikleri uygun kullanıcı arayüzü widget'larını kullanın. Aynı zamanda uygulamanızın bileşenlerle etkileşime girdiği iş parçacığı neredeyse her zaman Android kullanıcı arayüzü araç setindeki android.widget ve android.view paket. Bu nedenle, ana ileti dizisi bazen , UI iş parçacığı olarak adlandırılır. Ancak özel koşullarda, uygulamanın iş parçacığı, kendi kullanıcı arayüzü iş parçacığı olmayabilir. Daha fazla bilgi için bkz. İleti dizisi ek açıklamaları inceleyin.

Sistem, bir bileşenin her örneği için ayrı bir ileti dizisi oluşturmaz. Tümü aynı işlemde çalışan bileşenler, UI iş parçacığında örneklenir ve sistem, her bileşen bu iş parçacığından gönderilir. Sonuç olarak, bu riskleri azaltmak için geri aramalar (ör. onKeyDown()) kullanıcı işlemlerini raporlamak veya yaşam döngüsü geri çağırma yöntemi kullanmak. Her zaman işlemin kullanıcı arayüzü iş parçacığında çalışır.

Örneğin, kullanıcı ekrandaki bir düğmeye dokunduğunda, uygulamanızın kullanıcı arayüzü iş parçacığı, widget'a dokunma etkinliğini artırır, bu da basılmış durumunu ayarlar ve tıklayın. Kullanıcı arayüzü iş parçacığı isteği sıraya koyar ve widget'a yeniden çizim yapması için bildirim gönderir. kendisi.

Uygulamanızı düzgün bir şekilde uygulamadığınız sürece bu tek iş parçacıklı model Kullanıcı etkileşiminden dolayı uygulamanız yoğun işler yaptığında performans düşük olabilir. Kullanıcı arayüzü iş parçacığında ağ erişimi veya kullanıcı arayüzünün tamamını engeller. İleti dizisi engellendiğinde hiçbir etkinlik dağıtılamaz çizim etkinlikleri dahil.

Kullanıcı açısından, kilitleniyor gibi görünüyor. Daha da kötüsü, kullanıcı arayüzü iş parçacığı birkaç saniyeden uzun süre engellenirse kullanıcıya "uygulamanın yanıtlanıyor" (ANR) iletişim kutusu. Daha sonra kullanıcı uygulamanızdan çıkmaya, hatta yüklemeyi kaldırmaya karar verebilir. somut olarak ortaya koyar.

Android kullanıcı arayüzü araç setinin iş parçacığı için güvenli olmadığını unutmayın. Bu nedenle, bir çalışan iş parçacığındaki kullanıcı arayüzünüze bakın. Kullanıcı arayüzünüzle ilgili tüm değişiklikleri kullanıcı arayüzünden yapın ileti dizisi. Android'in tek iş parçacıklı modelinin iki kuralı vardır:

  1. UI iş parçacığını engellemeyin.
  2. Android kullanıcı arayüzü araç setine, kullanıcı arayüzü iş parçacığının dışından erişmeyin.

Çalışan ileti dizileri

Bu tek iş parçacıklı model sayesinde, markanızın yanıt verme hızı kullanıcı arayüzü iş parçacığını engellemediğinizden emin olun. Gerçekleştirilecek işlemleriniz varsa olmayan öğeleri ayrı arka planda veya worker ileti dizileri. Kullanıcı arayüzünü iş parçacığı kullanıcı arayüzünde veya ana iş parçacığında.

Android, bu kurallara uymanıza yardımcı olmak amacıyla diğer ileti dizileri. Size yardımcı olabilecek yöntemlerin listesi aşağıda verilmiştir:

Aşağıdaki örnekte View.post(Runnable) kullanılmaktadır:

Kotlin

fun onClick(v: View) {
    Thread(Runnable {
        // A potentially time consuming task.
        val bitmap = processBitMap("image.png")
        imageView.post {
            imageView.setImageBitmap(bitmap)
        }
    }).start()
}

Java

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            // A potentially time consuming task.
            final Bitmap bitmap =
                    processBitMap("image.png");
            imageView.post(new Runnable() {
                public void run() {
                    imageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}

Arka plan işlemi ayrı bir iş parçacığından yapıldığı için bu uygulama iş parçacığı açısından güvenlidir. ImageView ise her zaman UI iş parçacığından değiştirilir.

Ancak, işlemin karmaşıklığı arttıkça bu tür kodlar da karmaşıklaşabilir ve bakımını zorlaştırır. Bir çalışan iş parçacığıyla daha karmaşık etkileşimleri yönetmek için şunları yapabilirsiniz: çalışan iş parçacığınızda bir Handler kullanarak kullanıcı arayüzü ileti dizisinden teslim edilen iletileri işlemenizi sağlar. arka plan iş parçacıkları üzerinde çalışmayı planlayın ve kullanıcı arayüzü iş parçacığıyla iletişim kurun. Arka Planda Çalışmaya Genel Bakış.

İş parçacığı için güvenli yöntemler

Bazı durumlarda, uyguladığınız yöntemler birden fazla ileti dizisinden çağrılır ve bu nedenle, ileti dizisi açısından güvenli olacak şekilde yazılmalıdır.

Bu, esas olarak bağlı hizmetteki yöntemler gibi uzaktan çağrılabilen yöntemler için geçerlidir. Bir IBinder yönteminde uygulanan yöntemin kaynağı, IBinder çalışıyor. Yöntem, çağrıyı yapanın ileti dizisinde yürütülüyor. Ancak çağrı başka bir işlemden kaynaklandığında bu yöntem şu kaynaktan seçilen bir iş parçacığında yürütülür: sistemin IBinder ile aynı işlemde tuttuğu iş parçacığı havuzu. İşlemin UI iş parçacığında yürütülmez.

Örneğin, bir hizmetin onBind() yöntemi, onBind() tarafından döndürülen nesnede uygulanan yöntemler (örneğin, Uzak prosedür çağrısı (RPC) yöntemlerini uygulayan alt sınıf, iş parçacıklarından çağrılır havuzda yer alır. Bir hizmette birden fazla istemci olabileceğinden birden fazla havuz iş parçacığı etkileşim kurabilir. aynı anda aynı IBinder yöntemi kullanıldığı için IBinder yöntemlerinin iş parçacığı açısından güvenli olacak şekilde uygulanır.

Benzer şekilde, içerik sağlayıcı başka süreçlerden kaynaklanan veri isteklerini alabilir. ContentResolver ve ContentProvider süreçler arası iletişimin (IPC) nasıl yönetildiğine dair ayrıntıları gizler. ancak bu isteklere yanıt veren ContentProvider yöntemleri, query(), insert(), delete(), update(), ve getType()— kullanıcı arayüzünden değil, içerik sağlayıcının işlemindeki iş parçacığı havuzundan çağrılır. tercih edebilirsiniz. Çünkü bu yöntemler aynı zamanda iş parçacığı açısından güvenli olmaları için bunların da uygulanması gerekir.

Süreçler arası iletişim

Android, IPC için RPC'leri kullanan bir mekanizma sunar. Bu mekanizmada, bir etkinlik veya başka bir uygulama tarafından bir yöntem çağrılır. bileşenine geri döndürülür, ancak başka bir işlemde uzaktan yürütülmüştür ve herhangi bir sonuç arayan Bu işlem, bir yöntem çağrısının ve bu çağrıya ait verilerin, işletim sisteminin anlayarak, yerel süreçten iletip uzaktaki işleme aktarıp ve burada görüşmeyi yeniden oluşturup yeniden canlandırabilirsiniz.

Döndürülen değerler: ters yönde iletilir. Android, bu IPC'yi gerçekleştirmek için gereken tüm kodu sağlar işlemlerinizden faydalanabilirsiniz. Böylece, RPC programlama arayüzünü tanımlamaya ve uygulamaya odaklanabilirsiniz.

IPC gerçekleştirmek için uygulamanızın bindService() kullanarak bir hizmete bağlanması gerekir. Daha fazla bilgi için Hizmetlere genel bakış başlıklı makaleyi inceleyin.