Son kullanılanlar ekranı

Genel Bakış ekranı, son görevler listesi veya son uygulamalar ekranı olarak da adlandırılan Son Kullanılanlar ekranı, son erişilen etkinlikleri ve görevleri listeleyen sistem düzeyinde bir kullanıcı arayüzüdür. Kullanıcı listede gezinebilir, devam ettirmek için bir görev seçebilir veya listeden kaldırmak istediği görevi kaydırarak silebilir.

Son Kullanılanlar ekranında, Android 5.0'da (API düzeyi 21) kullanıma sunulan belge odaklı bir model kullanılır. Bu modelde, farklı belgeler içeren aynı etkinliğin birden fazla örneği, Son Kullanılanlar ekranında görev olarak görünebilir. Örneğin, Google Drive'da çeşitli Google dokümanlarının her biri için bir görev olabilir. Her doküman, Son Kullanılanlar ekranında bir görev olarak görünür:

Her biri ayrı bir görev olarak gösterilen iki Google Drive dokümanının gösterildiği Son Öğeler ekranı.

Başka bir yaygın örnek ise kullanıcının tarayıcısını kullanırken Paylaş > Gmail'e dokunmasıdır. Gmail uygulamasının Oluştur ekranı gösterilir. O sırada Son Kullanılanlar düğmesine dokunduğunuzda Chrome ve Gmail'in ayrı görevler olarak çalıştığı gösterilir:

Chrome ve Gmail'in ayrı görevler olarak çalıştığı Görevler ekranı.

Normalde, görevlerinizin ve etkinliklerinizin Son Kullanılanlar ekranında nasıl gösterileceğini sistemin tanımlamasına izin verirsiniz. Bu davranışı değiştirmeniz gerekmez. Ancak uygulamanız, etkinliklerin Son Arananlar ekranında nasıl ve ne zaman görüneceğini belirleyebilir.

ActivityManager.AppTask sınıfı, görevleri yönetmenize olanak tanır. Intent sınıfının etkinlik işaretleri ise bir etkinliğin Son Eklenenler ekranına ne zaman ekleneceğini veya ne zaman kaldırılacağını belirtmenize olanak tanır. Ayrıca, <activity> özellikleri, manifest'teki davranışı ayarlamanıza olanak tanır.

Son Kullanılanlar ekranına görev ekleme

Görev eklemek için Intent sınıfının işaretlerini kullandığınızda, bir belgenin Son Kullanılanlar ekranında ne zaman ve nasıl açılacağı ya da yeniden açılacağı konusunda daha fazla kontrol sahibi olursunuz. <activity> özelliklerini kullandığınızda dokümanı her zaman yeni bir görevde açmayı veya doküman için mevcut bir görevi yeniden kullanmayı seçebilirsiniz.

Görev eklemek için Intent işaretini kullanma

Etkinliğiniz için yeni bir doküman oluşturduğunuzda, etkinliği başlatan amaçla birlikte startActivity() yöntemini çağırırsınız. Sistemin etkinliğinizi Son Kullanılanlar ekranında yeni bir görev olarak değerlendirmesi için mantıksal bir kesme eklemek üzere etkinliği başlatan Intent yönteminin addFlags() yönteminde FLAG_ACTIVITY_NEW_DOCUMENT işaretini iletin.

Yeni belgeyi oluştururken FLAG_ACTIVITY_MULTIPLE_TASK işaretini ayarlarsanız sistem, hedef etkinliği kök olarak kullanarak her zaman yeni bir görev oluşturur. Bu ayar, aynı belgenin birden fazla görevde açılmasına olanak tanır. Aşağıdaki kodda, ana etkinliğin bunu nasıl yaptığı ve yeni etkinliği composable'ınızdan nasıl başlattığı gösterilmektedir:

private fun newDocumentIntent(context: Context): Intent =
    Intent(context, NewDocumentActivity::class.java).apply {
        addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS)
        putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++)
    }

@Composable
fun CreateDocumentButton() {
    val context = LocalContext.current
    Button(
        onClick = {
            val intent = newDocumentIntent(context)
            // Add FLAG_ACTIVITY_MULTIPLE_TASK if needed based on state
            context.startActivity(intent)
        }
    ) {
        Text("Create New Document")
    }
}

Ana etkinlik yeni bir etkinlik başlattığında sistem, mevcut görevler arasında etkinliğin amaç bileşen adıyla ve amaç verileriyle eşleşen bir görev arar. Görev bulunamazsa veya amaç FLAG_ACTIVITY_MULTIPLE_TASK işaretini içeriyorsa etkinlik köküyle yeni bir görev oluşturulur.

Sistem, amacının, amaç bileşeni adı ve amaç verileriyle eşleştiği bir görev bulursa bu görevi öne çıkarır ve yeni amacı onNewIntent()'a iletir. Yeni etkinlik, amacı alır ve Son Kullanılanlar ekranında yeni bir doküman oluşturur. Bu durum aşağıdaki örnekte gösterilmiştir:

class DocumentCentricActivity : ComponentActivity() {
    private var documentState by mutableStateOf(
        DocumentState(
            count = 0,
            textResId = R.string.hello_new_document_counter
        )
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val initialCount = intent.getIntExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0)

        documentState = documentState.copy(count = initialCount)

        setContent {
            MaterialTheme {
                DocumentScreen(
                    count = documentState.count,
                    textResId = documentState.textResId
                )
            }
        }
    }

    override fun onNewIntent(newIntent: Intent) {
        super.onNewIntent(newIntent)
        // If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this Activity is reused.
        documentState = documentState.copy(
            textResId = R.string.reusing_document_counter
        )
    }

    data class DocumentState(val count: Int, @StringRes val textResId: Int)

    companion object {
        const val KEY_EXTRA_NEW_DOCUMENT_COUNTER = "KEY_EXTRA_NEW_DOCUMENT_COUNTER"
    }
}

@Composable
fun DocumentScreen(count: Int, @StringRes textResId: Int) {
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp),
        verticalArrangement = Arrangement.Center
    ) {
        // UI reacts to whichever string resource ID was passed down
        Text(text = stringResource(id = textResId))
        Spacer(modifier = Modifier.height(8.dp))
        Text(text = "Counter: $count")
    }
}

Önceki kodda, Activity, işletim sistemi düzeyindeki yönlendirmeyi (onCreate ve onNewIntent) yönetirken @Composable işlevi yalnızca sağlanan duruma göre kullanıcı arayüzünü oluşturmaktan sorumludur.

Görev eklemek için etkinlik özelliğini kullanma

Bir etkinlik, <activity> özelliği android:documentLaunchMode kullanılarak manifest dosyasında her zaman yeni bir görevde başlatılacağını da belirtebilir. Bu özelliğin dört değeri vardır. Kullanıcı uygulamayla bir doküman açtığında bu değerler aşağıdaki etkileri oluşturur:

intoExisting
Etkinlik, doküman için mevcut bir görevi yeniden kullanır. Bu, FLAG_ACTIVITY_NEW_DOCUMENT işaretinin FLAG_ACTIVITY_MULTIPLE_TASK işareti ayarlanmadan ayarlanmasıyla aynıdır. Bu durum, Görev eklemek için Intent işaretini kullanma bölümünde açıklanmıştır.
always
Etkinlik, doküman zaten açık olsa bile doküman için yeni bir görev oluşturur. Bu değeri kullanmak, hem FLAG_ACTIVITY_NEW_DOCUMENT hem de FLAG_ACTIVITY_MULTIPLE_TASK işaretlerini ayarlamakla aynıdır.
none
Bu işlemle doküman için yeni bir görev oluşturulmaz. Son Etkinlikler ekranında etkinlik varsayılan şekilde ele alınır. Uygulama için tek bir görev gösterilir. Bu görev, kullanıcının en son çağırdığı etkinlikten devam eder.
never
Bu işlemle doküman için yeni bir görev oluşturulmaz. Bu değeri ayarlamak, FLAG_ACTIVITY_NEW_DOCUMENT ve FLAG_ACTIVITY_MULTIPLE_TASK işaretlerinin davranışını geçersiz kılar. Bu ikisinden biri amaçta ayarlanmışsa ve Son Kullanılanlar ekranında uygulama için tek bir görev gösteriliyorsa, kullanıcı son olarak hangi etkinliği çağırdıysa o etkinlikten devam edilir.

Görevleri kaldırma

Varsayılan olarak, bir doküman görevi etkinliği tamamlandığında Son Kullanılanlar ekranından otomatik olarak çıkar. Bu davranışı ActivityManager.AppTask sınıfı, Intent işareti veya <activity> özelliği ile geçersiz kılabilirsiniz.

<activity> özelliğini android:excludeFromRecents true olarak ayarlayarak bir görevi Son Kullanılanlar ekranından tamamen hariç tutabilirsiniz.

<activity> özelliğini android:maxRecents bir tam sayı değerine ayarlayarak uygulamanızın Son Kullanılanlar ekranına ekleyebileceği maksimum görev sayısını belirleyebilirsiniz. Maksimum görev sayısına ulaşıldığında, en son kullanılmayan görev Son Kullanılanlar ekranından kaybolur. Varsayılan değer 16'dır ve maksimum değer 50'dir (düşük bellekli cihazlarda 25). 1'den küçük değerler geçerli değildir.

Görevleri kaldırmak için AppTask sınıfını kullanma

Son Kullanılanlar ekranında yeni bir görev oluşturan etkinlikte, finishAndRemoveTask() yöntemini çağırarak görevin ne zaman kaldırılacağını belirtebilir ve görevle ilişkili tüm etkinlikleri tamamlayabilirsiniz:

@Composable
fun RemoveTaskButton() {
    val context = LocalContext.current
    Button(
        onClick = {
            // It is good practice to remove a document from the overview stack if not needed anymore.
            (context as? Activity)?.finishAndRemoveTask()
        }
    ) {
        Text("Remove from Recents")
    }
}

Tamamlanan görevleri saklama

Etkinliği tamamlanmış olsa bile bir görevi Son Kullanılanlar ekranında tutmak istiyorsanız etkinliği başlatan intent yönteminin addFlags() yönteminde FLAG_ACTIVITY_RETAIN_IN_RECENTS işaretini iletin.

private fun newDocumentIntent() =
        Intent(this, NewDocumentActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or
                    android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS)
            putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, getAndIncrement())
        }

Aynı efekti elde etmek için <activity> özelliğini android:autoRemoveFromRecents false olarak ayarlayın. Varsayılan değer, belge etkinlikleri için true, normal etkinlikler için false'dir. Bu özelliğin kullanılması, FLAG_ACTIVITY_RETAIN_IN_RECENTS işaretini geçersiz kılar.

Son kullanılan URL'lerin paylaşımını etkinleştirme (yalnızca Pixel)

Android 12 veya sonraki sürümlerin yüklü olduğu Pixel cihazlarda kullanıcılar, son görüntülenen web içeriklerinin bağlantılarını doğrudan Son Görüntülenenler ekranından paylaşabilir. Kullanıcı, bir uygulamadaki içeriği ziyaret ettikten sonra Son Kullanılanlar ekranına kaydırıp içeriği görüntülediği uygulamayı bulabilir, ardından bağlantı düğmesine dokunarak URL'yi kopyalayabilir veya paylaşabilir.

Son görüntülenen web içeriğini paylaşmak için bağlantı içeren Son Görüntülenenler ekranı.

Herhangi bir uygulama, web kullanıcı arayüzü sağlayarak ve aşağıdaki örnekte gösterildiği gibi onProvideAssistContent()'yi geçersiz kılarak kullanıcılar için Son Kullanılanlar bağlantısını etkinleştirebilir:

class MainActivity : ComponentActivity() {

    // Track the current URL as state so the UI can update it during navigation
    private var currentWebUri by mutableStateOf("https://example.com/home")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            AppTheme {
                // Pass a lambda to your Compose UI so it can update the URL state
                // as the user navigates through your app.
                MainScreen(
                    onPageChanged = { newUrl -> currentWebUri = newUrl }
                )
            }
        }
    }

    override fun onProvideAssistContent(outContent: AssistContent) {
        super.onProvideAssistContent(outContent)

        // The system calls this when the user enters the Recents screen.
        // Provide the active URI tracked by the Compose state.
        outContent.webUri = Uri.parse(currentWebUri)
    }
}