1. 程式人生 > >Android官方文件—APP元件(Activities)(Overview Screen)

Android官方文件—APP元件(Activities)(Overview Screen)

螢幕概覽

概述螢幕(也稱為最近螢幕,最近任務列表或最近的應用程式)是一個系統級UI,列出最近訪問的Activity和任務。使用者可以瀏覽列表並選擇要恢復的任務,或者使用者可以通過將其擦除來從列表中刪除任務。使用Android 5.0版本(API級別21)時,包含不同文件的同一Activity的多個例項可能在概覽螢幕中顯示為任務。例如,Google雲端硬碟可能會為多個Google文件中的每個文件執行任務。每個文件在概覽螢幕中顯示為任務。

圖1.概覽螢幕顯示三個Google Drive文件,每個文件都表示為單獨的任務。

 通常,您應該允許系統定義在概覽螢幕中表示任務和Activity的方式,而您不需要修改此行為。您的應用也可以指定活動在概覽螢幕中的顯示方式和時間。 ActivityManager.AppTask類允許您管理任務,Intent類的活動標誌允許您指定在概覽螢幕中新增或刪除Activity的時間。此外,在清單檔案中使用<activity>屬性可以設定一些的行為。

將任務新增到概述螢幕

 使用Intent類的標誌新增任務可以更好地控制在概覽螢幕中何時以及如何開啟或重新開啟文件。當您使用<activity>時您可以在始終在新任務中開啟文件或重複使用文件的現有任務之間進行選擇。

使用Intent標誌新增任務

為Activity建立新文件時,可以呼叫ActivityManager.AppTask類的startActivity()方法,並向其傳遞啟動Activity的意圖。要插入邏輯中斷以便系統將您的活動視為概覽螢幕中的新任務,請在啟動活動的Intent的addFlags()方法中傳遞FLAG_ACTIVITY_NEW_DOCUMENT標誌。

注意:FLAG_ACTIVITY_NEW_DOCUMENT標誌替換了FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET標誌,該標誌自Android 5.0(API級別21)起不推薦使用。

如果在建立新文件時設定FLAG_ACTIVITY_MULTIPLE_TASK標誌,則系統始終會建立一個以目標活動為根的新任務。此設定允許在多個任務中開啟同一文件。以下程式碼演示了主要Activity如何執行此操作:

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標誌啟動的Activity必須在清單中設定android:launchMode =“standard”屬性值(預設值)。

當主Activity啟動新Activity時,系統會在現有任務中搜索其意圖與意圖元件名稱和活動的Intent資料匹配的任務。如果未找到任務,或者intent包含FLAG_ACTIVITY_MULTIPLE_TASK標誌,則將建立一個以該Activity為根的新任務。如果找到一個,它會將該任務帶到前臺並將新意圖傳遞給onNewIntent()。新Activity獲取意圖並在概覽螢幕中建立新文件,如以下示例所示:

@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屬性新增任務

Activity還可以在其清單中指定<activity> android:documentLaunchMode屬性來設定始終啟動到新任務中。此屬性有四個值,當用戶使用應用程式開啟文件時,這些值會產生以下效果:

"intoExisting"

該Activity重用該文件的現有任務。這與設定FLAG_ACTIVITY_NEW_DOCUMENT標誌而不設定FLAG_ACTIVITY_MULTIPLE_TASK標誌相同,如上面使用Intent標誌新增任務中所述。

"always"

即使文件已經開啟,Activity也會為文件建立新任務。使用此值與設定FLAG_ACTIVITY_NEW_DOCUMENT和FLAG_ACTIVITY_MULTIPLE_TASK標誌相同。

"none"

Activity不會為文件建立新任務。概述螢幕預設處理Activity:它顯示應用程式的單個任務,該任務從使用者上次呼叫的任何Activity中恢復。

"never"

Activity不會為文件建立新任務。則設定此值將覆蓋FLAG_ACTIVITY_NEW_DOCUMENT和FLAG_ACTIVITY_MULTIPLE_TASK標誌的行為,並且概述螢幕將顯示應用程式的單個任務,該任務將從使用者上次呼叫的任何活動中恢復。

注意:對於nevernone以外的值,必須使用launchMode =“standard”定義Activity。如果未指定此屬性,則相當於使用documentLaunchMode =“none”。

刪除任務

預設情況下,文件任務在其Activity完成時會自動從概覽螢幕中刪除。您可以使用ActivityManager.AppTask類,使用Intent標誌或使用<activity>的屬性覆蓋此行為。

您可以通過設定<activity>完全從概覽螢幕中排除任務。屬性,android:excludeFromRecents為true。

您可以通過<activity>屬性來設定應用可以在概覽螢幕中包含的最大任務數。android:maxRecents為整數值。預設值為16.達到最大任務數時,將從概覽螢幕中刪除最近最少使用的任務。 android:maxRecents最大值為50(低記憶體裝置上為25);小於1的值無效。

使用AppTask類刪除任務

在概述螢幕中建立新任務的Activity中,您可以通過呼叫finishAndRemoveTask()方法指定何時刪除任務並finish與其關聯的所有Activity。

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

注意:使用finishAndRemoveTask()方法會覆蓋使用FLAG_ACTIVITY_RETAIN_IN_RECENTS標記,如下所述。

保留完成的任務

如果要在概覽螢幕中保留任務,即使其Activity已finished,要在啟動Activity的Intent的addFlags()方法中傳遞FLAG_ACTIVITY_RETAIN_IN_RECENTS標誌。

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:autoRemoveFromRecents為false。文件Activity的預設值為true,常規Activity的預設值為false。使用此屬性會覆蓋之前討論的FLAG_ACTIVITY_RETAIN_IN_RECENTS標誌。