Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Activity之概覽屏幕(Overview Screen),activityoverview

Activity之概覽屏幕(Overview Screen),activityoverview

編輯:關於android開發

Activity之概覽屏幕(Overview Screen),activityoverview


概覽屏幕

概覽屏幕(也稱為最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 UI,其中列出了最近訪問過的 Activity 和任務。 用戶可以浏覽該列表並選擇要恢復的任務,也可以通過滑動清除任務將其從列表中移除。 對於 Android 5.0 版本(API 級別 21),包含不同文檔的同一 Activity 的多個實例可能會以任務的形式顯示在概覽屏幕中。前邊是文檔中說的,比較虛,下面來一個gif你就懂啦。

 可以看到左邊的任務視圖是兩個重疊在一塊的,這也就是概覽屏幕。

通常,您應該允許系統定義任務和 Activity 在概覽屏幕中的顯示方法,並且無需修改此行為。不過,應用可以確定 Activity 在概覽屏幕中的顯示方式和時間。 您可以使用 ActivityManager.AppTask 類來管理任務,使用 Intent 類的 Activity 標志來指定某 Activity 添加到概覽屏幕或從中移除的時間。 此外,您也可以使用 <activity> 屬性在清單文件中設置該行為。

將任務添加到概覽屏幕


通過使用 Intent 類的標志添加任務,您可以更好地控制某文檔在概覽屏幕中打開或重新打開的時間和方式。 使用 <activity> 屬性時,您可以選擇始終在新任務中打開文檔,或選擇對文檔重復使用現有任務。

使用 Intent 標志添加任務

為 Activity 創建新文檔時,可調用 ActivityManager.AppTask 類的 startActivity() 方法,以向其傳遞啟動 Activity 的 Intent。 要插入邏輯換行符以便系統將 Activity 視為新任務顯示在概覽屏幕中,可在啟動 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 作為根創建新任務。此設置允許同一文檔在多個任務中打開。以下代碼演示了主 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 與 Activity 的 Intent 組件名稱和 Intent 數據相匹配。 如果未找到任務或者 Intent 包含 FLAG_ACTIVITY_MULTIPLE_TASK 標志,則會以該 Activity 作為其根創建新任務。如果找到的話,則會將該任務轉到前台並將新 Intent 傳遞給 onNewIntent()。新 Activity 將獲得 Intent 並在概覽屏幕中創建新文檔,如下例所示:

@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_MULTIPLE_TASK 標志、但設置 FLAG_ACTIVITY_NEW_DOCUMENT 標志所產生的效果相同,如上文的使用 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 標志的行為(如果在 Intent 中設置了其中一個標志),並且概覽屏幕將為應用顯示單個任務,該任務將從用戶上次調用的任意 Activity 開始繼續執行。

注:對於除 none 和 never 以外的值,必須使用 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() 方法指定何時移除該任務以及結束所有與之相關的 Activity。

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 標志。

demo的代碼

1.DocumentCentricActivity.java:

package com.example.documentcentricapps;

import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;

public class DocumentCentricActivity extends Activity {

    private final static String TAG = "DocumentCentricActivity";

    public final static String KEY_EXTRA_NEW_DOCUMENT_COUNTER = "KEY_EXTRA_NEW_DOCUMENT_COUNTER";

    private static int mDocumentCounter = 0;

    private CheckBox mCheckbox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_document_centric_main);
        mCheckbox = (CheckBox) findViewById(R.id.multiple_task_checkbox);
    }

    @Override
    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onPostCreate(savedInstanceState, persistentState);
        // Restore state from PersistableBundle
        if (persistentState != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mDocumentCounter = persistentState.getInt(KEY_EXTRA_NEW_DOCUMENT_COUNTER);
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        /*
        To maintain activity state across reboots the system saves and restore critical information for
        all tasks and their activities. Information known by the system includes the activity stack order,
        each task’s thumbnails and each activity’s and task's Intents. For Information that cannot be retained
        because they contain Bundles which can’t be persisted a new constrained version of Bundle,
        PersistableBundle is added. PersistableBundle can store only basic data types. To use it
        in your Activities you must declare the new activity:persistableMode attribute in the manifest.
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            outPersistentState.putInt(KEY_EXTRA_NEW_DOCUMENT_COUNTER, mDocumentCounter);
        }
        super.onSaveInstanceState(outState, outPersistentState);
    }

    public void createNewDocument(View view) {
        boolean useMultipleTasks = mCheckbox.isChecked();
        final Intent newDocumentIntent = newDocumentIntent();
        if (useMultipleTasks) {
            /*
            When {@linkIntent#FLAG_ACTIVITY_NEW_DOCUMENT} is used with {@link Intent#FLAG_ACTIVITY_MULTIPLE_TASK}
            the system will always create a new task with the target activity as the root. This allows the same
            document to be opened in more than one task.
             */
            newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
        }
        startActivity(newDocumentIntent);
    }


    /**
     * Returns an new {@link Intent} to start {@link NewDocumentActivity} as a new document in
     * overview menu.
     *
     * To start a new document task {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT} must be used. The
     * system will search through existing tasks for one whose Intent matches the Intent component
     * name and the Intent data. If it finds one then that task will be brought to the front and the
     * new Intent will be passed to onNewIntent().
     *
     * Activities launched with the NEW_DOCUMENT flag must be created with launchMode="standard".
     */
    private Intent newDocumentIntent() {
        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++;
    }

}

 2.NewDocumentActivity.java:

public class NewDocumentActivity extends Activity {

    private TextView mDocumentCounterTextView;
    private int mDocumentCount;

    @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 {@link Intent#FLAG_ACTIVITY_MULTIPLE_TASK} has not been used this Activity
        will be reused.
         */
        setDocumentCounterText(R.string.reusing_document_counter);
    }

    public void onRemoveFromOverview(View view) {
        // It is good pratice to remove a document from the overview stack if not needed anymore.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        }
    }

    public void setDocumentCounterText(int resId) {
        mDocumentCounterTextView
                .setText(String.format(getString(resId), String.valueOf(mDocumentCount)));
    }

}

 上邊只是主要的代碼,完整的demo下載:http://download.csdn.net/detail/jycboy/9715602

 

轉發請注明出處:http://www.cnblogs.com/jycboy/p/overview_screen.html

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved