Register now for Android Dev Summit 2019!

개요 화면

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

그림 1. 세 개의 Google Drive 문서를 각기 별도의 작업으로 표시한 개요 화면.

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

개요 화면에 작업 추가

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

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

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

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

새 문서를 생성하면서 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++;
  }
}

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

기본 액티비티가 새 액티비티를 시작하면 시스템은 기존의 작업을 검색하여 그 중 해당 액티비티에 대한 인텐트 구성 요소 이름과 인텐트 데이터와 일치하는 인텐트를 가진 작업을 찾습니다. 그러한 작업을 찾을 수 없거나 FLAG_ACTIVITY_MULTIPLE_TASK 플래그에 들어 있는 인텐트를 찾을 수 없는 경우, 해당 액티비티를 루트로 하여 새 작업이 생성됩니다. 원하는 항목을 찾으면, 시스템은 해당 작업을 포그라운드로 가지고 와 새 인텐트를 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> 특성, android:documentLaunchMode를 사용하여 항상 새 작업을 시작한다고 매니페스트에 지정할 수 있습니다. 이 특성에는 네 가지 값이 있어 사용자가 애플리케이션으로 문서를 열면 다음과 같은 효과를 발생시킵니다.

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

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

작업 제거

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

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

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

작업 제거에 AppTask 클래스 사용

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

NewDocumentActivity.java

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

참고: finishAndRemoveTask() 메서드를 사용하면 FLAG_ACTIVITY_RETAIN_IN_RECENTS 태그 사용을 재정의합니다. 이 내용은 아래에서 설명합니다.

완료된 작업 보존

작업을 개요 화면에 보존하려면(액티비티가 완료되었더라도), 액티비티를 시작하는 인텐트의 addFlags() 메서드에 있는 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> 특성 android:autoRemoveFromRecentsfalse로 설정해도 됩니다. 기본값은 문서 액티비티의 경우 true 이고, 일반 액티비티의 경우 false입니다. 이 특성을 사용하면 이전에 논한 것과 같이 FLAG_ACTIVITY_RETAIN_IN_RECENTS 플래그를 재정의하게 됩니다.