最近の画面

履歴画面(概要画面とも呼ばれる)、最近のタスク システムレベルの UI です。最近アクセスしたアプリを アクティビティタスクなどです。 ユーザーはリスト内を移動し、目的のタスクを選択して タスクの再開や削除ができます。

履歴画面はドキュメント中心の model - Android 5.0(API)で導入 あります。この場合、複数のインスタンスが 異なるドキュメントを含む同じアクティビティを、 履歴画面たとえば Google ドライブには、 いくつか見ていきましょう。各ドキュメントは [履歴] タブにタスクとして表示される screen:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">をご覧ください。
2 つの Google ドライブが表示されている [履歴] 画面 それぞれ個別のタスクとして表されます。

もう一つの一般的な例は、ユーザーがブラウザを使用していて、 共有 >Gmail。Gmail アプリの [作成] 画面が表示されます。[ [最近] ボタンをクリックすると、Chrome と Gmail が別々に実行されていることがわかります。 タスク:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">をご覧ください。
Chrome と Gmail が表示された [最近] 画面 個別のタスクとして実行されます

通常、タスクやアクティビティをどのように定義するかは、 [履歴]画面に表示されます変更する必要はありません。 確認します。ただし、アプリがアクティビティを表示する方法とタイミングを決定できます。 履歴画面

ActivityManager.AppTask クラスを使用すると、タスクと、リソースのアクティビティ フラグを管理できます。 Intent クラスを使用すると、 履歴画面でアクティビティを追加または削除する。また、 <activity> 属性を使用すると、 指定することもできます。

履歴画面にタスクを追加する

Intent クラスのフラグを使用して以下を行います。 タスクを追加すると、ドキュメントを開いたり、開いたりするタイミングや方法を 履歴画面で再度開いています。 <activity> 属性を使用すると、 常に新しいタスクでドキュメントを開くか、既存のタスクを再利用するかを選択する 設定されます。

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

アクティビティの新しいドキュメントを作成するときに、 startActivity() メソッドを呼び出し、アクティビティを起動するインテントを渡します。論理演算子を ユーザーのアクティビティを [履歴] セクションで新しいタスクとして扱います。 渡すには、 FLAG_ACTIVITY_NEW_DOCUMENT addFlags() のフラグ 次の呼び出しを行う Intent のメソッド できます。

FLAG_ACTIVITY_MULTIPLE_TASK を設定した場合 新しいドキュメントの作成時にフラグを設定すると、システムは常に ターゲット アクティビティをルートとして指定します。この設定により、同じドキュメントを 複数のタスクで開かれています。次のコードは、メイン 次のアクティビティを行います。

Kotlin

fun createNewDocument(view: View) {
    val newDocumentIntent = newDocumentIntent()
    if (useMultipleTasks) {
        newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
    }
    startActivity(newDocumentIntent)
}

private fun newDocumentIntent(): Intent =
        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, documentCounter++)
        }

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 = checkbox.isChecked();
      final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
      newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
      newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++);
      return newDocumentIntent;
  }

}

メイン アクティビティが新しいアクティビティを起動すると、システムは あるタスクについて、そのインテントがインテント コンポーネント名と そのアクティビティのインテント データが返されます。タスクが見つからない場合、または含まれているインテントの場合 FLAG_ACTIVITY_MULTIPLE_TASK フラグを設定すると、アクティビティをルートとして新しいタスクが作成されます。

システムがインテントのコンポーネント名と一致するインテントを持つタスクを見つけた場合に、 そのタスクを前面に出し、新しいインテントを onNewIntent()。 新しいアクティビティがインテントを取得し、履歴に新しいドキュメントを作成する クリックします。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_new_document)
    documentCount = intent
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0)
    documentCounterTextView = findViewById(R.id.hello_new_document_text_view)
    setDocumentCounterText(R.string.hello_new_document_counter)
}

override fun onNewIntent(newIntent: Intent) {
    super.onNewIntent(newIntent)
    /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this Activity
    will be reused. */
    setDocumentCounterText(R.string.reusing_document_counter)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_document);
    documentCount = getIntent()
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
    documentCounterTextView = (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
アクティビティがドキュメント用に既存のタスクを再利用します。これは、Terraform でインフラストラクチャを FLAG_ACTIVITY_NEW_DOCUMENT フラグを設定せずに FLAG_ACTIVITY_MULTIPLE_TASK 使用する必要があります。詳しくは、 インテント フラグを使用してタスクを追加するセクション
always
ドキュメントが新しいドキュメントであっても、アクティビティはドキュメント用に新しいタスクを作成します。 すでに開いています。この値を使用することは、 FLAG_ACTIVITY_NEW_DOCUMENT フラグと FLAG_ACTIVITY_MULTIPLE_TASK フラグ。
none
アクティビティは、ドキュメント用に新しいタスクを作成しません。最近 screen では、アクティビティはデフォルトとして処理されます。1 つのタスクが表示されます。 ユーザーが最後に呼び出したアクティビティから再開します。
never
アクティビティは、ドキュメント用に新しいタスクを作成しません。この値を設定する 動作をオーバーライド FLAG_ACTIVITY_NEW_DOCUMENT および FLAG_ACTIVITY_MULTIPLE_TASK 使用できます。インテントと履歴画面でこのいずれかが設定されている場合 アプリのタスクが 1 つ表示され、 ユーザーが最後に呼び出した場所です。
で確認できます。

タスクを削除する

デフォルトでは、ドキュメント タスクは履歴画面から自動的に終了します 呼び出すことができます。この動作をオーバーライドするには、 ActivityManager.AppTask クラスを Intent フラグ、または <activity> 属性。

[履歴] 画面からタスクをいつでも完全に除外するには、 <activity> 属性 android:excludeFromRecents true に送信。

スペースに含めることができるタスクの最大数を [履歴] 画面を変更するには、 <activity> 属性 android:maxRecents を 整数値。タスクの最大数に達すると、 最も長い間使われていないタスクが履歴画面に表示されなくなります。デフォルトは 16 です 最大値は 50(メモリが少ないデバイスでは 25)です。低い値 無効です。

AppTask クラスを使用してタスクを削除する

履歴画面で新しいタスクを作成するアクティビティでは、次のことができます。 タスクを削除してそれに関連するすべてのアクティビティを終了するタイミングを指定する 呼び出し finishAndRemoveTask() メソッド:

Kotlin

fun onRemoveFromOverview(view: View) {
    // It is good pratice to remove a document from the overview stack if not needed anymore.
    finishAndRemoveTask()
}

Java

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

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

アクティビティが履歴に残っていても、履歴画面にタスクを残す場合 完了したら、 FLAG_ACTIVITY_RETAIN_IN_RECENTS [ 次のメソッドの addFlags() メソッド: アクティビティを起動するインテントです。

Kotlin

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())
        }

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, getAndIncrement());
    return newDocumentIntent;
}

同じ効果を得るには、 <activity> 属性 android:autoRemoveFromRecents false まで。ドキュメント アクティビティのデフォルト値は true、ドキュメント アクティビティの場合は false です。 実施できます。この属性を使用すると、 FLAG_ACTIVITY_RETAIN_IN_RECENTS フラグ。

最近の URL の共有を有効にする(Google Pixel のみ)

Android 12 以降を搭載した Google Pixel デバイスでは、リンクを共有できます 最近表示したウェブ コンテンツに [履歴] 画面から直接アクセスできます。訪問後 ユーザーは、履歴画面にスワイプしてアプリを見つけることができます。 次に、リンクボタンをタップしてコンテンツをコピーまたは共有します。 URL を入力します。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">をご覧ください。
共有リンクが表示された [最近] 画面 最近表示したウェブコンテンツなどです

どのようなアプリでも、ウェブ UI を提供してユーザーの履歴リンクを有効にできます。 オーバーライド onProvideAssistContent() 次のように指定します。

Kotlin

class MainActivity : AppCompatActivity() {
    protected fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun onProvideAssistContent(outContent: AssistContent) {
        super.onProvideAssistContent(outContent)
        outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage"))
    }
}

Java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onProvideAssistContent(AssistContent outContent) {
        super.onProvideAssistContent(outContent);

        outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage"));
    }
}