Etkinlik yaşam döngüsü

Kullanıcı uygulamanızda gezinirken, uygulamanızdan çıkar ve geri dönerken, uygulamanızdaki Activity örneklerinin yaşam döngüleri içinde farklı durumlardan geçmesi gerekir. Activity sınıfı, bir durum değiştiğinde etkinliğe dair bilgi veren, sistemin bir etkinlik oluşturduğunu, durdurduğunu veya devam ettirdiğini ya da etkinliğin bulunduğu işlemi yok ettiğini bildiren bir dizi geri çağırma işlevi sağlar.

Yaşam döngüsü geri çağırma yöntemlerinde, kullanıcı ayrılıp etkinliğe yeniden girdiğinde etkinliğinizin nasıl davranacağını tanımlayabilirsiniz. Örneğin, akışlı bir video oynatıcı oluşturuyorsanız kullanıcı başka bir uygulamaya geçtiğinde videoyu duraklatabilir ve ağ bağlantısını sonlandırabilirsiniz. Kullanıcı geri döndüğünde, ağa yeniden bağlanabilir ve kullanıcının videoyu aynı noktadan devam ettirmesine izin verebilirsiniz.

Her geri çağırma, belirli bir durum değişikliğine uygun belirli bir işlem yapmanızı sağlar. Doğru işi doğru zamanda yapmak ve geçişleri düzgün bir şekilde yönetmek uygulamanızı daha sağlam ve performanslı hale getirir. Örneğin, yaşam döngüsü geri çağırmalarının iyi uygulanması, uygulamanızın aşağıdakilerden kaçınmasına yardımcı olabilir:

  • Kullanıcı, telefon araması alırsa veya uygulamanızı kullanırken başka bir uygulamaya geçerse kilitlenme.
  • Kullanıcının aktif olarak kullanmadığı zamanlarda değerli sistem kaynaklarını tüketme.
  • Uygulamanızdan ayrılıp daha sonra uygulamaya geri dönen kullanıcıların ilerleme durumunu kaybetmek.
  • Ekran yatay ve dikey yön arasında döndüğünde kullanıcının ilerleme durumunun kilitlenmesi veya kaybedilmesi.

Bu belgede, etkinlik yaşam döngüsü ayrıntılı olarak açıklanmaktadır. Belge, yaşam döngüsü paradigmasının açıklanmasıyla başlıyor. Ardından her bir geri çağırma açıklanır: Bu işlemler yürütüldüğünde dahili olarak neler olduğu ve bu işlemler sırasında ne uygulamanız gerektiği.

Ardından, etkinlik durumu ile bir sürecin sistem tarafından öldürülmeye karşı kırılganlığı arasındaki ilişkiyi kısaca tanıtır. Son olarak, etkinlik durumları arasındaki geçişlerle ilgili çeşitli konular ele alınmaktadır.

En iyi uygulamalar hakkında rehberlik de dahil olmak üzere yaşam döngülerini yönetme hakkında bilgi için Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini Yönetme ve Kullanıcı arayüzü durumlarını kaydetme bölümlerine bakın. Etkinlikleri, mimari bileşenleriyle birlikte kullanarak sağlam, üretim kalitesinde bir uygulama tasarlamayı öğrenmek için Uygulama mimarisi rehberini inceleyin.

Etkinlik yaşam döngüsü kavramları

Activity sınıfı, etkinlik yaşam döngüsünün aşamaları arasındaki geçişlerde gezinmek için altı geri arama içeren temel bir grup sağlar: onCreate(), onStart(), onResume(), onPause(), onStop() ve onDestroy(). Etkinlik yeni bir duruma geçtiğinde sistem bu geri çağırmaların her birini çağırır.

Şekil 1, bu paradigmanın görsel bir temsilini göstermektedir.

Şekil 1. Etkinlik yaşam döngüsünün basitleştirilmiş bir gösterimi.

Kullanıcı etkinlikten ayrılmaya başladığında, sistem etkinliği ayırmak için yöntemler çağırır. Bazı durumlarda, etkinlik yalnızca kısmen kaldırılır ve kullanıcının başka bir uygulamaya geçmesi gibi durumlarda hâlâ bellekte kalır. Bu durumlarda, etkinlik yine de ön plana geri dönebilir.

Kullanıcı etkinliğe geri dönerse etkinlik kullanıcının kaldığı yerden devam eder. Birkaç istisna dışında, uygulamaların arka planda çalışırken etkinlik başlatması kısıtlanmıştır.

Sistemin belirli bir süreci ve bu süreçteki etkinlikleri sonlandırma olasılığı, o andaki aktiviteye bağlıdır. Durum ile çıkarma güvenlik açığı arasındaki ilişki hakkında daha fazla bilgi edinmek için etkinlik durumu ve bellekten çıkarma hakkındaki bölüme bakın.

Etkinliğinizin karmaşıklığına bağlı olarak muhtemelen tüm yaşam yaşam döngüsü yöntemlerini uygulamanız gerekmez. Ancak her birini anlamanız ve uygulamanızı kullanıcıların beklediği şekilde davranmasını sağlayan kriterleri uygulamanız önemlidir.

Yaşam döngüsü geri aramaları

Bu bölümde, etkinlik yaşam döngüsü boyunca kullanılan geri çağırma yöntemleri hakkında kavramsal ve uygulama bilgileri sağlanmaktadır.

Bazı işlemler etkinlik yaşam döngüsü yöntemlerine aittir. Bununla birlikte, etkinlik yaşam döngüsü yöntemi yerine, bileşene bağımlı bir bileşenin işlemlerini uygulayan kodu yerleştirin. Bunu başarmak için bağımlı bileşeni yaşam döngüsüne duyarlı hale getirmeniz gerekir. Bağımlı bileşenlerinizin yaşam döngüsüne duyarlı olmasını nasıl sağlayabileceğinizi öğrenmek için Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini İşleme bölümüne bakın.

onCreate()

Sistem etkinliği ilk kez oluşturduğunda tetiklenen bu geri çağırmayı uygulamanız gerekir. Etkinlik oluşturulduğunda, etkinlik Oluşturuldu durumuna geçer. onCreate() yönteminde, etkinlik süresince yalnızca bir kez gerçekleşen temel uygulama başlatma mantığını gerçekleştirin.

Örneğin, onCreate() uygulamanız, verileri listelere bağlayabilir, etkinliği bir ViewModel ile ilişkilendirebilir ve bazı sınıf kapsamı değişkenlerini örneklendirebilir. Bu yöntem, etkinliğin önceden kaydedilmiş durumunu içeren bir Bundle nesnesi olan savedInstanceState parametresini alır. Etkinlik daha önce hiç var olmadıysa Bundle nesnesinin değeri null olur.

Etkinliğinizin yaşam döngüsüne bağlı, yaşam döngüsünü algılayan bir bileşeniniz varsa ON_CREATE etkinliğini alır. @OnLifecycleEvent ek açıklaması eklenen yöntem, yaşam döngüsüne duyarlı bileşeninizin, oluşturulan durum için ihtiyaç duyduğu tüm kurulum kodunu gerçekleştirebilmesi için çağrılır.

Aşağıdaki onCreate() yöntemi örneğinde, kullanıcı arayüzünün tanıtılması (XML düzen dosyasında tanımlanır), üye değişkenlerinin tanımlanması ve kullanıcı arayüzünün bir kısmını yapılandırma gibi temel etkinlik kurulumu gösterilmektedir. Bu örnekte XML düzen dosyası, dosyanın kaynak kimliğini (R.layout.main_activity) setContentView() hedefine iletir.

Kotlin

lateinit var textView: TextView

// Some transient state for the activity instance.
var gameState: String? = null

override fun onCreate(savedInstanceState: Bundle?) {
    // Call the superclass onCreate to complete the creation of
    // the activity, like the view hierarchy.
    super.onCreate(savedInstanceState)

    // Recover the instance state.
    gameState = savedInstanceState?.getString(GAME_STATE_KEY)

    // Set the user interface layout for this activity.
    // The layout is defined in the project res/layout/main_activity.xml file.
    setContentView(R.layout.main_activity)

    // Initialize member TextView so it is available later.
    textView = findViewById(R.id.text_view)
}

// This callback is called only when there is a saved instance previously saved using
// onSaveInstanceState(). Some state is restored in onCreate(). Other state can optionally
// be restored here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    textView.text = savedInstanceState?.getString(TEXT_VIEW_KEY)
}

// Invoked when the activity might be temporarily destroyed; save the instance state here.
override fun onSaveInstanceState(outState: Bundle?) {
    outState?.run {
        putString(GAME_STATE_KEY, gameState)
        putString(TEXT_VIEW_KEY, textView.text.toString())
    }
    // Call superclass to save any view hierarchy.
    super.onSaveInstanceState(outState)
}

Java

TextView textView;

// Some transient state for the activity instance.
String gameState;

@Override
public void onCreate(Bundle savedInstanceState) {
    // Call the superclass onCreate to complete the creation of
    // the activity, like the view hierarchy.
    super.onCreate(savedInstanceState);

    // Recover the instance state.
    if (savedInstanceState != null) {
        gameState = savedInstanceState.getString(GAME_STATE_KEY);
    }

    // Set the user interface layout for this activity.
    // The layout is defined in the project res/layout/main_activity.xml file.
    setContentView(R.layout.main_activity);

    // Initialize member TextView so it is available later.
    textView = (TextView) findViewById(R.id.text_view);
}

// This callback is called only when there is a saved instance previously saved using
// onSaveInstanceState(). Some state is restored in onCreate(). Other state can optionally
// be restored here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    textView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}

// Invoked when the activity might be temporarily destroyed; save the instance state here.
@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString(GAME_STATE_KEY, gameState);
    outState.putString(TEXT_VIEW_KEY, textView.getText());

    // Call superclass to save any view hierarchy.
    super.onSaveInstanceState(outState);
}

XML dosyasını tanımlamaya ve setContentView() öğesine iletmeye alternatif olarak, etkinlik kodunuzda yeni View nesneleri oluşturabilir ve ViewGroup içine yeni View nesneleri ekleyerek bir görünüm hiyerarşisi oluşturabilirsiniz. Daha sonra bu düzeni, kök ViewGroup öğesini setContentView() öğesine geçirerek kullanırsınız. Kullanıcı arayüzü oluşturma hakkında daha fazla bilgi için kullanıcı arayüzü belgelerine bakın.

Etkinliğiniz Oluşturuldu durumunda kalmaz. onCreate() yönteminin yürütülmesi bittikten sonra, etkinlik Başlatıldı durumuna girer ve sistem hızlı bir şekilde onStart() ve onResume() yöntemlerini çağırır.

onStart()

Etkinlik, Başlatıldı durumuna geçtiğinde sistem onStart() komutunu çağırır. Bu çağrı, uygulama ön plana girip etkileşimli hale gelmek üzere etkinliğe hazırlanırken etkinliğin kullanıcı tarafından görülebilmesini sağlar. Örneğin, bu yöntemde, kullanıcı arayüzünü koruyan kod başlatılır.

Etkinlik Başlatıldı durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsüne duyarlı tüm bileşenler ON_START etkinliğini alır.

onStart() yöntemi hızlı bir şekilde tamamlanır ve Oluşturuldu durumunda olduğu gibi etkinlik Başlatıldı durumunda kalmaz. Bu geri çağırma bittikten sonra, etkinlik Devam ettirildi durumuna geçer ve sistem onResume() yöntemini çağırır.

onContinue()

Etkinlik Devam ettirildi durumuna girdiğinde ön plana gelir ve sistem onResume() geri çağırmasını çağırır. Bu, uygulamanın kullanıcıyla etkileşim durumudur. Cihaz, telefon araması alma, kullanıcının başka bir etkinliğe gitmesi veya cihaz ekranının kapanması gibi başka bir nedenle uygulamadan ayrılana kadar uygulama bu durumda kalır.

Etkinlik Devam ettirildi durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsüne duyarlı tüm bileşenler ON_RESUME etkinliğini alır. Burada yaşam döngüsü bileşenleri, bileşen görünür durumdayken ve ön plandayken (ör. kamera önizlemesi başlatma) çalışması gereken tüm işlevleri etkinleştirebilir.

Kesici bir etkinlik gerçekleştiğinde, etkinlik Duraklatıldı durumuna geçer ve sistem onPause() geri çağırmasını çağırır.

Etkinlik Duraklatılmış durumdan Devam ettirildi durumuna dönerse sistem bir kez daha onResume() yöntemini çağırır. Bu nedenle, onPause() sırasında yayınladığınız bileşenleri başlatmak ve etkinlik Devam ettirildi durumuna her girdiğinde yapılması gereken diğer başlatma işlemlerini gerçekleştirmek için onResume() uygulayın.

Bileşen ON_RESUME etkinliğini aldığında kameraya erişen yaşam döngüsüne duyarlı bir bileşen örneğini burada görebilirsiniz:

Kotlin

class CameraComponent : LifecycleObserver {
    ...
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun initializeCamera() {
        if (camera == null) {
            getCamera()
        }
    }
    ...
}

Java

public class CameraComponent implements LifecycleObserver {

    ...

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void initializeCamera() {
        if (camera == null) {
            getCamera();
        }
    }
    ...
}

Önceki kod, LifecycleObserver ON_RESUME etkinliğini aldıktan sonra kamerayı başlatır. Ancak, çoklu pencere modunda etkinliğiniz Duraklatıldı durumunda olsa bile tamamen görülebilir. Örneğin, uygulama çoklu pencere modunda olduğunda ve kullanıcı etkinliğinizi içermeyen pencereye dokunduğunda etkinliğiniz Duraklatıldı durumuna geçer.

Kameranın yalnızca uygulama Devam ettirildiğinde (görünür ve ön planda etkin) etkin olmasını istiyorsanız önceden gösterilen ON_RESUME etkinliğinden sonra kamerayı başlatın. Etkinlik Duraklatılmış ancak görünür durumdayken (ör. çoklu pencere modu) kameranın etkin kalmasını istiyorsanız ON_START etkinliğinden sonra kamerayı başlatın.

Ancak, etkinliğiniz Duraklatılmış durumdayken kameranın etkin olması, birden fazla pencere modundaki başka bir devam ettirilen uygulamaya kameraya erişilmesini engelleyebilir. Bazen etkinliğiniz Duraklatılmış durumdayken kamerayı etkin tutmak gerekir, ancak bu durumda genel kullanıcı tecrübesi kötüleşebilir.

Bu nedenle, çoklu pencere modu bağlamında paylaşılan sistem kaynaklarını kontrol etmenin en uygun yaşam döngüsünde nerede olduğunu dikkatlice düşünün. Çoklu pencere modunu destekleme hakkında daha fazla bilgi edinmek için Çoklu pencere desteği sayfasını inceleyin.

Bir başlatma işlemini hangi derleme etkinliğinde gerçekleştirmeyi seçtiğinize bakılmaksızın kaynağı serbest bırakmak için ilgili yaşam döngüsü etkinliğini kullandığınızdan emin olun. Bir öğeyi ON_START etkinliğinden sonra başlatırsanız ON_STOP etkinliğinden sonra yayınlayın veya sonlandırın. Etkinliği ON_RESUME etkinliğinden sonra başlatırsanız ON_PAUSE etkinliğinden sonra yayınlayın.

Önceki kod snippet'i, kamera başlatma kodunu yaşam döngüsüne duyarlı bir bileşene yerleştirir. Bunun yerine, bu kodu onStart() ve onStop() gibi doğrudan etkinlik yaşam döngüsü geri çağırmalarına yerleştirebilirsiniz. Ancak bunu yapmanız önerilmez. Bu mantığı bağımsız ve yaşam döngüsüne duyarlı bir bileşene eklemek, kodu yinelemek zorunda kalmadan bileşeni birden çok etkinlikte yeniden kullanabilmenizi sağlar. Yaşam döngüsüne duyarlı bileşen oluşturmayı öğrenmek için Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini Yönetme bölümüne bakın.

onPause()

Sistem bu yöntemi kullanıcının etkinliğinizden ayrıldığının ilk göstergesi olarak adlandırır; ancak bu, her zaman etkinliğin silindiği anlamına gelmez. Bu, etkinliğin artık ön planda olmadığını ancak kullanıcı çoklu pencere modundaysa hâlâ görünür olduğunu belirtir. Bir etkinliğin bu duruma girmesinin birkaç nedeni vardır:

  • onContinue() geri çağırmasıyla ilgili bölümde açıklandığı gibi, uygulama yürütmeyi kesintiye uğratan bir etkinlik, geçerli etkinliği duraklatır. Bu en yaygın durumdur.
  • Çoklu pencere modunda, aynı anda yalnızca bir uygulamaya odaklanılır ve sistem diğer tüm uygulamaları duraklatır.
  • İletişim kutusu gibi yeni, yarı şeffaf bir etkinlik açıldığında, kapsanan etkinlik duraklatılır. Etkinlik, kısmen görünür olduğu ancak odakta olmadığı sürece duraklatılmış olarak kalır.

Bir etkinlik Duraklatıldı durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsüne duyarlı tüm bileşenler ON_PAUSE etkinliğini alır. Yaşam döngüsü bileşenleri bu noktada, bileşen ön planda değilken çalışması gerekmeyen işlevleri (ör. kamera önizlemesini durdurma) durdurabilir.

Activity Duraklatılmış durumdayken ve kısa süre içinde devam ettirmeyi beklediğiniz işlemleri devam edemeyecek veya moderasyonda devam edebilecek işlemleri duraklatmak ya da ayarlamak için onPause() yöntemini kullanın.

Sistem kaynaklarını, sensörleri (GPS gibi) ya da etkinliğiniz Duraklatılmış durumdayken kullanıcının buna ihtiyaç duymadığı zamanlarda pil ömrünü etkileyen kaynakları serbest bırakmak için onPause() yöntemini de kullanabilirsiniz.

Ancak onResume() ile ilgili bölümde belirtildiği gibi, uygulama birden fazla pencere modundaysa Duraklatılmış etkinlik yine de tamamen görünebilir. Çoklu pencere modunu daha iyi desteklemek amacıyla, kullanıcı arayüzüyle ilgili kaynakları ve işlemleri tam olarak serbest bırakmak veya düzenlemek için onPause() yerine onStop() kullanmayı düşünün.

Aşağıdaki ON_PAUSE etkinliğine tepki veren LifecycleObserver örneği, bir önceki ON_RESUME etkinliği örneğinin karşılığıdır. Bu örnekte, ON_RESUME etkinliği alındıktan sonra başlatılan kamera serbest bırakılır:

Kotlin

class CameraComponent : LifecycleObserver {
    ...
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun releaseCamera() {
        camera?.release()
        camera = null
    }
    ...
}

Java

public class JavaCameraComponent implements LifecycleObserver {
    ...
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void releaseCamera() {
        if (camera != null) {
            camera.release();
            camera = null;
        }
    }
    ...
}

Bu örnekte, kamera sürüm kodu, ON_PAUSE etkinliği LifecycleObserver tarafından alındıktan sonra yerleştirilmektedir.

onPause() yürütme işlemi çok kısadır ve kaydetme işlemlerinin gerçekleştirilmesi için yeterli zaman sunmaz. Bu nedenle, uygulama veya kullanıcı verilerini kaydetmek, ağ çağrıları yapmak ya da veritabanı işlemlerini yürütmek için onPause() uygulamasını kullanmayın. Bu tür çalışmalar, yöntem tamamlanmadan tamamlanmayabilir.

Bunun yerine, onStop() sırasında ağır yük kapatma işlemleri gerçekleştirin. onStop() sırasında gerçekleştirilebilecek uygun işlemler hakkında daha fazla bilgi için sonraki bölüme bakın. Veri kaydetme hakkında daha fazla bilgi için durumu kaydetme ve geri yükleme hakkındaki bölüme bakın.

onPause() yönteminin tamamlanması, etkinliğin Duraklatıldı durumundan ayrıldığı anlamına gelmez. Bunun yerine, etkinlik devam edene veya kullanıcı tarafından tamamen görünmez hale gelene kadar bu durumda kalır. Etkinlik devam ederse sistem bir kez daha onResume() geri çağırmasını çağırır.

Etkinlik Duraklatılmış durumdan Devam ettirildi durumuna dönerse sistem, onResume() yöntemini çağırdığında bu örneği geri çağırarak Activity örneğini bellekte sabit tutar. Bu senaryoda, geri arama yöntemlerinden herhangi biri sırasında oluşturulan ve Devam ettirildi durumuna yol açan bileşenleri yeniden başlatmanız gerekmez. Etkinlik tamamen görünmez hale gelirse sistem onStop() çağırır.

onStop()

Etkinliğiniz kullanıcı tarafından artık görülemediğinde Durduruldu durumuna geçer ve sistem onStop() geri çağırmasını çağırır. Bu durum, yeni başlatılan bir etkinlik ekranın tamamını kapladığında ortaya çıkabilir. Sistem, etkinliğin çalışması bittiğinde ve sonlandırılmak üzereyken de onStop() öğesini çağırır.

Etkinlik Durduruldu durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsüne duyarlı tüm bileşenler ON_STOP etkinliğini alır. Burada yaşam döngüsü bileşenleri, bileşen ekranda görünür değilken çalışması gerekmeyen işlevleri durdurabilir.

onStop() yönteminde, uygulama kullanıcı tarafından görülemiyorken gerekli olmayan kaynakları serbest bırakın veya ayarlayın. Örneğin, uygulamanız animasyonları duraklatabilir veya ayrıntılı konum güncellemelerinden genel konum güncellemelerine geçiş yapabilir. onPause() yerine onStop() kullanıldığında, kullanıcı, etkinliğinizi birden fazla pencere modunda görüntülese bile kullanıcı arayüzüyle ilgili çalışmalar devam eder.

Nispeten yoğun CPU kullanan kapatma işlemleri yapmak için de onStop() kullanın. Örneğin, bilgileri bir veritabanına kaydetmek için daha uygun bir zaman bulamıyorsanız bunu onStop() sırasında yapabilirsiniz. Aşağıdaki örnekte, bir taslak notun içeriğini kalıcı depolama alanına kaydeden bir onStop() uygulaması gösterilmektedir:

Kotlin

override fun onStop() {
    // Call the superclass method first.
    super.onStop()

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    val values = ContentValues().apply {
        put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText())
        put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle())
    }

    // Do this update in background on an AsyncQueryHandler or equivalent.
    asyncQueryHandler.startUpdate(
            token,     // int token to correlate calls
            null,      // cookie, not used here
            uri,       // The URI for the note to update.
            values,    // The map of column names and new values to apply to them.
            null,      // No SELECT criteria are used.
            null       // No WHERE columns are used.
    )
}

Java

@Override
protected void onStop() {
    // Call the superclass method first.
    super.onStop();

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    // Do this update in background on an AsyncQueryHandler or equivalent.
    asyncQueryHandler.startUpdate (
            mToken,  // int token to correlate calls
            null,    // cookie, not used here
            uri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
    );
}

Önceki kod örneği doğrudan SQLite kullanır. Ancak SQLite üzerinde soyutlama katmanı sağlayan bir kalıcılık kitaplığı olan Room'u kullanmanızı öneririz. Room kullanmanın avantajları ve uygulamanızda Odayı nasıl uygulayacağınız hakkında daha fazla bilgi edinmek için Oda Kalıcılığı Kitaplığı kılavuzuna bakın.

Etkinliğiniz Durduruldu durumuna geçtiğinde Activity nesnesi bellekte yerleşik olarak tutulur: Tüm durum ve üye bilgilerini saklar ancak pencere yöneticisine eklenmez. Etkinlik devam ettiğinde bu bilgileri hatırlar.

Devam ettirildi durumuna neden olan geri çağırma yöntemlerinin herhangi birinde oluşturulan bileşenleri yeniden başlatmanız gerekmez. Sistem, düzendeki her View nesnesinin geçerli durumunu da izler. Böylece kullanıcı, EditText widget'ına metin girerse söz konusu içerik saklandığı için kaydedip geri yüklemenize gerek kalmaz.

Not: Etkinliğiniz durdurulduğunda, sistemin belleği kurtarması gerekirse sistem, etkinliği içeren işlemi yok edebilir. Sistem, etkinlik durdurulduğunda işlemi yok etse bile, sistem View nesnelerinin durumunu (ör. EditText widget'larındaki metinler) bir Bundle (anahtar/değer çiftleri blob'u) içinde korur ve kullanıcı etkinliğe geri dönerse bunları geri yükler. Kullanıcının geri döndürdüğü bir etkinliği geri yükleme hakkında daha fazla bilgi için durumu kaydetme ve geri yükleme bölümüne bakın.

Durduruldu durumundan sonra etkinlik, kullanıcıyla etkileşimde bulunmak için geri gelir veya etkinlik bitmiş olup kaybolur. Etkinlik geri gelirse sistem onRestart() yöntemini çağırır. Activity çalışmayı bitirmişse sistem, onDestroy() numaralı telefonu çağırır.

onDestroy()

Etkinlik kaldırılmadan önce onDestroy() çağrılır. Sistem, bu geri çağırmayı aşağıdaki iki nedenden biri nedeniyle çağırır:

  1. Kullanıcı etkinliği tamamen kapattığı veya etkinlikte finish() çağrıldığı için etkinlik tamamlanıyor.
  2. Cihaz döndürme veya çoklu pencere moduna geçme gibi bir yapılandırma değişikliği nedeniyle sistem, etkinliği geçici olarak siliyor.

Etkinlik kaldırıldı durumuna geçtiğinde, etkinliğin yaşam döngüsüne bağlı yaşam döngüsüne duyarlı tüm bileşenler ON_DESTROY etkinliğini alır. Yaşam döngüsü bileşenleri, Activity yok edilmeden önce ihtiyaç duydukları her şeyi buradan temizleyebilir.

Neden yok edildiğini belirlemek üzere Activity öğenize mantığı yerleştirmek yerine, Activity öğenize ilişkin ilgili görünüm verilerini içerecek bir ViewModel nesne kullanın. Activity bir yapılandırma değişikliği nedeniyle yeniden oluşturulursa ViewModel korunduğu ve sonraki Activity örneğine verildiği için herhangi bir işlem yapması gerekmez.

Activity yeniden oluşturulmamışsa ViewModel, onCleared() yöntemini çağırır. Bu yöntemde, gerekli tüm verileri yok edilmeden önce temizleyebilirsiniz. isFinishing() yöntemini kullanarak bu iki senaryoyu birbirinden ayırt edebilirsiniz.

Etkinlik bitiyorsa onDestroy(), etkinliğin aldığı son yaşam döngüsü geri çağırmasıdır. Yapılandırma değişikliği sonucunda onDestroy() çağrılırsa sistem hemen yeni bir etkinlik örneği oluşturur ve ardından yeni yapılandırmadaki bu yeni örnek için onCreate() çağırır.

onDestroy() geri çağırması, onStop() gibi önceki geri çağırmaların serbest bırakmadığı tüm kaynakları serbest bırakır.

Etkinlik durumu ve bellekten çıkarma

Sistem, RAM'i boşaltması gerektiğinde işlemleri sonlandırır. Sistemin belirli bir süreci sonlandırma olasılığı, sürecin o andaki durumuna bağlıdır. İşlem durumu, işlemde yürütülen etkinliğin durumuna bağlıdır. Tablo 1'de süreç durumu, etkinlik durumu ve sistemin süreci sonlandırma olasılığı arasındaki korelasyonlar gösterilmektedir. Bu tablo, yalnızca bir işlem diğer uygulama bileşeni türlerini çalıştırmıyorsa geçerlidir.

Öldürülme olasılığı İşlem durumu Son etkinlik durumu
En düşük Ön plan (odaklanmak üzere veya odaklanmak üzere) Devam ettirildi
Düşük Görünür (odak yok) Başlatıldı/Duraklatıldı
Daha yüksek Arka plan (görünmez) Durduruldu
En yüksek Boş Kaldırıldı

Tablo 1. İşlem yaşam döngüsü ile etkinlik durumu arasındaki ilişki.

Sistem, bellekte yer açmak için hiçbir zaman etkinlikleri doğrudan sonlandırmaz. Bunun yerine, etkinliğin yürütüldüğü süreci sonlandırarak yalnızca etkinliği değil, süreçteki diğer her şeyi de yok eder. Sistem tarafından başlatılan işlem ölümü gerçekleştiğinde etkinliğinizin kullanıcı arayüzü durumunu nasıl koruyacağınızı ve geri yükleyeceğinizi öğrenmek için durumu kaydetme ve geri yükleme ile ilgili bölüme bakın.

Kullanıcı, Ayarlar'ın altında Uygulama Yöneticisi'ni kullanarak ilgili uygulamayı kaldırarak da bir işlemi sonlandırabilir.

İşlemler hakkında daha fazla bilgi için Süreçlere ve iş parçacıklarına genel bakış bölümüne bakın.

Geçici kullanıcı arayüzü durumunu kaydetme ve geri yükleme

Kullanıcı, bir etkinliğin kullanıcı arayüzü durumunun, döndürme veya çoklu pencere moduna geçme gibi yapılandırma değişiklikleri boyunca aynı kalmasını bekler. Bununla birlikte, böyle bir yapılandırma değişikliği gerçekleştiğinde sistem varsayılan olarak etkinliği yok ederek etkinlik örneğinde depolanan kullanıcı arayüzü durumları silinir.

Benzer şekilde, bir kullanıcı geçici olarak uygulamanızdan farklı bir uygulamaya geçip daha sonra uygulamanıza geri döndüğünde kullanıcı arayüzü durumunun aynı kalmasını bekler. Ancak sistem, kullanıcı dışarıdayken ve etkinliğiniz durdurulduğunda uygulama işleminizi imha edebilir.

Sistem kısıtlamaları etkinliği yok ettiğinde, ViewModel, onSaveInstanceState() ve/veya yerel depolama alanını birlikte kullanarak kullanıcının geçici kullanıcı arayüzü durumunu koruyun. Sistem davranışına kıyasla kullanıcı beklentileri ve karmaşık kullanıcı arayüzü durumu verilerinin sistem tarafından başlatılan etkinlik ve işlem ölümü genelinde en iyi şekilde nasıl korunacağı hakkında daha fazla bilgi edinmek için Kullanıcı arayüzü durumlarını kaydetme bölümüne bakın.

Bu bölümde, örnek durumunun ne olduğu ve etkinliğin kendisine yapılan bir geri çağırma olan onSaveInstance() yönteminin nasıl uygulanacağı açıklanmaktadır. Kullanıcı arayüzü verileriniz hafifse hem yapılandırma değişikliklerinde hem de sistem tarafından başlatılan işlem ölümünde kullanıcı arayüzü durumunu korumak için yalnızca onSaveInstance() kullanabilirsiniz. Ancak onSaveInstance() için serileştirme/serileştirme maliyeti söz konusu olduğu için çoğu durumda Kullanıcı arayüzü durumlarını kaydetme bölümünde açıklandığı gibi hem ViewModel hem de onSaveInstance() kullanılır.

Not: Yapılandırma değişiklikleri, gerekirse etkinlik yeniden oluşturma özelliğinin nasıl kısıtlanacağı, View system ve Jetpack Compose'dan bu yapılandırma değişikliklerine nasıl tepki verileceği hakkında daha fazla bilgi edinmek için Yapılandırma değişikliklerini işleme sayfasına göz atın.

Örnek durumu

Etkinliğinizin normal uygulama davranışı nedeniyle kaldırıldığı birkaç senaryo vardır. Örneğin, kullanıcının Geri düğmesine basması veya etkinlik sinyallerinizin finish() yöntemini çağırarak kendi kendini yok ettiğini gösteren örnekler vardır.

Kullanıcı Geri düğmesine bastığı veya etkinlik kendi kendine bittiği için etkinliğiniz kaldırıldığında, hem sistemin hem de kullanıcının söz konusu Activity örneği kalıcı olarak kaldırılır. Bu senaryolarda, kullanıcının beklentisi sistemin davranışıyla eşleşir ve sizin yapmanız gereken ek bir işlem yoktur.

Bununla birlikte, sistem, sistem kısıtlamaları (yapılandırma değişikliği veya bellek baskısı gibi) nedeniyle etkinliği yok ederse gerçek Activity örneği ortadan kalkmış olsa bile sistem, etkinliğin mevcut olduğunu hatırlar. Kullanıcı etkinliğe geri dönmeye çalışırsa sistem, etkinliğin kaldırıldığı andaki durumunu açıklayan bir kayıtlı veri kümesini kullanarak bu etkinliğin yeni bir örneğini oluşturur.

Sistemin önceki durumu geri yüklemek için kullandığı kayıtlı verilere örnek durumu adı verilir. Bir Bundle nesnesinde depolanan anahtar/değer çiftleri koleksiyonudur. Varsayılan olarak sistem, etkinlik düzeninizdeki her View nesnesi hakkında bir EditText widget'ına girilen metin değeri gibi bilgileri kaydetmek için Bundle örnek durumunu kullanır.

Dolayısıyla, etkinlik örneğiniz kaldırılır ve yeniden oluşturulursa düzenin durumu, sizin koda ihtiyaç duymadan önceki durumuna geri yüklenir. Ancak etkinliğinizde, kullanıcının etkinlikteki ilerlemesini izleyen üye değişkenleri gibi geri yüklemek istediğiniz daha çok durum bilgisi olabilir.

Not: Android sisteminin etkinliğinizdeki görünümlerin durumunu geri yükleyebilmesi için her görünümün android:id özelliği ile sağlanan benzersiz bir kimliğinin olması gerekir.

Bundle nesnesi, ana iş parçacığında serileştirme gerektirdiği ve sistem işlem belleğini tükettiği için çok az miktarda verinin korunması için uygun değildir. Çok az miktarda veriden fazlasını korumak istiyorsanız kalıcı yerel depolama alanı, onSaveInstanceState() yöntemi ve ViewModel sınıfını kullanarak verileri korumak için Kullanıcı arayüzü durumlarını kaydetme konusunda birleşik bir yaklaşım benimseyin.

onSaveInstanceState() işlevini kullanarak basit ve basit kullanıcı arayüzü durumlarını kaydedin

Etkinliğiniz durmaya başladığında, sistem onSaveInstanceState() yöntemini çağırır. Böylece etkinliğiniz, durum bilgilerini bir örnek durum paketine kaydedebilir. Bu yöntemin varsayılan uygulaması, bir EditText widget'ındaki metin veya bir ListView widget'ının kaydırma konumu gibi etkinliğin görünüm hiyerarşisinin durumuyla ilgili geçici bilgileri kaydeder.

Etkinliğinizle ilgili ek örnek durumu bilgilerini kaydetmek için onSaveInstanceState() özelliğini geçersiz kılın ve etkinliğinizin beklenmedik bir şekilde kaldırılması durumunda kaydedilen Bundle nesnesine anahtar/değer çiftleri ekleyin. onSaveInstanceState() ayarını geçersiz kıldığınızda, varsayılan uygulamanın görünüm hiyerarşisinin durumunu kaydetmesini istiyorsanız üst sınıf uygulamasını çağırmanız gerekir. Bu, aşağıdaki örnekte gösterilmiştir:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    // Save the user's current game state.
    outState?.run {
        putInt(STATE_SCORE, currentScore)
        putInt(STATE_LEVEL, currentLevel)
    }

    // Always call the superclass so it can save the view hierarchy state.
    super.onSaveInstanceState(outState)
}

companion object {
    val STATE_SCORE = "playerScore"
    val STATE_LEVEL = "playerLevel"
}

Java

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
// ...


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state.
    savedInstanceState.putInt(STATE_SCORE, currentScore);
    savedInstanceState.putInt(STATE_LEVEL, currentLevel);

    // Always call the superclass so it can save the view hierarchy state.
    super.onSaveInstanceState(savedInstanceState);
}

Not: onSaveInstanceState(), kullanıcı etkinliği açıkça kapattığında veya finish() çağrıldığında çağrılmaz.

Kullanıcı tercihleri veya veritabanı verileri gibi kalıcı verileri kaydetmek için etkinliğiniz ön plandayken uygun fırsatlardan yararlanın. Böyle bir fırsat ortaya çıkmazsa kalıcı verileri onStop() yöntemi sırasında kaydedin.

Kayıtlı örnek durumunu kullanarak etkinlik kullanıcı arayüzü durumunu geri yükleme

Etkinliğiniz daha önce kaldırıldıktan sonra yeniden oluşturulduğunda, kayıtlı örnek durumunuzu sistemin etkinliğinize gönderdiği Bundle bölümünden kurtarabilirsiniz. Hem onCreate() hem de onRestoreInstanceState() geri çağırma yöntemleri, örnek durumu bilgilerini içeren aynı Bundle'u alır.

Sistem, etkinliğinizin yeni bir örneğini yeniden oluşturuyorsa onCreate() yöntemi çağrıldığından, okumayı denemeden önce Bundle durumunun null olup olmadığını kontrol etmeniz gerekir. Boşsa sistem, kaldırılan önceki bir örneği geri yüklemek yerine etkinliğin yeni bir örneğini oluşturur.

Aşağıdaki kod snippet'i, onCreate() ürününde bazı durum verilerini nasıl geri yükleyebileceğinizi göstermektedir:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState) // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance.
    if (savedInstanceState != null) {
        with(savedInstanceState) {
            // Restore value of members from saved state.
            currentScore = getInt(STATE_SCORE)
            currentLevel = getInt(STATE_LEVEL)
        }
    } else {
        // Probably initialize members with default values for a new instance.
    }
    // ...
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance.
    if (savedInstanceState != null) {
        // Restore value of members from saved state.
        currentScore = savedInstanceState.getInt(STATE_SCORE);
        currentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance.
    }
    // ...
}

onCreate() sırasında durumu geri yüklemek yerine sistemin onStart() yönteminden sonra çağırdığı onRestoreInstanceState() özelliğini uygulayabilirsiniz. Sistem onRestoreInstanceState() işlemini yalnızca geri yüklenecek kayıtlı bir durum varsa çağırır. Bu nedenle, Bundle öğesinin null olup olmadığını kontrol etmenize gerek yoktur.

Kotlin

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    // Always call the superclass so it can restore the view hierarchy.
    super.onRestoreInstanceState(savedInstanceState)

    // Restore state members from saved instance.
    savedInstanceState?.run {
        currentScore = getInt(STATE_SCORE)
        currentLevel = getInt(STATE_LEVEL)
    }
}

Java

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy.
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance.
    currentScore = savedInstanceState.getInt(STATE_SCORE);
    currentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

Dikkat: Varsayılan uygulamanın görünüm hiyerarşisinin durumunu geri yükleyebilmesi için her zaman onRestoreInstanceState() üst sınıf uygulamasını çağırın.

Etkinlikler arasında gezinme

Bir uygulama, uygulama ömrü boyunca muhtemelen birçok kez (ör. kullanıcı cihazın Geri düğmesine dokunduğunda veya etkinlik farklı bir etkinlik başlattığında) girip bir aktiviteden çıkar.

Bu bölümde, etkinlik geçişlerini başarılı bir şekilde uygulamak için bilmeniz gereken konular ele alınmaktadır. Bu konular başka bir etkinlikten etkinlik başlatma, etkinlik durumunu kaydetme ve etkinlik durumunu geri yüklemeyi içerir.

Bir etkinliği başka bir yerden başlatma

Bir etkinliğin genellikle bir noktada başka bir etkinlik başlatması gerekir. Örneğin, bir uygulamanın mevcut ekrandan yeni bir ekrana taşınması gerektiğinde bu durum ortaya çıkar.

Etkinliğinizin başlamak üzere olan yeni etkinlikten bir sonuç geri almak isteyip istemediğine bağlı olarak yeni etkinliği startActivity() veya startActivityForResult() yöntemini kullanarak başlatırsınız. Her iki durumda da bir Intent nesnesi geçirirsiniz.

Intent nesnesi, tam olarak başlatmak istediğiniz etkinliği belirtir veya gerçekleştirmek istediğiniz işlemin türünü açıklar. Sistem sizin için uygun etkinliği seçer. Bu etkinlik, farklı bir uygulamadan bile olabilir. Bir Intent nesnesi, başlatılan etkinlik tarafından kullanılacak az miktarda veri de taşıyabilir. Intent sınıfı hakkında daha fazla bilgi için Amaçlar ve Amaç Filtreleri bölümüne bakın.

startActivity()

Yeni başlatılan etkinliğin bir sonuç döndürmesi gerekmiyorsa mevcut etkinlik, startActivity() yöntemini çağırarak etkinliği başlatabilir.

Kendi uygulamanızın içinde çalışırken genellikle bilinen bir etkinliği başlatmanız gerekir. Örneğin, aşağıdaki kod snippet'inde SignInActivity adlı bir etkinliğin nasıl başlatılacağı gösterilmektedir.

Kotlin

val intent = Intent(this, SignInActivity::class.java)
startActivity(intent)

Java

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

Uygulamanız, etkinliğinizden elde edilen verileri kullanarak e-posta, kısa mesaj veya durum güncellemesi göndermek gibi bazı işlemler de yapmak isteyebilir. Bu durumda, uygulamanızın bu tür işlemleri gerçekleştirmek için kendi etkinlikleri olmayabilir. Dolayısıyla bunun yerine, cihazdaki diğer uygulamaların sağladığı etkinliklerden yararlanabilir ve böylece, işlemleri sizin yerinize gerçekleştirebilirsiniz.

Bu noktada amaçların kıymetli olduğunu söyleyebiliriz. Yapmak istediğiniz eylemi açıklayan bir niyet oluşturabilirsiniz ve sistem başka bir uygulamadan uygun etkinliği başlatır. Amacı işleyebilecek birden fazla etkinlik varsa kullanıcı, hangisinin kullanılacağını seçebilir. Örneğin, kullanıcının e-posta iletisi göndermesine izin vermek istiyorsanız aşağıdaki amacı oluşturabilirsiniz:

Kotlin

val intent = Intent(Intent.ACTION_SEND).apply {
    putExtra(Intent.EXTRA_EMAIL, recipientArray)
}
startActivity(intent)

Java

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);

Niyete eklenen ekstra EXTRA_EMAIL, e-postanın gönderileceği e-posta adreslerinden oluşan bir dize dizisidir. Bir e-posta uygulaması bu amaca yanıt verdiğinde, ekstra kısımda sağlanan dize dizisini okur ve adresleri, e-posta yazma formunun "to" alanına yerleştirir. Bu durumda, e-posta uygulamasının etkinliği başlar ve kullanıcı işlemi bittiğinde etkinliğiniz devam eder.

startActivityForResult()

Bazen, sona eren bir etkinlikten sonuç almak istersiniz. Örneğin, kullanıcının kişi listesinden bir kişi seçebilmesini sağlayan bir etkinlik başlatabilirsiniz. Sona erdiğinde, seçilen kişiyi döndürür. Bunu yapmak için startActivityForResult(Intent, int) yöntemini çağırırsınız. Bu yöntemde, tam sayı parametresi çağrıyı tanımlar.

Bu tanımlayıcı, aynı etkinlikten startActivityForResult(Intent, int)'ye yapılan birden fazla çağrıyı birbirinden ayırt etmek için kullanılır. Genel bir tanımlayıcı değildir ve diğer uygulamalarla veya etkinliklerle çakışma riski yoktur. Sonuç, onActivityResult(int, int, Intent) yönteminizle geri gelir.

Bir alt etkinlik çıktığında, verileri üst etkinliğine döndürmek için setResult(int) yöntemini çağırabilir. Alt etkinlik bir sonuç kodu sağlamalıdır. Bu kod standart sonuçlar (RESULT_CANCELED, RESULT_OK veya RESULT_FIRST_USER ile başlayan herhangi bir özel değer) olabilir.

Buna ek olarak, alt etkinlik isteğe bağlı olarak istediği ek verileri içeren bir Intent nesnesi döndürebilir. Üst etkinlik, bilgileri almak için üst etkinliğin başlangıçta sağladığı tam sayı tanımlayıcısıyla birlikte onActivityResult(int, int, Intent) yöntemini kullanır.

Bir alt etkinlik, kilitlenme gibi herhangi bir nedenle başarısız olursa üst etkinlik RESULT_CANCELED kodunu içeren bir sonuç alır.

Kotlin

class MyActivity : Activity() {
    // ...

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // When the user center presses, let them pick a contact.
            startActivityForResult(
                    Intent(Intent.ACTION_PICK,Uri.parse("content://contacts")),
                    PICK_CONTACT_REQUEST)
            return true
        }
        return false
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
        when (requestCode) {
            PICK_CONTACT_REQUEST ->
                if (resultCode == RESULT_OK) {
                    // A contact was picked. Display it to the user.
                    startActivity(Intent(Intent.ACTION_VIEW, intent?.data))
                }
        }
    }

    companion object {
        internal val PICK_CONTACT_REQUEST = 0
    }
}

Java

public class MyActivity extends Activity {
     // ...

     static final int PICK_CONTACT_REQUEST = 0;

     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
             // When the user center presses, let them pick a contact.
             startActivityForResult(
                 new Intent(Intent.ACTION_PICK,
                 new Uri("content://contacts")),
                 PICK_CONTACT_REQUEST);
            return true;
         }
         return false;
     }

     protected void onActivityResult(int requestCode, int resultCode,
             Intent data) {
         if (requestCode == PICK_CONTACT_REQUEST) {
             if (resultCode == RESULT_OK) {
                 // A contact was picked. Display it to the user.
                 startActivity(new Intent(Intent.ACTION_VIEW, data));
             }
         }
     }
 }

Etkinlikleri koordine etme

Bir etkinlik başka bir etkinlik başladığında her ikisi de yaşam döngüsü geçişleri yaşar. İlk etkinlik çalışmayı durdurur ve Duraklatıldı veya Durduruldu durumuna geçerken diğer etkinlik oluşturulur. Bu etkinlikler diske veya başka bir yere kaydedilen verileri paylaşıyorsa ilk etkinlik, ikinci etkinlik oluşturulmadan önce tamamen durdurulmamıştır. İkinciyi başlatma süreci, ilkini durdurma süreciyle çakışır.

Yaşam döngüsü geri çağırmalarının sırası, özellikle iki etkinlik aynı süreçte (yani aynı uygulamada) ve biri diğerini başlatıyorsa iyi tanımlanmıştır. A etkinliği B aktivitesini başlattığında gerçekleşen işlemlerin sırası şu şekildedir:

  1. A etkinliğinin onPause() yöntemi yürütülür.
  2. B Etkinliğinin onCreate(), onStart() ve onResume() yöntemleri sırayla yürütülür. B Etkinliği artık kullanıcı odağında.
  3. A Etkinliği artık ekranda görünmüyorsa onStop() yöntemi yürütülür.

Yaşam döngüsü boyunca yapılan bu geri çağırma işlemleri, bilgilerin bir etkinlikten diğerine geçişini yönetmenize olanak tanır.