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.
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:
-
Kullanıcı,
veya bir sebepten dolayı
finish()
ve en iyi uygulamaları analiz edeceksiniz. - 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:
- A Etkinliği'nin
onPause()
yöntemi yürütülür. - B Etkinliği'nin
onCreate()
,onStart()
veonResume()
yöntem sırayla yürütülür. B Etkinliği artık kullanıcı odaklıdır. - 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.