【Interface&navigation】提供適當的後退導航(65)


後退導航是用戶在之前訪問過的屏幕歷史中向後移動的方式。所有Android設備都爲此類導航提供了“ 後退”按鈕,因此您的應用不應向UI添加“後退”按鈕。

在幾乎所有情況下,當用戶導航您的應用程序時,系統會維護一系列活動。這允許系統在用戶按下後退按鈕時正確地向後導航。但是,在某些情況下,您的應用應手動指定Back行爲,以便提供最佳用戶體驗。

另請參閱設計後退和上導航, 任務和後臺堆棧以及 Android設計:導航。
需要您手動指定Back行爲的導航模式包括:

當用戶直接從通知,應用程序窗口小部件或導航抽屜輸入深層活動時。
用戶在片段之間導航的某些情況。
當用戶導航網頁時WebView。
以下各節介紹瞭如何在這些情況下實現正確的後退導航。

爲Deep Links合成新的Back Stack


通常,當用戶從一個活動導航到下一個活動時,系統遞增地構建後向堆棧。但是,當用戶使用深度鏈接進入應用程序並在其自己的任務中啓動活動時,您需要合成新的後備堆棧,因爲活動在新任務中運行而根本沒有任何後備堆棧。

例如,當通知將用戶帶到應用程序層次結構深處的活動時,您應該將活動添加到任務的後臺堆棧中,以便按Back返回導航應用程序層次結構而不是退出應用程序。導航設計指南中進一步描述了此模式 。

在清單中指定父活動


從Android 4.1(API級別16)開始,您可以通過android:parentActivityName在<activity>元素中指定屬性來聲明每個活動的邏輯父級。這允許系統便於導航模式,因爲它可以使用此信息確定邏輯“ 後”或“ 上”導航路徑。

如果您的應用支持Android 4.0及更低版本,請在 您的應用中添加支持庫,並在其中添加<meta-data> 元素<activity>。然後將父活動指定爲android.support.PARENT_ACTIVITY匹配android:parentActivityName屬性的值。

例如:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

通過以這種方式聲明父活動,您可以使用 NavUtilsAPI通過確定哪個活動是每個活動的適當父級來合成新的後備堆棧。

啓動活動時創建後臺堆棧

將活動添加到後臺堆棧的過程始於將用戶帶入您的應用程序的事件。也就是說startActivity(),使用 TaskStackBuilderAPI來定義應放入新後臺堆棧的每個活動,而不是調用。然後通過調用開始目標活動startActivities(),或通過調用創建適當PendingIntent的活動getPendingIntent()。

例如,當通知將用戶帶到應用程序層次結構深處的活動時,您可以使用此代碼創建PendingIntent 啓動活動並將新的後備堆棧插入目標任務:

// Intent for the activity to open when user selects the notification 
Intent detailsIntent = new Intent(this, DetailsActivity.class);

// Use TaskStackBuilder to build the back stack and get the PendingIntent 
PendingIntent pendingIntent =
        TaskStackBuilder.create(this)
                        // add all of DetailsActivity's parents to the stack, 
                        // followed by DetailsActivity itself 
                        .addNextIntentWithParentStack(detailsIntent)
                        .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(pendingIntent);
... 

結果PendingIntent不僅指定要啓動的活動(由定義detailsIntent),還指定應插入任務的後備堆棧(DetailsActivity定義的所有父項detailsIntent)。因此,當DetailsActivity開始時,按Back會 向後導航每個DetailsActivity類的父活動。
注意:爲了使addNextIntentWithParentStack() 方法起作用,您必須使用如上所述的android:parentActivityName屬性(和相應的<meta-data>元素)聲明清單文件中每個活動的邏輯父級 。

實現碎片的後退導航

在應用程序中使用片段時,單個FragmentTransaction 對象可能表示應添加到後臺堆棧的上下文更改。例如,如果要通過交換片段在手機上實現主/詳細信息流,則應確保按詳細信息屏幕上的“ 返回”按鈕可將用戶返回到主屏幕。爲此,請addToBackStack()在提交事務之前調用:

// Works with either the framework FragmentManager or the
// support package FragmentManager (getSupportFragmentManager).
getSupportFragmentManager().beginTransaction()
                           .add(detailFragment, "detail")
                           // Add this transaction to the back stack
                           .addToBackStack(null)
                           .commit();

當FragmentTransaction後臺堆棧上有對象並且用戶按下後退按鈕時,會FragmentManager從後臺堆棧中彈出最近的事務並執行相反的操作(例如,如果事務添加了片段,則刪除片段)。
注意:您不應該添加交易後堆在事務的水平導航(調整過濾器時,如)或修改內容時的外觀(如切換標籤時)。有關何時適合返回導航的詳細信息,請參閱導航設計指南。

如果應用程序更新其他用戶界面元素以反映片段的當前狀態(例如操作欄),請記住在提交事務時更新UI。除了提交事務之外,您應該在後臺堆棧更改後更新用戶界面。您可以FragmentTransaction 通過設置以下內容來監聽恢復時間FragmentManager.OnBackStackChangedListener:

getSupportFragmentManager().addOnBackStackChangedListener(
        new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                // Update your UI here.
            }
        });

實現WebViews的後退導航


如果您的應用程序的一部分包含在a中WebView,則可能適合返回遍歷瀏覽器歷史記錄。爲此,您可以覆蓋onBackPressed()並代理 WebView它是否具有歷史狀態:

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) {
        mWebView.goBack();
        return;
    }

    // Otherwise defer to system default behavior.
    super.onBackPressed();
}

將此機制與高度動態的網頁結合使用時要小心,這些網頁可能會增長很長的歷史。生成大量歷史記錄的頁面(例如頻繁更改文檔哈希值的頁面)可能會使用戶退出您的活動變得乏味。

有關使用的更多信息WebView,請閱讀在WebView中構建Web應用程序。

聯繫我

QQ:94297366
微信打賞:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公衆號推薦:

【Interface&navigation】提供適當的後退導航(65)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章