Etkinlik yaşam döngüsü

Kullanıcı uygulamanızda gezinirken, uygulamanızdan çıkarken veya uygulamanıza geri dönerken Uygulamanızın Activity örneği geçiş yapıyor farklı durumlardan ibarettir. Activity sınıfı, çeşitli geri çağırma işlevleri sağlar. bu etkinlik, bir durum değişikliğini veya bir etkinlik oluşturuyor, durduruyor veya devam ettirdiğini ya da mevcut açıklığa kavuşturmaya ve

Yaşam döngüsü geri çağırma yöntemlerinde, etkinliğinizin Kullanıcı ayrılıp etkinliğe yeniden girdiğinde davranır. Örneğin projenin zamanlamasıyla ilgili akışlı video oynatıcı oluşturarak videoyu duraklatabilir ve ağ bağlantısı. Kullanıcı geri döndüğünde ağa yeniden bağlanabilir ve kullanıcının videoyu şuradan devam ettirebilir: aynı noktaya geliyoruz.

Her geri çağırma özelliği belirli bir işlem yapmanıza olanak tanır. bir ifadedir. Doğru şekilde, doğru işi yerine getirmek hem zaman hem de kullanım geçişleri, uygulamanızı daha sağlam ve yüksek performanslı hale getirir. Örneğin, yaşam döngüsü geri çağırmalarının iyi bir şekilde uygulanması, uygulamanızın şunlardan kaçının:

  • Kullanıcı bir telefon çağrısı alırsa veya başka bir telefona geçerse kilitleniyor en iyi uygulamaları paylaşacağız.
  • Kullanıcı etkin bir şekilde çalışmadığında değerli sistem kaynaklarını tüketme anlamaktır.
  • Kullanıcının uygulamanızdan ayrılıp geri dönebilir.
  • Ekran döndüğünde kullanıcının ilerlemesinin çökmesi veya kaybedilmesi her yönüyle çalışır.

Bu belgede, etkinlik yaşam döngüsü ayrıntılı olarak açıklanmaktadır. Belgenin başlangıç tarihi: yaşam döngüsü paradigmasını açıklayarak. Ardından, geri çağırmaların her biri açıklanır: bunları yürütürken dahili olarak neler olacağını ve uygulamanız gerekenleri yardımcı olmaktır.

Ardından etkinlik ve müşteri arasındaki ilişkinin durumunu ve bir işlemin sistem tarafından sonlandırılmasına karşı kırılganlığını içerir. Son olarak da diğer platformlar ve kanallar arasındaki geçişlerle ilgili etkinlik durumlarını kontrol eder.

Yaşam döngülerini yönetme hakkında bilgi edinin ve daha iyi uygulamalar için bkz. Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini Yönetme ve Kullanıcı Arayüzü Durumlarını Kaydetme. Google Cloud'daki etkinlikleri kullanarak sağlam, üretim kalitesinde bir uygulama tasarlamayı öğrenmek için bileşenleri hakkında daha fazla bilgi edinmek için Uygulama mimarisi rehberi.

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

Etkinlik yaşam döngüsünün aşamaları arasındaki geçişlerde gezinmek için Activity sınıfı, altı geri çağırmadan oluşan bir temel grup sağlar: onCreate(), onStart(), onResume(), onPause(), onStop() ve onDestroy(). Sistem, etkinlik yeni bir duruma girerken bu geri çağırmaların her biri.

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

Şekil 1. Basitleştirilmiş yaşam döngüsünü gösteren bir resimdir.

Kullanıcı etkinlikten ayrılmaya başladığında sistem, yöntemleri çağırır. etkinliği parçalarına ayırabiliriz. Bazı durumlarda etkinlik yalnızca kısmen ve hâlâ bellekte kalır (örneğin, kullanıcı başka bir uygulama. Bu durumlarda, etkinlik yine de ön plana geri dönebilir.

Kullanıcı etkinliğe geri dönerse kullanıcının bıraktığı yerden devam eder. Birkaç istisna dışında, uygulamalar şundan kısıtlandı: aktiviteleri başlatma.

Sistemin olasılık belirli bir süreci öldürmek, bu sürecin içerdiği aktivitelere bağlı olarak zaman alabilir. Eyalet ile devlet arasındaki ilişkiyle ilgili daha fazla bilgi etkinlik durumu ve bellekten çıkarma ile ilgili bölüme bakın.

Aktivitenizin karmaşıklığına bağlı olarak muhtemelen yaşam döngüsü yöntemlerini uygulayın. Ancak isterseniz her birini anlamak ve uygulamanızın davranışını beklentiler oluşturabilirsiniz.

Yaşam döngüsü geri çağırmaları

Bu bölümde, geri çağırma yöntemleridir.

Bazı işlemler etkinlik yaşam döngüsü yöntemlerine aittir. Ancak, yer kodu Şurada bağımlı bir bileşenin eylemlerini uygulayan: bileşenine bakalım. Bunu başarabilmek için duyarlı bileşenin yaşam döngüsüne duyarlı olmasını sağlayın. Nasıl yapıldığını öğrenmek için yaşam döngüsüne duyarlı olan bileşenler için bkz. Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini Yönetme

onCreate()

Bu geri çağırmayı uygulamanız gerekir. Bu geri çağırma, sistem etkinliği'ne dokunun. Etkinlik oluşturulduktan sonra, Oluşturuldu durumuna geçer. onCreate() içinde yöntemini kullanan temel uygulama başlatma mantığını etkinlik süresi boyunca yalnızca bir kez gerçekleşir.

Örneğin, onCreate() uygulanması, verileri listelere bağlayabilir, etkinliği bir ViewModel, ve bazı sınıf kapsamlı değişkenleri örneklendirmek için kullanır. Bu yöntem Bundle olan savedInstanceState parametresi etkinliğin önceden kaydedilen durumunu içeren nesne. Etkinlikte Bundle nesnesinin değeri null olur.

Çözümün yaşam döngüsüne bağlı olan, yaşam döngüsüne duyarlı bir Google'ın zamanla ilgili ON_CREATE unutmayın. @OnLifecycleEvent ile açıklama eklenen bu yöntem, yaşam döngüsüne duyarlı bileşeni, oluşturulmuş durum için gereken kurulum kodunu gerçekleştirebilir.

onCreate() yönteminin aşağıdaki örneği etkinliğin temel ayarlarını (ör. kullanıcı arayüzünü bildirme) gösterir (XML düzen dosyasında tanımlanır), üye değişkenlerini tanımlama ve bazı kullanıcı arayüzleridir. Bu örnekte, XML düzen dosyası dosyanın kaynak kimliğini R.layout.main_activity setContentView().

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 bir genel bakış açısına yeni View nesneleri ekleyerek ViewGroup. Daha sonra bu düzeni kök ViewGroup - setContentView(). Kullanıcı arayüzü oluşturma hakkında daha fazla bilgi için kullanıcı arayüzü dokümanlarını inceleyin.

Etkinliğiniz Oluşturulanlar bölümünde kalmaz durumu. onCreate() yönteminin yürütülmesi bittikten sonra etkinlik, Başlatıldı alanına girer. durumu belirtir ve sistem, onStart() öğesini çağırır. ve onResume() yöntem hızla art arda gelir.

onStart()

Etkinlik Başlatıldı durumuna girdiğinde, sistem onStart() yöntemini çağırır. Bu çağrı, etkinliği kullanıcıya Ön plana geçip etkileşimli hale gelmesi için etkinliğe hazırlanır. Örneğin bu yöntemde, başlatılır.

Etkinlik Başlatıldı durumuna geçtiğinde, yaşam döngüsüne duyarlı herhangi bir bileşen etkinliği gerçekleşene kadar ON_START etkinliği.

onStart() yöntemi tamamlanır hızlı bir şekilde oluşturulur ve Oluşturulma durumunda olduğu gibi, Başlangıç durumunda. Bu geri çağırma bittiğinde, etkinlik Resumed (Devam ettirildi) durumunu gösterir ve sistem, onResume() yöntemi.

onResume()

Etkinlik, Devam Ettirildi durumuna geçtiğinde ön plana gelir ve sistem onResume() öğesini çağırır geri arama. Bu, uygulamanın etkileşime girdiğini gösterir. Bir şey olana kadar uygulama bu durumda kalır Telefon araması alan cihaz veya kullanıcı ya da telefon numarası gibi veya cihaz ekranı kapanıyor.

Etkinlik Devam Ettirildi durumuna geçtiğinde, yaşam döngüsüne duyarlı herhangi bir bileşen etkinliği gerçekleşene kadar ON_RESUME unutmayın. Bu yaşam döngüsü bileşenleri, çalışırken çalışması gereken tüm işlevleri etkinleştirebilir. bileşen görünür ve ön planda (ör. kameranın başlatılması önizle.

Kesintiye uğrayan bir etkinlik gerçekleştiğinde etkinlik, Duraklatıldı durumuna geçer. belirtir ve sistem, onPause() geri arama.

Etkinlik durumunu Duraklatılmış durumdan Devam Ettirdiyseniz, sistem bir kez daha onResume() yöntemini çağırın. Bu nedenle, sırasında yayınladığınız bileşenleri başlatmak için onResume() onPause() ve diğer tüm işlemleri gerçekleştirmek için etkinlik Devam Ettirilen bölümüne her girdiğinde yapılması gereken başlatma işlemleri durumu.

Aşağıdaki örnekte, çalışırken kameraya erişen yaşam döngüsüne duyarlı bir bileşen bileşen ON_RESUME etkinliğini alır:

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, önbelleğin sonlandırılmasından sonra LifecycleObserver ON_RESUME etkinliğini alır. Ancak çoklu pencere modunda etkinliğiniz Duraklatılmış durumda olsa bile tamamen görünür olabilir. Örneğin, Uygulama çoklu pencere modundadır ve kullanıcı birden fazla pencere moduna geçmeyen pencereye dokunur. sonra, etkinliğiniz Duraklatıldı durumuna taşınır.

Şu durumda: kameranın yalnızca uygulama Devam ettirildiğinde (görünür etkin olduğundan emin olun. Ardından, ON_RESUME etkinlik ele alacağız. Etkinlik sırasında kamerayı etkin tutmak istiyorsanız Duraklatılmış ancak görünür durumda (örneğin, çoklu pencere modundaysa) ON_START etkinliğinden sonra kamerayı ilk kullanıma hazırlayın.

Ancak kameranın olması etkinliğiniz Duraklatıldı durumunda etkin durumda olduğunda, başka bir kullanıcının kameraya erişimini reddedebilir Uygulama, çoklu pencere modunda devam ettirildi. Bazen Duraklatılmış durumdayken kameranızı etkinleştirse bile yardımcı olur.

Bu nedenle, aşağıdakilerden hangisini satın almanız gerektiğini yaşam döngüsü boyunca, paylaşılan sistem kaynaklarının kontrolünü ele almak bağlamını ele alalım. Çoklu pencere özelliğini destekleme hakkında daha fazla bilgi edinmek için Çoklu pencere desteği başlıklı makaleyi inceleyin.

Hangi biriktirme etkinliğini seçerseniz seçin, ilk kullanıma hazırlama işlemini gerçekleştirmeniz gerekiyorsa, etkinliği tıklayın. Bir öğeyi ON_START etkinliğini kaldırmasını, ON_STOP etkinliği. Şu durumda: ON_RESUME etkinliğinden sonra başlat, ON_PAUSE etkinliği.

Önceki kod snippet'i, kamera başlatma kodunu yaşam döngüsüne duyarlı bir bileşendir. Bunun yerine bu kodu doğrudan etkinliğe yerleştirebilirsiniz. yaşam döngüsü geri çağırmaları, örneğin onStart() ve onStop() önerilmez, ancak bunu önermiyoruz. Bu mantığı eklemek yaşam döngüsüne duyarlı bir bileşene dönüştürme, bileşeni ve kodu tekrarlamadan birden fazla etkinlikte kullanılabilir. Yaşam döngüsüne duyarlı bir bileşenin nasıl oluşturulacağını öğrenmek için Yaşam Döngüsüne Duyarlı Bileşenlerle Yaşam Döngülerini Yönetme

onPause()

Sistem, kullanıcının ayrıldığının ilk göstergesi olarak bu yöntemi çağırır tıklayın. Ancak bu, her zaman etkinliğin yok edildiği anlamına gelmez. Etkinliğin artık ön planda olmadığını, ancak etkinliğin kullanıcı çoklu pencere modundaysa yine görünür. Bir etkinliğin içeri girmesinin birkaç nedeni olabilir şu eyalet:

  • Şu bölümde açıklandığı gibi, uygulamanın yürütülmesini kesintiye uğratan bir etkinlik: onResume() geri çağırması geçerli etkinliği duraklatır. Bu en yaygın dava açın.
  • Çoklu pencere modunda yalnızca bir uygulamaya odaklanır gerekir, sistem diğer tüm uygulamaları duraklatır.
  • İletişim kutusu gibi yeni, yarı şeffaf bir etkinliğin açılması, etkinliği duraklatır. Ne kadar Etkinlik kısmen görünür durumda ancak net değil. duraklatılmış olarak kalır.

Bir etkinlik Duraklatıldı durumuna geçtiğinde, yaşam döngüsüne duyarlı herhangi bir bileşen etkinliği gerçekleşene kadar ON_PAUSE etkinliği. Burası, yaşam döngüsü bileşenleri, uygulanması gerekmeyen işlevleri bileşen ön planda olmadığında (ör. kameranın durdurulması) önizle.

Duraklatmak için onPause() yöntemini kullanın veya devam edemeyen veya denetleme sırasında devam edebilecek işlemleri düzenleyin. ve Activity Duraklatılmış durumdayken birazdan devam edebilir.

onPause() yöntemini şu işlemler için de kullanabilirsiniz: ya da başka herhangi bir kaynaktan gelen kaynakları (ör. GPS) etkinliğiniz Duraklatılmış durumdayken kullanıcı pil ömrünü etkilemez: ihtiyaç duyacaksınız.

Ancak, onResume() ile ilgili bölümde belirtildiği gibi, Etkinlik, uygulama çoklu pencere modundaysa yine de tam olarak görülebilir. Tamamen serbest bırakmak veya ayarlamak için onPause() yerine onStop() kullanabilirsiniz Çoklu pencere modunu daha iyi desteklemek için kullanıcı arayüzüyle ilgili kaynaklar ve işlemler.

Aşağıdaki LifecycleObserver örneği ON_PAUSE etkinliğine tepki, öncekinin eşdeğeridir ON_RESUME etkinlik örneği, şu tarihten sonra başlatılan kamerayı bırakma ON_RESUME etkinliği alındığında:

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 serbest bırakma kodu ON_PAUSE etkinliğinin alınması LifecycleObserver tarafından alındı.

. onPause() yürütme aşaması çok kısadır ve kaydetme işlemleri için yeterli zaman sunmayabilir. Bunun için nedeniyle, uygulamayı veya kullanıcıyı kaydetmek için onPause() öğesini kullanmayın ağ çağrıları yapabilir ve veritabanı işlemleri yürütebilir. Böyle bir çalışma bir kontrol listesidir.

Bunun yerine, onStop() Okuyucu Gelirleri Yöneticisi'ni uygun operasyonlara dair onStop(), sonraki bölüme bakın. Kaydetme işlemi hakkında daha fazla bilgi durumu kaydetme ve geri yükleme ile ilgili bölüme bakın.

onPause() yönteminin tamamlanması bu, etkinliğin Duraklatılmış durumda kaldığı anlamına gelmez. Aksine, etkinlik devam edene veya tamamen gerçekleşene kadar bu durumda kalır kullanıcı tarafından görülmez. Etkinlik devam ederse sistem, onResume() geri çağırması.

Öğe etkinlik, Duraklatıldı durumundan Devam Ettirilmiş durumuna geri dönerse sistem, bellekte yerleşik Activity örneği, çağrısı yapıldığında sistem onResume() kodunu çağırır. Bu senaryoda, geri çağırma yöntemini kullanmayı unutmayın. Etkinlik yoksa sistem tamamen görünmezse onStop()

onStop()

Etkinliğiniz artık kullanıcı tarafından görülemediğinde Durduruldu durumunda ve sistem; onStop() geri arama. Bu durum, yeni başlatılan bir etkinlik ekranın tamamını kapladığında ortaya çıkabilir. İlgili içeriği oluşturmak için kullanılan sistem ayrıca onStop() adlı kişiyi de çağırır Etkinlik çalıştırılmayı tamamladığında ve sonlandırılmak üzereyken.

Etkinlik Durduruldu durumuna geçtiğinde, yaşam döngüsüne duyarlı herhangi bir bileşen etkinliği gerçekleşene kadar ON_STOP etkinliği. Burası, yaşam döngüsü bileşenleri, uygulanması gerekmeyen işlevleri bileşen ekranda görünür olmadığında.

onStop() yönteminde bırakın veya düzenleyin uygulama kullanıcı tarafından görülemiyorken gerekli olmayan kaynaklar. Örneğin, uygulamanız animasyonları duraklatabilir veya ayrıntılı konum güncellemelerine geçebilirsiniz. Kullanım onPause() yerine onStop() Böylece kullanıcı, etkinliğinizi birden fazla pencerede görüntülüyor olsa bile kullanıcı arayüzüyle ilgili çalışmalar devam eder. yatırım yapmanız önemlidir.

Ayrıca onStop() kullan görece CPU yoğun kapatma işlemleri gerçekleştirmek için. Örneğin, bilgileri veritabanına kaydetmek için daha iyi bir zaman bulamazsınız. bu işlemi onStop() arasında yapabilirsiniz. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnekte, onStop() kalıcı depolama alanına taslak not:

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 Oda'yı kullanmanızı öneririz. SQLite üzerinde soyutlama katmanı sağlayan bir kalıcılık kitaplığı. Öğrenmek için Room'u kullanmanın avantajları ve uygulamanızda Oda özelliğini nasıl uygulayacağınız hakkında daha fazla bilgi için bkz. Oda Kalıcılığı Kitaplığı rehberini inceleyin.

Etkinliğiniz Durduruldu durumuna geçtiğinde, Activity nesne bellekte yerleşik olarak tutulur: Tüm durumu ve üyeyi korur pencere yöneticisine bağlı değildir. Etkinlik bu bilgileri hatırlar.

Herhangi bir teknik geri çağırma yöntemlerinden herhangi biri sırasında oluşturulan bileşenleri yeniden başlat bir kontrol noktası görevi görebilir. Sistem ayrıca o sırada geçerli olan durumundaki her View nesnesi için geçerlidir. Dolayısıyla Kullanıcı bir EditText widget'ına girdi ve saklanır. Böylece, ilgili içeriği kaydedip geri yüklemeniz gerekmez.

Not: Etkinliğiniz durdurulduktan sonra sistem sistem, etkinliği içeren işlemi yok edebilir. kullanıcının hafızayı kurtarması gerekiyor. Etkinlik sırasında sistem işlemi yok etse bile durdurulursa sistem, View durumunu korur. EditText widget'ındaki metin gibi nesneler Bundle (anahtar/değer çiftleri blobu) ve bunları geri yükler Kullanıcı etkinliğe geri dönerse. Örneğin, Kullanıcının geri döndüğü bir etkinliği geri yükleme hakkında daha fazla bilgi için durumu kaydetme ve geri yükleme ile ilgili bölüme bakın.

Durduruldu durumunda, etkinlik Aksi durumda etkinlik biter ve kaybolur. Etkinlik sistem onRestart() komutunu çağırır. Activity çalışması tamamlandıysa sistem onDestroy().

onDestroy()

onDestroy(), etkinlik yok sayılır. Sistem bu geri çağırmayı aşağıdaki iki nedenden biriyle gerçekleştirir:

  1. Kullanıcı, veya bir sebepten dolayı finish() ve en iyi uygulamaları analiz edeceksiniz.
  2. Sistem, bir yapılandırma nedeniyle etkinliği geçici olarak kaldırıyor (ör. cihaz döndürme veya çoklu pencere moduna girme)

Etkinlik yok edilmiş duruma geldiğinde, yaşam döngüsüne duyarlı herhangi bir bileşen etkinliği gerçekleşene kadar ON_DESTROY etkinliği. Burası, yaşam döngüsü bileşenleri, ilk çözümden önce ihtiyaç duydukları her şeyi Activity kaldırıldı.

Activity öğesinin neden imha edildiğini anlamak için içinde mantığınıza yer vermek yerine, şunu içerecek bir ViewModel nesnesi kullanın: Activity için alakalı görünüm verileri sunar. Activity yeniden oluşturulursa yapılandırma değişikliği nedeniyle ViewModel öğesinin herhangi bir işlem yapmasına gerek yoktur. bu değer korunur ve sonraki Activity örneğine verilir.

Activity yeniden oluşturulmazsa ViewModel, onCleared() yöntemi çağrıldı, burada yok edilmeden önce ihtiyaç duyduğu verileri temizleyebilir. Şunlar sayesinde bu iki senaryoyu birbirinden ayırt edebilirsiniz: isFinishing() yöntemini kullanabilirsiniz.

Etkinlik tamamlanıyorsa onDestroy(), son yaşam döngüsü geri çağırma yöntemidir. bu verileri kullanabilirsiniz. onDestroy(), bir yapılandırma sonucunda çağrılırsa sistem hemen yeni bir etkinlik örneği oluşturur ve onCreate() yeni yapılandırmaya yerleştirin.

onDestroy() geri çağırması, daha önce yayınlanmamış tüm kaynakları serbest bırakır onStop() gibi geri çağırmalar.

Etkinlik durumu ve bellekten çıkarma

Sistem, RAM'de yer açması gerektiğinde işlemleri sonlandırır. Sistemin olasılık belirli bir süreci sonlandırmak, sürecin o anki durumuna bağlıdır. İşlem durumu, ise süreçte devam eden etkinliğin durumuna bağlıdır. Tablo 1’de süreç durumu ile etkinlik arasındaki korelasyonlar gösterilmektedir olasılığı ve sistemin süreci sonlandırma olasılığı gibi unsurlardır. Bu tablo yalnızca bir işlem diğer uygulama bileşenleri de dahildir.

Öldürme olasılığı İşlem durumu Son etkinlik durumu
En düşük Ön plan (odaklanmak üzere olan veya olmayan) Devam ettirildi
Düşük Görünür (odaklama 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 etkinliği doğrudan sonlandırmaz. Bunun yerine etkinliğin gerçekleştiği işlemi sonlandırarak yalnızca etkinliği değil, işlemdeki diğer her şeye de yansır. Projelerinizi nasıl koruyacağınızı öğrenmek için ve işlemin sistem tarafından başlatılan işlem ölümünden sonra etkinliğinizin kullanıcı arayüzü durumunu geri yükleyin durumu kaydetme ve geri yükleme ile ilgili bölüme bakın.

Kullanıcı ayrıca Ayarlar'ın altındaki Uygulama Yöneticisi'ni kullanarak da bir işlemi sonlandırabilir. ilgili uygulamayı kapatın.

Süreçler hakkında daha fazla bilgi için bkz. İşlemler ve iş parçacıkları 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 tüm dönem boyunca aynı kalmasını bekler yapılandırma değişiklikleri (ör. döndürme veya çoklu pencere moduna geçme) Ancak, böyle bir yapılandırma olduğunda sistem varsayılan olarak etkinliği kaldırır değişiklik gerçekleşir ve etkinlik örneğinde depolanan kullanıcı arayüzü durumları silinir.

Benzer şekilde, kullanıcı geçici bir süre için kullanıcı arayüzü durumunun aynı kalmasını uygulamanızdan farklı bir uygulamaya geçip ardından geri dönmek daha sonra. Ancak sistem, kullanıcı dışarıda ve etkinliğiniz durduruldu.

Sistem kısıtlamaları etkinliği yok ettiğinde, kullanıcının geçici kullanıcı arayüzü durumu için ViewModel onSaveInstanceState() ve/veya yerel depolama alanı. Sisteme kıyasla kullanıcı beklentileri hakkında daha fazla bilgi edinmek için karmaşık kullanıcı arayüzü durumu verilerinin en iyi şekilde nasıl korunacağını olup olmadığını kontrol etmek için, bkz. Kullanıcı arayüzü durumlarını kaydedin.

Bu bölümde, örnek durumunun ne olduğu ve onSaveInstance() yöntemini çağırın. Eğer Kullanıcı arayüzü verileri basittir, kullanıcı arayüzünde kalıcı olması için yalnızca onSaveInstance() kullanabilirsiniz hem yapılandırma değişiklikleri hem de sistem tarafından başlatılan işlemin sonlandırılması. Ancak onSaveInstance() için serileştirme/seri durumdan çıkarma maliyetleri çoğu durumda hem ViewModel hem de onSaveInstance() kullanırsınız, ana hatlarıyla Kullanıcı arayüzü durumlarını kaydedin.

Not: Yapılandırma değişiklikleri hakkında daha fazla bilgi edinmek için Etkinliği kısıtlama ve bu yapılandırma değişikliklerine nasıl tepki vereceğinizi Sistemi ve Jetpack Compose'u görüntüleyin, inceleyin: Yapılandırma değişikliklerini işleme sayfası.

Örnek durumu

Etkinliğinizin normal uygulama nedeniyle yok edildiği birkaç senaryo vardır Örneğin kullanıcının Geri düğmesine basması veya etkinliklerinizin kendi yıkımına işaret ederek finish() yöntemidir.

Kullanıcı Geri düğmesine bastığı için etkinliğiniz kaldırıldığında yoksa etkinliğin kendiliğinden sona ermesi, hem sistemin hem de kullanıcının bu Activity örneği kalıcı olarak silinecek. Bu durumlarda, kullanıcının beklentisinin sistemin davranışıyla eşleştiğini ve başka işleri de yok.

Bununla birlikte, sistem kısıtlamaları (örneğin, yapılandırma değişikliği veya bellek baskısı) nedeniyle, Activity. sistem bu örneği hatırlar. Kullanıcı bir sistem bu etkinliğin yeni bir örneğini kayıtlı veri kümesini kullanan ve etkinliğin durumunu açıklayan yıktığında yıkılmıştı.

Sistemin örnek durumu olarak adlandırılır. Bu program, Bundle nesnesinde depolanan anahtar/değer çiftleri. Varsayılan olarak sistem bilgileri kaydetmek için Bundle örneği durumunu kullanır etkinlik düzeninizdeki her View nesnesi hakkında (örneğin, bir EditText widget'ı.

Örneğin, etkinlik örneğiniz kaldırılır ve yeniden oluşturulursa düzenin durumu hiçbir kod gerekmeden önceki durumuna geri yüklendi. Ancak, etkinliği, geri yüklemek istediğiniz daha fazla durum bilgisine sahip olabilir; örneğin, Kullanıcının etkinlikteki ilerlemesini izleyen üye değişkenleri.

Not: Android sisteminin her görünümün benzersiz bir kimliği olmalıdır. android:id özelliği.

Bundle nesnesi, şunlardan fazlasını korumak için uygun değildir: ana iş parçacığında serileştirme gerektirdiği ve iş parçacığının sistem-işlem belleğidir. Çok az miktarda veriyi korumak için verileri korumak için kalıcı yerel araçlar kullanarak birleşik bir yaklaşım benimsemelidir. depolama alanı, onSaveInstanceState() yöntemi ve sayfasında belirtildiği gibi ViewModel sınıf Kullanıcı arayüzü durumlarını kaydedin.

onSaveInstanceState() kullanarak basit ve hafif kullanıcı arayüzü durumunu kaydedin

Etkinliğiniz durmaya başladığında, sistem onSaveInstanceState() yöntemini nasıl kullanabilirsiniz? Böylece etkinliğiniz, durum bilgilerini bir örnek durumuna kaydedebilir. paket. Bu yöntemin varsayılan olarak uygulanması geçici etkinliğin görünüm hiyerarşisinin durumuyla ilgili bilgiler, örneğin EditText widget'ındaki metni veya bir ListView widget'ı.

Etkinliğinize ait ek örnek durumu bilgilerini kaydetmek için şunu geçersiz kılın: onSaveInstanceState(). ve kaydedilen Bundle nesnesine anahtar/değer çiftleri ekleyin etkinliğinizin beklenmedik bir şekilde yok edilmesi ihtimaline karşı koruma sağlar. Geçersiz kıldığınızda onSaveInstanceState(), üst sınıf uygulamasını çağırmanız gerekir varsayılan uygulamanın görünüm hiyerarşisinin durumunu kaydetmesini istiyorsanız. Bu, aşağıdaki örnekte gösterilmektedir:

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() değil Kullanıcı etkinliği açıkça kapattığında veya diğer durumlarda finish() çağrıldı.

Kullanıcı tercihleri veya bir veritabanındaki veriler gibi kalıcı verileri kaydetmek için ve etkinliğiniz ön planda olduğunda uygun fırsatları değerlendirebilirsiniz. Böyle bir fırsat doğmazsa, doğrulama işlemi sırasında kalıcı verileri onStop() yöntemini kullanabilirsiniz.

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

Etkinliğiniz önceden yok edildikten sonra yeniden oluşturulduğunda Bundle'dan kaydedilmiş örneğinizin durumunu kurtarabilir. otomatik olarak kaydedilir. Hem onCreate() ve onRestoreInstanceState() geri çağırma yöntemleri,Bundle örnek durum bilgisi sağlar.

Çünkü onCreate() yöntemi etkinliğin yeni bir örneğini oluşturup oluşturmadığı yeniden oluşturuyorsanız Bundle durumunun mevcut olup olmadığını kontrol etmeniz gerekir. değeri null olacaktır. Boşsa sistem bir etkinliği geri yüklemek yerine etkinliğin yeni bir örneğini tam olarak yıkılmıştı.

Aşağıdaki kod snippet'inde bazı onCreate() içindeki durum verileri:

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.
    }
    // ...
}

Bu süreçte durumu geri yüklemek yerine onCreate() uygulamak istiyorsanız onRestoreInstanceState(); onStart() yöntemini kullanabilirsiniz. Sistem onRestoreInstanceState(). geri yüklenecek kayıtlı bir durum varsa Bundle değerinin null olup olmadığını kontrol etmesi gerekmez.

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: Her zaman onRestoreInstanceState(). Böylece varsayılan uygulama, görünüm hiyerarşisinin durumunu geri yükleyebilir.

Etkinlikler arasında gezinme

Bir uygulama, işlem sırasında bir etkinliğe belki de birçok kez girip çıkabilir. uygulamanın kullanım ömrü (ör. kullanıcı, cihazın Geri düğmesine dokunduğunda) veya etkinlik farklı bir etkinlik başlatır.

Bu bölüm başarılı etkinlik geçişlerini uygulamak için bilmeniz gereken konuları ele alır. Bu konular arasında başka bir etkinlikten etkinlik başlatma, etkinliği kaydetme geri yükleme durumunu gösterir.

Bir etkinlikten başka bir etkinlik başlatma

Bir etkinliğin genellikle bir noktada başka bir aktivite başlatması gerekir. Bu ihtiyaç Örneğin, bir uygulamanın mevcut ekrandan bir oluşturabilirsiniz.

Etkinliğinizin yeni etkinlikten sonuç almak isteyip istemediğine bağlı olarak başlamak üzereyken yeni etkinliği başlatmak için startActivity(). yöntemini veya startActivityForResult() yöntemidir. Her iki durumda da bir Intent nesnesi geçirirsiniz.

Intent nesnesi, başlatmak istediğiniz etkinlik veya gerçekleştirmek istediğiniz işlemin türünü açıklar. Sistem sizin için uygun etkinliği seçer. başka bir uygulamadan alabilirsiniz. Intent nesnesi Ayrıca, başlatılan etkinlik tarafından kullanılacak az miktarda veri de taşımalıdır. Intent sınıfı hakkında daha fazla bilgi için bkz. Niyetler ve Amaç Filtreler.

startActivity()

Yeni başlatılan etkinliğin bir sonuç döndürmesi gerekmiyorsa geçerli etkinlik bunu başlatabilir öğesini çağırarak startActivity(). yöntemidir.

Kendi uygulamanız içinde çalışırken genellikle bilinen bir etkinliği başlatmanız gerekir. Örneğin, aşağıdaki kod snippet'i SignInActivity

Kotlin

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

Java

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

Uygulamanız ayrıca e-posta gönderme, Gmail'e gönderme, etkinliğinizdeki verileri kullanarak kısa mesaj veya durum güncellemesi gönderir. Bu durumda uygulamanızın bu tür işlemleri yapmak için kendi etkinlikleri olmayabilir. Bunun yerine, cihazdaki diğer uygulamaların sağladığı etkinliklerden yararlanabilirsiniz. , bu işlemleri sizin için gerçekleştirebilir.

Amaçlar tam da bu noktada kıymetlidir. Web sitemiz g.co/newsinitiative/labs üzerinden belirten bir e-posta görürseniz ve sistem, bununla ilgili uygun başka bir uygulamadaki etkinlik olabilir. Amacı gerçekleştirebilecek birden fazla etkinlik varsa kullanıcı hangisini kullanacağını seçebilir. Örneğin, kullanıcının bir şu 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);

Amaca eklenen EXTRA_EMAIL ekstrası, e-posta adresi. E-posta uygulaması bu amaca yanıt verdiğinde, ekstra ve adresleri "alıcı" bölümüne yerleştirir alanına girmelisiniz. Burada durumu, e-posta uygulamasının etkinliği başlar ve kullanıcı işini etkinliğiniz devam eder.

startActivityForResult()

Bazen sona eren bir etkinlikten sonuç almak istersiniz. Örneğin, Yeşil Ofis projenizde Kullanıcının kişiler listesinden kişi seçebilmesini sağlayan bir etkinlik. Sonunda, kullanıcı olabilir. Bunun için de startActivityForResult(Intent, int). yöntemini kullanarak tamsayı parametresi çağrıyı tanımlar.

Bu tanımlayıcının amacı, startActivityForResult(Intent, int). elde edebilirsiniz. Genel tanımlayıcı değil ve diğer uygulamalarla veya etkinliklerle çakışma riski taşımadığından emin olun. Sonuç, onActivityResult(int, int, Intent). yöntemidir.

Bir çocuk etkinliği sona erdiğinde setResult(int) komutunu çağırarak şunları yapabilir: verileri üst öğesine döndürecektir. Alt etkinlik, standart sonuçlar olabilecek bir sonuç kodu sağlamalıdır. RESULT_CANCELED, RESULT_OK veya herhangi bir özel değer başlangıç fiyatı: RESULT_FIRST_USER.

Ayrıca, alt etkinlik isteğe bağlı olarak bir Intent döndürebilir nesnesini ifade eder. Ebeveyn etkinliği, onActivityResult(int, int, Intent). yöntemini ve başlangıçta ebeveyn etkinliğinin tam sayı tanımlayıcısını bu bilgileri almak için idealdir.

Bir alt etkinlik, kilitlenme gibi herhangi bir nedenle başarısız olursa etkinliği RESULT_CANCELED koduyla 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şlattığında her ikisinde de yaşam döngüsü geçişleri yapılır. İlk etkinlik çalışmayı durdurur ve Duraklatıldı veya Durduruldu durumuna geçerken, diğer etkinlik etkinliği oluşturulur. Bu etkinliklerin diske veya başka bir yere kaydedilen verileri paylaşması durumunda ilk faaliyetin, ikinci etkinlikten önce tamamen durdurulmadığının anlaşılması önemlidir. ile başlar. Daha ziyade, ikincisine başlama süreci, geleneksel yaklaşımla ilkini durduruyorum.

Yaşam döngüsü geri çağırmalarının sırası iyi tanımlanmıştır, özellikle de iki etkinlik aynı süreçte, diğer bir deyişle aynı uygulama ile biri diğerini başlatıyordur. Gerçekleşen işlemlerin sırası A etkinliği B aktivitesi başladığında:

  1. A Etkinliği'nin onPause() yöntemi yürütülür.
  2. B Etkinliği'nin onCreate(), onStart() ve onResume() yöntem sırayla yürütülür. B Etkinliği artık kullanıcı odaklıdır.
  3. A Etkinliği artık ekranda görünmüyorsa onStop() yöntemi yürütülür.

Bu yaşam döngüsü geri çağırmaları dizisi, bilgi sağlar.