Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

オーバービュー画面

オーバービュー画面(別名、最近使った画面、最近使ったタスクリスト、最近使ったアプリ)は、最近アクセスしたアクティビティタスクの一覧を示すシステムレベルの UI です。 ユーザーはリスト内をナビゲートして再開するタスクを選択したり、スワイプしてタスクをリストから削除したりできます。 Android 5.0(API レベル 21)のリリースでは、異なるドキュメントを持つ同一アクティビティ内の複数のインスタンスが、1 つのタスクとしてオーバービュー画面に表示される場合があります。 たとえば、Google Drive には複数の Google ドキュメントごとのタスクが表示される場合があります。 オーバービュー画面には、各ドキュメントが 1 つのタスクとして表示されます。

図 1 オーバービュー画面に 3 つの Google Drive ドキュメントが、それぞれ別のタスクとして表示されています。

通常、オーバービュー画面にタスクとアクティビティを提示する方法はシステムが定義できるよう許可し、この動作を変更する必要はありません。 ただし、アクティビティをいつ、どのようにオーバービュー画面に表示するかをアプリで決定することもできます。 ActivityManager.AppTask クラスを使ってタスクを管理でき、Intent クラスのアクティビティ フラグを使うとアプリをオーバービュー画面に追加、削除するタイミングを指定できます。 また、 <activity> 属性を使ってマニフェストで動作を設定することもできます。

オーバービュー画面にタスクを追加する

Intent クラスのフラグを使用してタスクを追加すると、ドキュメントをいつ、どのようにオーバービュー画面で開いたり、再度開いたりできるかを細かく制御できます。 <activity> 属性を使用すると、常に新しいタスクでドキュメントを開くか、ドキュメントの既存のタスクを再利用するかを選択できます。

インテント フラグを使用してタスクを追加する

アクティビティの新しいドキュメントを作成するときは、ActivityManager.AppTask クラスの startActivity() メソッドを呼び出し、アクティビティを起動するインテントを渡します。 論理的な改行を挿入して、システムがアクティビティをオーバービュー画面の新しいタスクとして扱えるようにするには、FLAG_ACTIVITY_NEW_DOCUMENT フラグを、アクティビティを起動する IntentaddFlags() メソッドに渡します。

注: FLAG_ACTIVITY_NEW_DOCUMENT フラグは、Android 5.0(API レベル 21)で廃止された FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET を置き換えるものです。

新しいドキュメントの作成時に 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 を使ってアクティビティを常に新しいタスクで起動するよう指定することもできます。 この属性には 4 つの値があり、ユーザーがアプリケーションでドキュメントを開くときに次のような効果を生みます。

"intoExisting"
アクティビティがそのドキュメントの既存のタスクを再利用します。これは、インテント フラグを使用してタスクを追加するで説明したように、FLAG_ACTIVITY_MULTIPLE_TASK フラグを設定せずに、FLAG_ACTIVITY_NEW_DOCUMENT フラグを設定した場合と同じです。
"always"
ドキュメントが既に開いている場合でも、アクティビティがドキュメントの新しいタスクを作成します。これは、FLAG_ACTIVITY_NEW_DOCUMENT フラグと FLAG_ACTIVITY_MULTIPLE_TASK フラグの両方を設定した場合と同じです。
"none”"
アクティビティはドキュメントの新しいタスクを作成しません。オーバービュー画面はデフォルトでアクティビティがタスクを作成したかのように処理し、アプリの 1 つのタスクを表示して、ユーザーが最後に呼び出したアクティビティから再開します。
"never"
アクティビティはドキュメントの新しいタスクを作成しません。この値を設定すると、FLAG_ACTIVITY_NEW_DOCUMENT フラグと FLAG_ACTIVITY_MULTIPLE_TASK フラグのいずれかが設定されている場合にその動作をオーバーライドし、オーバービュー画面にはアプリの 1 つのタスクが表示され、ユーザーが最後に呼び出したアクティビティから再開します。

注: 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 タグの使用がオーバーライドされます。

完了したタスクを保持する

アクティビティの終了後もオーバービュー画面にタスクを保持する場合は、FLAG_ACTIVITY_RETAIN_IN_RECENTS フラグを、アクティビティを起動するインテントの addFlags() メソッドに渡します。

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 フラグがオーバーライドされます。