page.title=Back ボタンと Up ボタンを使用したナビゲーション
page.tags="navigation","activity","task","up navigation","back navigation"
page.image=/design/media/navigation_between_siblings_gmail.png
@jd:body

<a class="notice-developers" href="{@docRoot}training/implementing-navigation/index.html">
  <div>
    <h3>デベロッパー ドキュメント</h3>
    <p>効果的なナビゲーションの実装</p>
  </div>
</a>

<p itemprop="description">使いやすいアプリでは、ナビゲーションに統一性があります。統一性がなく、動作の読めないアプリほど使いにくいものはありません。
Android 3.0 では、全体的なナビゲーション動作が大きく変わりました。
Back ボタンと Up ボタンのガイドラインに従えば、ユーザーにとってわかりやすく、信頼できるナビゲーションを実装できます。
</p>
<p>Android 2.3 以前のアプリのナビゲーションはシステムの <em>Back</em> ボタンで行っていました。
Android 3.0 よりアクションバーが導入され、第 2 のナビゲーション メカニズムとして <em>Up</em> ボタンが登場しました。このボタンはアプリアイコンと左向きのキャレットで表されています。
</p>

<img src="{@docRoot}design/media/navigation_with_back_and_up.png">

<h2 id="up-vs-back">Up ボタンと Back ボタンの違い</h2>

<p>Up ボタンは、画面間の階層関係に基づいてアプリ内を移動するために使います。
たとえば、画面 A でアイテムのリストを表示し、アイテムを選択すると(そのアイテムの詳細を表示する)画面 B に移動する場合、画面 B には画面 A に戻るための Up ボタンが必要です。

</p>
<p>画面がアプリのトップ レベル(アプリのホーム)であれば、Up ボタンを表示する必要はありません。
</p>

<p>システムの Back ボタンは、最近使用した画面をさかのぼって順番に移動する場合に使用します。
通常、このナビゲーションはアプリの階層ではなく、画面を表示した順番に基づいています。
</p>

<p>前に表示していた画面が現在の画面の親階層となる場合は、Back ボタンを押すと Up ボタンを押したときと同じ結果になります &mdash; これは一般的な動作です。

ただし、Up ボタンではユーザーの移動がアプリ内に限られるのに対して、Back ボタンではホーム画面や、別のアプリにも戻れます。
</p>

<img src="{@docRoot}design/media/navigation_up_vs_back_gmail.png">

<p>Back ボタンは、画面間を直接ナビゲーションするだけでなく、次のような動作にも対応しています。
</p>
<ul>
<li>フローティング ウィンドウ(ダイアログ、ポップアップ)を閉じる</li>
<li>コンテキスト アクションバーを閉じて、選択したアイテムのハイライト表示を解除する</li>
<li>画面上のキーボード(IME)を非表示にする</li>
</ul>
<h2 id="within-app">アプリ内でのナビゲーション</h2>

<h4>エントリ ポイントが複数ある画面へのナビゲート</h4>
<p>設定画面のように、アプリ内の他のどの画面からでもアクセスでき、アプリ階層内に定位置がなく、複数のエントリ ポイントからアクセスできる画面もあります。

この場合、Up ボタンは Back ボタンと同じように元の画面に戻ります。
</p>
<h4>画面内でのビューの変更</h4>
<p>画面のビュー オプションを変更しても Up ボタンと Back ボタンの動作は変わりません。画面はアプリの階層内の同じ位置にあり、新しいナビゲーション履歴は作成されません。
</p>
<p>このようなビューの変更には次のようなものがあります。</p>
<ul>
<li>タブや左右のスワイプを使ったビューの切り替え</li>
<li>ドロップダウン(折りたたみタブ)を使ったビューの切り替え</li>
<li>リストへのフィルタの適用</li>
<li>リストの並び替え</li>
<li>表示方法の変更(ズームなど)</li>
</ul>
<h4>兄弟画面間のナビゲーション</h4>
<p>アプリでアイテムのリストから選択して、あるアイテムの詳細画面に移動するとき、そのアイテムからリストの前後にある別のアイテムにナビゲーションできるようにすると使いやすくなる場合があります。

たとえば、Gmail で左か右にスワイプすると、同じ受信トレイのある会話から新しい会話や古い会話に簡単に移動できます。
画面内でビューを変更する場合と同様に、このナビゲーションでも Up ボタンまたは Back ボタンの動作は変わりません。
</p>

<img src="{@docRoot}design/media/navigation_between_siblings_gmail.png">

<p>ただし、参照リストで結び付けられていない関連詳細ビュー間をブラウジングする場合は例外です。たとえば Play Store で同じデベロッパーのアプリや同じアーティストのアルバム間をブラウジングする場合です。

この場合、各リンクをたどると履歴が作成され、Back ボタンで以前に表示した各画面に戻ることになります。
Up ボタンを使用するとこれらの関連画面をバイパスして、直前に表示したコンテナ画面に移動します。
</p>

<img src="{@docRoot}design/media/navigation_between_siblings_market1.png">

<p>詳細ビューを応用すれば、Up ボタンを使いやすくできます。
前述の Play Store の例で、直前に表示した書籍から映画版の詳細に移動したとします。
その場合、Up ボタンを使用すると前に表示していないコンテナ(映画)に戻ることができます。
</p>

<img src="{@docRoot}design/media/navigation_between_siblings_market2.png">

<h2 id="into-your-app">ホーム画面のウィジェットと通知を使用したアプリへのナビゲーション</h2>

<p>ホーム画面のウィジェットや通知を使用して、アプリの深い階層にある画面に直接移動できるようにします。
たとえば、Gmail の受信トレイのウィジェットと新しいメッセージ通知をタップすると、どちらも受信トレイ画面をバイパスし、会話ビューを直接表示できます。
</p>

<p>この両方の機能で、Up ボタンを次のように処理します。</p>

<ul>
<li><em>通常どおりにアプリの特定の画面から移動先画面に移動する場合</em>、Up ボタンを使用するとその画面に移動します。
</li>
<li><em>それ以外の場合は</em>、Up ボタンを使用するとアプリのトップレベル([ホーム])の画面に移動します。</li>
</ul>

<p>Back ボタンの場合は、アプリのトップ レベルの画面に直接ナビゲートできるパスをタスクのバック スタックに挿入して、わかりやすいナビゲーションにします。
こうすることで、アプリをどのように起動したか覚えていなくても、トップ レベルの画面に移動してから終了できます。

</p>

<p>たとえば Gmail のホーム画面のウィジェットには、作成画面に直接移動するボタンがあります。
作成画面の Up ボタンまたは Back ボタンで受信トレイが表示され、そこから Back ボタンでホームに移動します。
</p>

<img src="{@docRoot}design/media/navigation_from_outside_back.png">

<h4>間接通知</h4>

<p>アプリで複数のイベントに関する情報を同時に表示する必要がある場合、通知を 1 つにまとめてそこからインタースティシャル画面に遷移させることができます。
この画面にはこれらのイベントの要約が表示されており、アプリのさらに深い階層に移動するパスが示されます。
このスタイルの通知を<em>間接通知</em>と呼びます。
</p>

<p>標準(直接)通知とは異なり、間接通知のインタースティシャル画面で Back ボタンを押すと、通知がトリガーされた画面に戻ります。バックスタックには追加の画面は挿入されません。

ユーザーがインタースティシャル画面からアプリに移動すると、Up ボタンと Back ボタンは前述の標準通知と同様に動作します。つまり、インタースティシャル画面に戻るのではなくアプリ内で遷移します。

</p>

<p>たとえば Gmail がカレンダーから間接通知を受け取ったとします。この通知をタップするとインタースティシャル画面が開き、複数の異なるイベントのリマインダーが表示されます。

インタースティシャル画面で Back ボタンをタップすると Gmail に戻ります。特定のイベントをタップすると、インタースティシャル画面からカレンダー アプリに移動し、そのイベントの詳細が表示されます。

イベントの詳細画面で Up ボタンや Back ボタンを使うと、カレンダーのトップ ビューに移動します。</p>

<img src="{@docRoot}design/media/navigation_indirect_notification.png">

<h4>ポップアップ通知</h4>

<p><em>ポップアップ通知</em>は通知ドロワーをバイパスし、直接表示される通知です。
ポップアップ通知はほとんど使われません。<strong>タイムリーな応答が要求され、ユーザーの操作の中断が必要な場合にのみ使うべきです</strong>。
たとえばトークでは、友人からのビデオチャットへの招待が数秒後に自動的に期限切れとなる場合、このスタイルを使ってユーザーに通知します。

</p>

<p>ナビゲーションでは、間接通知のインタースティシャル画面の動作に慎重に従ってポップアップ通知を行います。
Back ボタンでポップアップ通知を閉じます。ポップアップから通知対象のアプリに移動すると、Up ボタンと Back ボタンは標準通知のルールに従って、そのアプリ内で通常のナビゲーションを実行します。

</p>

<img src="{@docRoot}design/media/navigation_popup_notification.png">

<h2 id="between-apps">アプリ間ナビゲーション</h2>

<p>Android システムの基本的な利点の 1 つに、アプリが別のアプリを起動できる機能があります。これを使用すると、あるアプリから別のアプリへ直接移動できます。
たとえば、写真をキャプチャするアプリで、カメラアプリを起動できます。カメラアプリは写真を起動元のアプリに返します。

デベロッパーにとっては他のアプリのコードを簡単に利用できるという点で、ユーザーにとってはよく実行するアクションを常に同じ操作で実行できるという点で大きなメリットです。

</p>

<p>アプリ間ナビゲーションを理解するには、次に説明する Android フレームワークの動作を理解する必要があります。
</p>

<h4>アクティビティ、タスク、インテント</h4>

<p>Android における<strong>アクティビティ</strong>とは、情報を表示する画面と、実行できるすべての関連アクションを定義するアプリケーション コンポーネントのことです。
アプリはアクティビティの集まりで構成され、作成したアクティビティと他のアプリから再利用するアクティビティで構成されています。
</p>

<p><strong>タスク</strong>とは目的の動作を遂行するために実行する、一連のアクティビティのことです。1 つのタスクで 1 つのアプリだけのアクティビティを利用することも、複数のアプリのアクティビティを利用することもできます。

</p>

<p><strong>インテント</strong>とは、アプリがあるアクションを実行するために、別のアプリにアシストを要求するためのシグナルを出すメカニズムです。
アプリのアクティビティは、どのようなインテントに応答できるか決めることができます。
「共有」などの一般的なインテントの場合、その要求に対応できるアプリが複数インストールされていることもあります。
</p>

<h4>例: アプリ間をナビゲートして共有をサポートする</h4>

<p>アクティビティ、タスク、インテントの連携を理解するには、あるアプリが別のアプリを使ってコンテンツを共有する仕組みについて理解する必要があります。
たとえば、ホームから Play Store のアプリを起動すると、新しいタスク A が開始されるとします(以下の図を参照)。
Play Store 内をナビゲートし、おすすめの書籍をタップしてその詳細を表示した後もユーザーは同じタスク内に留まり、アクティビティを追加するとタスクが拡張されます。
「共有」アクションをトリガーすると、共有インテントを処理するよう登録されている(さまざまなアプリの)各アクティビティを一覧表示するダイアログが表示されます。

</p>

<img src="{@docRoot}design/media/navigation_between_apps_inward.png">

<p>Gmail で共有するよう選択すると、Gmail の作成アクティビティがタスク A の続きとして追加され、新しいタスクは作成されません。
Gmail にバックグラウンドで実行中のタスクがある場合、そのタスクは影響を受けません。
</p>

<p>作成アクティビティからメッセージを送信するか、Back ボタンをタップすると書籍の詳細アクティビティに戻ります。
Back ボタンを連続してタップすると Play Store に戻り、最後にホーム画面が表示されます。
</p>

<img src="{@docRoot}design/media/navigation_between_apps_back.png">

<p>ただし、作成アクティビティで Up ボタンをタップすると、Gmail で引き続き作業することになります。
Gmail の会話リストのアクティビティが表示され、新しいタスク B が作成されます。新しいタスクでは常にホーム画面がルートになるため、会話リストから Back ボタンをタップするとホーム画面に戻ります。
</p>

<img src="{@docRoot}design/media/navigation_between_apps_up.png">

<p>タスク A はバックグラウンドで待機しているので、後から(たとえば [最近使ったアプリ] 画面から)このタスクに戻ることができます。
Gmail にバックグラウンドで実行中のタスクが既にある場合、そのタスクはタスク B に置き換えられます。新しいタスクが選択され、前のコンテキストは破棄されます。
</p>

<p>深い階層にあるアクティビティでインテントを処理するようアプリで登録されている場合は、Up ナビゲーションの指定方法については、<a href="#into-your-app">ホーム画面のウィジェットと通知を使用したアプリへのナビゲーション</a>をご覧ください。

</p>