Etkinliklere giriş

Activity sınıfı, Android uygulamasının önemli bir bileşenidir. Etkinliklerin başlatılma ve bir araya getirilme şekli, platformun uygulama modelinin temel bir parçasıdır. Uygulamaların main yöntemiyle başlatıldığı programlama paradigmalarının aksine, Android sistemi, yaşam döngüsünün belirli aşamalarına karşılık gelen belirli geri çağırma yöntemlerini çağırarak Activity örneğinde kodu başlatır.

Bu belgede, etkinlik kavramı tanıtıldıktan sonra etkinliklerle çalışma hakkında bazı basit bilgiler verilmektedir. Uygulamanızı tasarlarken en iyi uygulamalar hakkında daha fazla bilgi için Uygulama mimarisi kılavuzu'na bakın.

Etkinlik kavramı

Mobil uygulama deneyimi, masaüstü sürümünden farklı olarak kullanıcının uygulamayla etkileşiminin her zaman aynı yerden başlamamasıyla ayrılır. Bunun yerine, kullanıcı yolculuğu genellikle deterministik olmayan bir şekilde başlar. Örneğin, ana ekranınızdan bir e-posta uygulaması açarsanız e-posta listesi görebilirsiniz. Buna karşılık, e-posta uygulamanızı başlatan bir sosyal medya uygulaması kullanıyorsanız doğrudan e-posta uygulamasının e-posta oluşturma ekranına gidebilirsiniz.

Activity sınıfı, bu paradigmayı kolaylaştırmak için tasarlanmıştır. Bir uygulama başka bir uygulamayı çağırdığında, çağıran uygulama diğer uygulamadaki bir etkinliği çağırır. Uygulama, atomik bir bütün olarak çağrılmaz. Bu şekilde etkinlik, uygulamanın kullanıcıyla etkileşiminin giriş noktası olarak işlev görür. Bir etkinliği Activity sınıfının alt sınıfı olarak uygularsınız.

Etkinlik, uygulamanın kullanıcı arayüzünü çizdiği pencereyi sağlar. Bu pencere genellikle ekranı kaplar ancak ekrandan daha küçük olabilir ve diğer pencerelerin üzerinde kayabilir.

Genellikle bir uygulamadaki bir etkinlik, ana etkinlik olarak belirtilir. Bu etkinlik, kullanıcı uygulamayı başlattığında görünen ilk ekrandır. Modern Compose uygulamalarında, görünüm hiyerarşisine sahip olmak yerine composable'ları tek etkinlikli bir mimaride barındırdığı için bu, gerekli olan tek etkinliktir. Uygulamada ekranlar için birden fazla etkinlik olması yerine, etkinlik ana makinesindeki composable'lar birden fazla gezinme hedefi içerir.

Uygulamanızda etkinlikleri kullanmak için etkinliklerle ilgili bilgileri uygulamanın manifest dosyasında kaydetmeniz gerekir. Ayrıca etkinlik yaşam döngüleri hakkında bilgi sahibi olmanız da iyi bir uygulamadır. Bu belgenin geri kalanında bu konular ele alınmaktadır.

Manifest dosyasını yapılandırma

Uygulamanızın etkinlikleri kullanabilmesi için etkinlikleri ve belirli özelliklerini manifest dosyasında beyan etmeniz gerekir.

Etkinlikleri beyan etme

Etkinliğinizi tanımlamak için manifest dosyanızı açın ve <activity> öğesini <application> öğesinin alt öğesi olarak ekleyin. Örneğin:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

Bu öğe için tek gerekli özellik, etkinliğin sınıf adını belirten android:name'dir. Etkinlik özelliklerini tanımlayan etiket, simge veya kullanıcı arayüzü teması gibi özellikler de ekleyebilirsiniz. Bu ve diğer özellikler hakkında daha fazla bilgi için <activity> öğesiyle ilgili referans belgelerine bakın.

Amaç filtrelerini bildirme

Amaç filtreleri, Android platformunun çok güçlü bir özelliğidir. Bu işlevler, yalnızca açık bir isteğe değil, örtülü bir isteğe dayalı olarak da etkinlik başlatma olanağı sunar. Örneğin, açık bir istek, sisteme "Gmail uygulamasında E-posta Gönderme etkinliğini başlat" demesini söyleyebilir. Buna karşılık, örtülü bir istek sisteme "İşi yapabilecek herhangi bir etkinlikte E-posta Gönder ekranını başlat" der. Sistem kullanıcı arayüzü, bir görevi gerçekleştirirken hangi uygulamanın kullanılacağını sorduğunda niyet filtresi çalışır.

<activity> öğesinde bir <intent-filter> özelliği belirterek bu özellikten yararlanabilirsiniz. Bu öğenin tanımı bir <action> öğesi ve isteğe bağlı olarak bir <category> öğesi ve/veya bir <data> öğesi içerir. Bu öğeler, etkinliğinizin yanıt verebileceği amaç türünü belirtmek için birleştirilir. Örneğin, aşağıdaki kod snippet'inde metin verileri ve e-posta gönderen, diğer etkinliklerden de bu işlemi yapması için istek alan bir etkinliğin nasıl yapılandırılacağı gösterilmektedir:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
   <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="mailto" />
    </intent-filter>
</activity>

Bu örnekte, <action> öğesi bu etkinliğin veri gönderdiğini belirtir. <category> öğesini DEFAULT olarak bildirmek, etkinliğin başlatma istekleri almasını sağlar. <data> öğesi, bu etkinliğin gönderebileceği veri türünü belirtir. Aşağıdaki kod snippet'inde, e-posta oluşturmak için yukarıda açıklanan etkinliğin nasıl çağrılacağı gösterilmektedir:

fun composeEmail(addresses: Array<String>, subject: String) {
    val intent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:") // Only email apps handle this.
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

Uygulamanızın bağımsız olmasını ve diğer uygulamaların etkinliklerini etkinleştirmesine izin vermemesini istiyorsanız başka intent filtresine ihtiyacınız yoktur. Diğer uygulamalara sunmak istemediğiniz etkinliklerde intent filtresi olmamalıdır. Bu etkinlikleri, açık intent'ler kullanarak kendiniz başlatabilirsiniz. Etkinliklerinizin intent'lere nasıl yanıt verebileceği hakkında daha fazla bilgi için Intent'ler ve intent filtreleri başlıklı makaleyi inceleyin.

Gelen intent'leri işleme

Aşağıdaki örnekte, tek metin paylaşımları, tek resimler ve birden fazla resim dizisi gibi birden fazla amaç türü işlenirken etkinlik yaşam döngüsünü yönetme kalıbı gösterilmektedir. Bu çeşitli girişleri merkezi bir handleIntent işlevi üzerinden yönlendirerek hem ACTION_SEND hem de ACTION_SEND_MULTIPLE işlemlerinin doğru şekilde ayrıştırılıp reaktif bir kullanıcı arayüzü güncellemesi için ViewModel'e devredilmesini sağlar.

class ExampleActivity : ComponentActivity() {
  private val viewModel: MyViewModel by viewModels()

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    handleIntent(intent)
    setContent {
      ComposeApp(viewModel)
    }
  }

  override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    setIntent(intent)
    handleIntent(intent)
  }

  private fun handleIntent(intent: Intent?) {
    when (intent?.action) {
      Intent.ACTION_SEND -> {
        if ("text/plain" == intent.type) {
          intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
            viewModel.handleText(it) // Update UI to reflect text being shared
          }
        } else if (intent.type?.startsWith("image/") == true) {
          (intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java))?.let {
            viewModel.handleImage(it) // Update UI to reflect image being shared
          }
        }
      }

      Intent.ACTION_SEND_MULTIPLE -> {
          if (intent.type?.startsWith("image/") == true) {
              intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM, Uri::class.java)?.let {
                  viewModel.handleMultipleImages(it) // Update UI to reflect multiple images being shared
              }
          } else {
              // Handle other types
          }
      }

      else -> {
          // Handle other intents
      }
    }
  }
}

İzinleri tanımlama

Hangi uygulamaların belirli bir etkinliği başlatabileceğini kontrol etmek için manifestin <activity> etiketini kullanabilirsiniz. Bir üst etkinlik, her iki etkinlik de manifestlerinde aynı izinlere sahip olmadığı sürece bir alt etkinlik başlatamaz. Bir üst etkinlik için <uses-permission> öğesi tanımlarsanız her alt etkinlikte eşleşen bir <uses-permission> öğesi olmalıdır.

Örneğin, uygulamanız sosyal medyada gönderi paylaşmak için SocialApp adlı varsayımsal bir uygulamayı kullanmak istiyorsa SocialApp'in kendisi, onu çağıran bir uygulamanın sahip olması gereken izni tanımlamalıdır:

<manifest>
<activity android:name="...."
   android:permission="com.google.socialapp.permission.SHARE_POST"

/>

Ardından, SocialApp'i aramanıza izin verilmesi için uygulamanızın, SocialApp'in manifest dosyasında ayarlanan izinle eşleşmesi gerekir:

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

İzinler ve genel güvenlik hakkında daha fazla bilgi için Güvenlik kontrol listesi başlıklı makaleyi inceleyin.

Etkinlik yaşam döngüsünü yönetme

Bir etkinlik, kullanım süresi boyunca çeşitli durumlardan geçer. Durumlar arasındaki geçişleri işlemek için bir dizi geri çağırma kullanırsınız. Aşağıdaki bölümlerde bu geri çağırmalar tanıtılmaktadır. Bir Compose uygulamasında doğrudan bu geri çağırmalara bağlanmanız önerilmez. Bunun yerine, durum değişikliklerini gözlemlemek için Lifecycle API'yi kullanın. Daha fazla bilgi için Yaşam döngüsünü Compose ile entegre etme başlıklı makaleye bakın.

onCreate

Sistem etkinliğinizi oluşturduğunda tetiklenen bu geri çağırmayı uygulamanız gerekir. Uygulamanız, etkinliğinizin temel bileşenlerini başlatmalıdır. Örneğin, uygulamanız burada görünümler oluşturmalı ve verileri listelere bağlamalıdır.

Bir Compose uygulamasında, aşağıdaki örnekte gösterildiği gibi setContent kullanarak ana composable'ınızı ayarlamak için bu geri çağırmayı kullanın:

class MyActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text(text = stringResource(id = R.string.greeting))
        }
    }
}

onCreate tamamlandığında bir sonraki geri çağırma her zaman onStart olur.

onStart

onCreate sona erdiğinde etkinlik Başlatıldı durumuna girer ve kullanıcı tarafından görünür hale gelir. Bu geri çağırma, etkinliğin ön plana çıkıp etkileşimli hale gelmesi için gereken son hazırlıkları içerir.

onResume

Sistem, etkinlik kullanıcıyla etkileşime başlamadan hemen önce bu geri çağırmayı başlatır. Bu noktada etkinlik, etkinlik yığınının en üstünde yer alır ve tüm kullanıcı girişlerini yakalar. Uygulamanın temel işlevinin çoğu onResume yönteminde uygulanır.

onPause geri çağırma işlemi her zaman onResume'ı izler.

onPause

Etkinlik odağını kaybettiğinde ve duraklatılmış duruma girdiğinde sistem onPause işlevini çağırır. Bu durum, örneğin kullanıcı Geri veya Son Kullanılanlar düğmesine dokunduğunda ortaya çıkar. Sistem, etkinliğiniz için onPause işlevini çağırdığında bu, teknik olarak etkinliğinizin hâlâ kısmen görünür olduğu anlamına gelir ancak çoğu zaman kullanıcının etkinlikten ayrıldığı ve etkinliğin yakında Durduruldu veya Devam Ediyor durumuna gireceği anlamına gelir.

Duraklatılmış durumdaki bir etkinlik, kullanıcı arayüzünün güncellenmesini bekliyorsa kullanıcı arayüzünü güncellemeye devam edebilir. Bu tür bir etkinliğe örnek olarak, bir navigasyon haritası ekranını veya oynatılan bir medya oynatıcısını gösteren etkinlik verilebilir. Bu tür etkinlikler odaklarını kaybetseler bile kullanıcı, kullanıcı arayüzünün güncellenmeye devam etmesini bekler.

Uygulama veya kullanıcı verilerini kaydetmek, ağ çağrıları yapmak ya da veritabanı işlemleri yürütmek için onPause kullanmamalısınız. Verileri kaydetme hakkında bilgi için Geçici kullanıcı arayüzü durumunu kaydetme ve geri yükleme başlıklı makaleyi inceleyin.

onPause yürütmeyi tamamladığında, etkinliğin Duraklatıldı durumuna girmesinden sonraki işlemlere bağlı olarak bir sonraki geri çağırma onStop veya onResume olur.

onStop

Sistem, etkinlik kullanıcıya görünür olmaktan çıktığında onStop işlevini çağırır. Bunun nedeni, etkinliğin yok edilmesi, yeni bir etkinliğin başlatılması veya mevcut bir etkinliğin Devam Edildi durumuna girip durdurulan etkinliği kapsaması olabilir. Bu durumlarda durdurulan etkinlik artık hiç görünmez.

Sistemin çağırdığı bir sonraki geri çağırma, etkinlik kullanıcıyla etkileşim kurmak için geri geliyorsa onRestart, bu etkinlik tamamen sonlandırılıyorsa onDestroy olur.

onRestart

Sistem, Durduruldu durumundaki bir etkinlik yeniden başlatılmak üzereyken bu geri çağırmayı çağırır. onRestart, etkinliğin durdurulduğu zamandaki durumunu geri yükler.

Bu geri çağırma her zaman onStart ile takip edilir.

onDestroy

Sistem, bir etkinlik yok edilmeden önce bu geri çağırmayı çağırır.

Bu geri çağırma, etkinliğin aldığı son geri çağırmadır. onDestroy, genellikle bir etkinliğin veya onu içeren sürecin yok edilmesi durumunda etkinliğin tüm kaynaklarının serbest bırakılmasını sağlamak için uygulanır.

Bu bölümde yalnızca konuyla ilgili bir giriş yapılmaktadır. Etkinlik yaşam döngüsü ve geri çağırmaları hakkında daha ayrıntılı bilgi için Etkinlik yaşam döngüsü başlıklı makaleyi inceleyin.