page.title=개요 화면 page.tags="recents","overview" @jd:body

이 문서의 내용

  1. 개요 화면에 작업 추가
    1. 작업 추가에 인텐트 플래그 사용
    2. 작업 추가에 액티비티 특성 사용
  2. 작업 제거
    1. 작업 제거에 AppTask 클래스 사용
    2. 완료된 작업 보존

Key 클래스

  1. {@link android.app.ActivityManager.AppTask}
  2. {@link android.content.Intent}

샘플 코드

  1. 문서 중심 앱

개요 화면(다른 말로 최근 사용 화면, 최근 작업 목록 또는 최근 앱이라고도 함)은 시스템 수준 UI로, 최근에 액세스한 액티비티작업을 목록으로 나열한 것입니다. 사용자는 목록을 가로질러 이동하며 작업을 선택해서 재개할 수도 있고, 아니면 목록에서 한 작업을 스와이프하여 밀어내어 목록에서 제거할 수도 있습니다. Android 5.0 릴리스(API 레벨 21)의 경우, 같은 액티비티의 여러 인스턴스에 각기 다른 문서가 담겨 있는 경우 이들이 개요 화면에 작업으로 나타날 수 있습니다. 예를 들어 Google Drive에 여러 개의 Google 문서 각각에 대한 작업이 있을 수 있습니다. 각 문서는 개요 화면에 하나의 작업으로 나타납니다.

그림 1. 세 개의 Google Drive 문서가 각기 별도의 작업을 나타내는 모습을 표시한 개요 화면입니다.

보통은 개요 화면에 작업과 액티비티가 어떻게 표현될지는 시스템이 정의하도록 두어야 합니다. 이 행동을 개발자가 수정할 필요도 없습니다. 하지만, 개요 화면에 액티비티가 언제, 어떻게 나타날지는 앱이 결정할 수 있습니다. {@link android.app.ActivityManager.AppTask} 클래스를 사용하면 작업을 관리할 수 있게 해주고, {@link android.content.Intent} 클래스의 액티비티 플래그를 사용하면 개요 화면에서 액티비티가 추가되거나 제거되는 시점을 지정할 수 있습니다. 또한, <activity> 특성을 사용하면 매니페스트에서의 동작을 설정할 수 있습니다.

개요 화면에 작업 추가

{@link android.content.Intent} 클래스의 플래그를 사용하여 작업을 추가하면 개요 화면에서 문서가 열리거나 다시 열리는 시점과 방법을 보다 철저히 통제할 수 있습니다. <activity> 특성을 사용하는 경우, 문서를 항상 새 작업에서 여는 방법과 기존 작업을 해당 문서에 다시 사용하는 방법 중에서 선택할 수 있습니다.

작업 추가에 인텐트 플래그 사용

액티비티를 위해 새 문서를 생성하는 경우, {@link android.app.ActivityManager.AppTask} 클래스의 {@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()} 메서드를 호출하고, 이것을 액티비티를 시작하는 인텐트에 전달하면 됩니다. 논리적인 중단을 삽입하여 시스템이 개요 화면에서 액티비티를 새 작업으로 처리하도록 하려면, {@link android.content.Intent}의 {@link android.content.Intent#addFlags(int) addFlags()} 메서드에 있는 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 플래그를 전달하여 액티비티를 시작하도록 합니다.

참고: {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 플래그가 {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET} 플래그를 대체합니다. 이것은 Android 5.0(API 레벨 21)부터 사용이 중단되었습니다.

새 문서를 생성하면서 {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} 플래그를 설정하는 경우, 시스템은 항상 대상 액티비티를 루트로 하여 새 작업을 만듭니다. 이렇게 설정하면 같은 문서를 하나 이상의 작업에서 열 수 있습니다. 다음 코드는 기본 액티비티가 이 작업을 수행하는 방법을 보여줍니다.

DocumentCentricActivity.java

public void createNewDocument(View view) {
      final Intent newDocumentIntent = newDocumentIntent();
      if (useMultipleTasks) {
          newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
      }
      startActivity(newDocumentIntent);
  }

  private Intent newDocumentIntent() {
      boolean useMultipleTasks = mCheckbox.isChecked();
      final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
      newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
      newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
      return newDocumentIntent;
  }

  private static int incrementAndGet() {
      Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
      return mDocumentCounter++;
  }
}

참고: {@code FLAG_ACTIVITY_NEW_DOCUMENT} 플래그로 시작된 액티비티의 경우, 반드시 매니페스트에 {@code android:launchMode="standard"} 특성 값(기본)이 설정되어 있어야 합니다.

기본 액티비티가 새 액티비티를 시작하면 시스템은 기존의 작업을 검색하여 그 중 해당 액티비티에 대한 인텐트 구성 요소 이름과 인텐트 데이터와 일치하는 인텐트를 가진 작업을 찾습니다. 그러한 작업을 찾을 수 없거나 {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} 플래그에 들어 있는 인텐트를 찾을 수 없는 경우, 해당 액티비티를 루트로 하여 새 작업이 생성됩니다. 원하는 항목을 찾으면, 시스템은 해당 작업을 전경으로 가지고 와 새 인텐트를 {@link android.app.Activity#onNewIntent onNewIntent()}에 전달합니다. 새 액티비티가 인텐트를 받아 개요 화면에서 새 문서를 생성하며, 이는 다음 예시에 나타낸 것과 같습니다.

NewDocumentActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_document);
    mDocumentCount = getIntent()
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
    mDocumentCounterTextView = (TextView) findViewById(
            R.id.hello_new_document_text_view);
    setDocumentCounterText(R.string.hello_new_document_counter);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity
    is reused to create a new document.
     */
    setDocumentCounterText(R.string.reusing_document_counter);
}

작업 추가에 액티비티 특성 사용

액티비티는 자신의 매니페스트에 새 작업을 시작할 때는 항상 <activity> 특성, {@code android:documentLaunchMode}를 사용한다고 나타낼 수도 있습니다. 이 특성에는 네 가지 값이 있어 사용자가 애플리케이션으로 문서를 열면 다음과 같은 효과를 발생시킵니다.

"{@code intoExisting}"
액티비티가 문서에 대해 기존의 작업을 재사용합니다. 이것은 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 플래그를 설정할 때 {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} 플래그 없이 설정하는 것과 같습니다. 이는 위의 작업 추가에 인텐트 플래그 사용에서 설명한 것과 같습니다.
"{@code always}"
액티비티가 문서에 대해 새 작업을 생성하며, 이는 문서가 이미 열려 있는 경우라도 마찬가지입니다. 이 값을 사용하는 것은 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 및 {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} 플래그를 둘 다 설정하는 것과 같습니다.
"{@code none”}"
액티비티가 문서에 대해 새 작업을 생성하지 않습니다. 개요 화면은 액티비티를 기본 상태에서와 같이 다룹니다. 즉 앱에 대한 하나의 작업을 표시하며, 이때 사용자가 마지막으로 호출한 작업이 무엇이든 관계 없이 그 작업에서부터 재개합니다.
"{@code never}"
액티비티가 문서에 대해 새 작업을 생성하지 않습니다. 이 값을 설정하면 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 및 {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} 플래그의 행동을 재정의합니다(이들 중 하나가 인텐트에서 설정되어 있는 경우). 개요 화면은 앱에 대한 하나의 작업을 표시하고, 이것이 사용자가 마지막으로 호출한 액티비티가 무엇이든 그것부터 재개합니다.

참고: {@code none} 및 {@code never}를 제외한 다른 값의 경우, 액티비티를 {@code launchMode="standard"}로 정의해야 합니다. 이 특성을 지정하지 않으면 {@code documentLaunchMode="none"}이 사용됩니다.

작업 제거

기본적으로 문서 작업은 해당되는 액티비티가 완료되면 자동으로 개요 화면에서 제거됩니다. 이 행동을 재정의하려면 {@link android.app.ActivityManager.AppTask} 클래스를 사용합니다. 이때 {@link android.content.Intent} 플래그 또는 <activity> 특성을 함께 사용하십시오.

개요 화면에서 작업을 완전히 제외하려면 언제든 <activity> 특성, {@code android:excludeFromRecents}를 {@code true}로 설정합니다.

개요 화면에서 앱이 포함할 수 있는 작업의 최대 개수를 설정하려면 <activity> 특성 {@code android:maxRecents} 를 정수 값으로 설정합니다. 기본은 16개입니다. 작업의 최대 대수에 도달하면 가장 예전에 사용된 작업이 개요 화면에서 제거됩니다. {@code android:maxRecents} 최대값은 50입니다(메모리 용량이 적은 기기에서는 25). 1 미만의 값은 유효하지 않습니다.

작업 제거에 AppTask 클래스 사용

개요 화면에서 새 작업을 생성하는 액티비티에서는 작업을 언제 제거할 것인지와 그와 관련된 모든 액티비티를 언제 완료할 것인지 지정할 수 있습니다. {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} 메서드를 호출하면 됩니다.

NewDocumentActivity.java

public void onRemoveFromRecents(View view) {
    // The document is no longer needed; remove its task.
    finishAndRemoveTask();
}

참고: {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} 메서드를 사용하면 {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} 태그 사용을 재정의합니다. 이 내용은 아래에서 설명합니다.

완료된 작업 보존

작업을 개요 화면에 보존하려면(액티비티가 완료되었더라도), 액티비티를 시작하는 인텐트의 {@link android.content.Intent#addFlags(int) addFlags()} 메서드에 있는 {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} 플래그를 전달합니다.

DocumentCentricActivity.java

private Intent newDocumentIntent() {
    final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
    newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
      android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
    newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
    return newDocumentIntent;
}

같은 효과를 얻기 위해 <activity> 특성 {@code android:autoRemoveFromRecents}를 {@code false}로 설정해도 됩니다. 기본 값은 문서 액티비티의 경우 {@code true} 이고, 일반 액티비티의 경우 {@code false}입니다. 이 특성을 사용하면 이전에 논한 것과 같이 {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} 플래그를 재정의하게 됩니다.