Activity之概覽屏幕(Overview Screen)

来源:http://www.cnblogs.com/jycboy/archive/2016/12/19/overview_screen.html
-Advertisement-
Play Games

概覽屏幕 概覽屏幕 概覽屏幕(也稱為最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 UI,其中列出了最近訪問過的 Activity 和任務。 用戶可以瀏覽該列表並選擇要恢復的任務,也可以通過滑動清除任務將其從列表中移除。 對於 Android 5.0 版本(API 級別 21),包含不同 ...


概覽屏幕

概覽屏幕(也稱為最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 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

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天拉同事最新的代碼,編譯時老是報如下錯誤: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the following locations: file:/D:/software/android-studio ...
  • 轉載請標明出處:http://www.cnblogs.com/zhaoyanjun/p/6202369.html 本文出自 "【趙彥軍的博客】" 在Android Studio項目裡面有個local.properties文件,這個文件可以放一些系統配置。比如:sdk路徑、ndk路徑。 當然我們也可以 ...
  • 最近為了滿足蘋果的 https 要求, 經過努力終於寫出了方法 驗證 SSL 證書是否滿足 ATS 要求 nscurl --ats-diagnostics --verbose https://你的功能變數名稱 PASS 符合要求 輸出滿足 ATS 的證書 openssl s_client -connect ...
  • 首先想強調一下“語音識別”四個字字面意義上的需求:用戶說話然後馬上把用戶說的話轉成文字顯示!,這才是開發者真正需要的功能。 做需求之前其實是先谷歌百度一下看有沒有造好的輪子直接用,結果真的很呵呵,都是標著這個庫深入學習的標題,裡面調用一下api從URL里取出一個本地語音文件進行識別,這就沒了? 最基 ...
  • 一、SharedPreferences保存數據介紹 如果有想要保存的相對較小鍵值集合,應使用SharedPreferences API。SharedPreferences對象指向包含鍵值對的文件並提供讀寫這些文件的簡單方法。每個SharedPreferences文件由框架進行管理並且可以專用或共用。 ...
  • 微信小程式提交審核需要選擇資質服務範圍,如果服務範圍不對,審核會不通過, 開發小程式之前,最好先查詢所開發小程式的資質範圍,否則無法通過微信審核。 小程式的資質範圍查詢地址,數據同步微信官方 https://weixin.hotapp.cn/weixinmob ...
  • CocoaPods是什麼? 當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,“子子孫孫無窮盡也”,這也許是比較特殊的情況。總之小編的意思就是,手動一個個 ...
  • 多線程下載就是將同一個網路上的原始文件根據線程個數分成均等份,然後每個單獨的線程下載對應的一部分 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...