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:
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:
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_DOCUMENTişaretininFLAG_ACTIVITY_MULTIPLE_TASKiş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_DOCUMENThem deFLAG_ACTIVITY_MULTIPLE_TASKiş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_DOCUMENTveFLAG_ACTIVITY_MULTIPLE_TASKiş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.
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) } }