Androidアプリ開発 インテント タスク アクティビティ・スタック [Androidアプリ開発]
Androidはインテントによって、アプリ内、外のアクティビティを呼び出すことができる。明示的なインテントなら、ある特定のアクティビティを起動する、といった指定が可能だし、暗黙的インテントなら、画像データを表示できるアクティビティを起動というように、ざっくりとしたアクティビティの指定もできる。
呼び出されるアクティビティは、アプリの中にあってもいいし、外でもいい。アプリ内でのアクティビティの呼び出しではプロセス起動は行われない。同じプロセスでアクティビティが起動するだけ。アプリ外のアクティビティを呼び出した場合は、プロセスが起動されアクティビティが起動される。
インテントによりアクティビティの遷移が起こると、アクティビティがスタックに積まれていく。このスタックのことを「アクティビティ・スタック」と呼んでいる。ラウンチャーからアプリを起動すると、AndroidManifest.xmlのMAINアクションとなっているインテントフィルタを持っているアクティビティが最初にスタックに積まれる。
C言語での「プログラムはmain関数から始まります」みたいなものか。
C言語ではmainという名前の関数から始まるが、Androidでは、AndroidManifest.xmlで定義されているアクティビティのうち、MAINアクションのインテントフィルタが定義されているアクティビティから始まる。タスク関係の用語では、「ルート・アクティビティ」と呼ばれている。
ルート・アクティビティはスタックに最初に積まれているアクティビティ。ラウンチャーはスタックには積まれない。
C言語の場合も純粋に最初ではないかも知れないがスタックに積まれるのはmainが最初。
ラウンチャーから起動するときの様子だけなら「ルート・アクティビティ」じゃなくて「メイン・アクティビティ」の方がしっくりくるのかも。
スタックの様子を図にすると以下のような感じ。
ルート・アクティビティが別のアクティビティBを呼び出したとする。アクティビティBの画面が表示され、アクティビティ・スタックに積まれる。
設定画面もアクティビティとして実装されている場合が多いであろう。アプリのルート・アクティビティからプリファレンス・アクティビティをインテントで表示させると、スタックにはルート・アクティビティとプリファレンス・アクティビティのふたつが積まれている状態になる。
プリファレンス・アクティビティを戻るボタンで終了すると、スタックからポップされてなくなる。
もう一度、プリファレンスを表示したら、スタックにプッシュされる。
別のアクティビティをラウンチャーから起動すると、タスクがひとつ作成されて、アクティビティがスタックに積まれていく。
タスクリストというのであろうか。2.3にはないが、3.2にはバックボタンと横並びで、起動中のタスクを表示できるボタンが付いている。これで、バックグラウンドにあるタスクをフォアグラウンドに移動することができる。
2.3だと同様のリストが、ホームボタンの長押しで表示できる。
タスクリストで選択するとスタックごとフォアグラウンドになる。
C言語で例えるなら、「コンテキストスイッチ」または「タスクスイッチ」されるっていうことか。まさにタスクスイッチだもんなぁ...
実際に、切り替えて操作してみるものの、どうも動きが異なる。ホームボタン長押しで表示されるリストは、タスク切り替えのためのリストではないらしい。単なる起動履歴なのか。
これらのことが、android developpersの日本語訳
http://developer.android.com/intl/ja/guide/topics/fundamentals.html#acttask
に書かれているのだが、わかりにくい。訳が悪いのであろうか。
デフォルト設定のインテントでプリファレンス・アクティビティに遷移するだけなら、同じタスクのスタックにプリファレンス・アクティビティが積まれる。しかし、アクティビティの設定とインテントの設定によっては、そうはならず、別のタスクのスタックに積むことも可能なのである。
まず、簡単に理解できるのは、インテントのFLAG_ACTIVITY_NEW_TASKフラグ。このフラグが立っていれば、アクティビティが起動される際に、新しくタスクが起こされる。
と思って読み進めると簡単でもなかった。常に新しいタスクが起こされるか、というとそうでもなく、「同じ親和性」が設定されているアクティビティを検索し、それが存在していると、そのアクティビティを含むタスクのスタックに積まれる。
親和性により、より親和度が高いとみなされるタスクに移動する、ということにもできるらしい。
しかし、それって便利なんだろうか。アプリを使っているうちにいろいろなアクティビティが開いたり、閉じたりしている。それらが開かれた順番にスタックに保持されていて、戻るボタンで順に戻っていけるのは、操作性としてわかりやすいと思う。親和性によるアクティビティの移動をすると、途中でスタックの順番が入れ替わってしまうんでしょ。そうすると、戻るボタンで戻らないことになるじゃない。親が変わってしまうのか。
例えば、「ブラウザ」を開いて、「マップ」を開いて、「電話をかける」を開いて、戻ってもう一度戻るとGoogle Earthに戻った。っていうことにならないか?
親和性が高いから違和感はないのかなぁ... あれ、Google Earth使ってたっけ?ということにならないか。もしかしてバグったかと思ってしまうかも。
allowTaskReparenting属性をfalseにしておけばそういったことは起きないのか。
ラウンチャから起動する場合は、新しいタスクが作成される。しかし、既存のタスクがあれば、そのタスクをフォアグラウンドにするだけ。
えーと、AREarthroidとプレイスを別々にラウンチャーから起動すると以下のようになる。
後から起動したプレイスの方がフォアグラウンドにある。ラウンチャーでAREarthroidを起動(もしくは起動履歴リストから選択)すると、AREarthroidの方がフォアグラウンドになる。
別のアプリからインテントでアクティビティが起動される場合は、インテントとアクティビティの設定によるが、デフォルトだと呼び出す側のタスクのスタックに積まれる。
プレイスからAREarthroidを「この場所を共有」で開いて、設定画面を開くとタスクのスタックは
という感じになる。
戻るボタンでプレイスまで戻っていくことができる。
さらに、設定画面を開いている状態で、ラウンチャーからAREarthroidを起動するとタスクが増えて、以下のようになる。
AREarthroidのインスタンスがふたつできる。
と思ったのであるが、どうも動きが違うような。インスタンスがふたつできるのはあっているぽいが...
プレイスを起動するとスタックがクリアされている感じ。行き場がなくなったAREarthroidがおかしな動きをしている。
このあたりはもう少し調べる必要がありそう。
どうも「ちゃんとしたタスク切り替えができない」っていうところに問題がありそうな気がしている。
サイト内を検索
呼び出されるアクティビティは、アプリの中にあってもいいし、外でもいい。アプリ内でのアクティビティの呼び出しではプロセス起動は行われない。同じプロセスでアクティビティが起動するだけ。アプリ外のアクティビティを呼び出した場合は、プロセスが起動されアクティビティが起動される。
インテントによりアクティビティの遷移が起こると、アクティビティがスタックに積まれていく。このスタックのことを「アクティビティ・スタック」と呼んでいる。ラウンチャーからアプリを起動すると、AndroidManifest.xmlのMAINアクションとなっているインテントフィルタを持っているアクティビティが最初にスタックに積まれる。
C言語での「プログラムはmain関数から始まります」みたいなものか。
C言語ではmainという名前の関数から始まるが、Androidでは、AndroidManifest.xmlで定義されているアクティビティのうち、MAINアクションのインテントフィルタが定義されているアクティビティから始まる。タスク関係の用語では、「ルート・アクティビティ」と呼ばれている。
ルート・アクティビティはスタックに最初に積まれているアクティビティ。ラウンチャーはスタックには積まれない。
C言語の場合も純粋に最初ではないかも知れないがスタックに積まれるのはmainが最初。
ラウンチャーから起動するときの様子だけなら「ルート・アクティビティ」じゃなくて「メイン・アクティビティ」の方がしっくりくるのかも。
スタックの様子を図にすると以下のような感じ。
┃ ┃ ┃ ┃ ┃ ┃ ┃ルート・アクティビティ ┃←最初に積まれる ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック
ルート・アクティビティが別のアクティビティBを呼び出したとする。アクティビティBの画面が表示され、アクティビティ・スタックに積まれる。
設定画面もアクティビティとして実装されている場合が多いであろう。アプリのルート・アクティビティからプリファレンス・アクティビティをインテントで表示させると、スタックにはルート・アクティビティとプリファレンス・アクティビティのふたつが積まれている状態になる。
┃ ┃ ┃ ┃ ┃プリファレンス・アクティビティ ┃←ここに積まれる ┃ルート・アクティビティ ┃ ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック
プリファレンス・アクティビティを戻るボタンで終了すると、スタックからポップされてなくなる。
┃ ┃ ┃ ┃ ┃ ┃←ポップされてなくなる ┃ルート・アクティビティ ┃ ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック
もう一度、プリファレンスを表示したら、スタックにプッシュされる。
┃ ┃ ┃ ┃ ┃プリファレンス・アクティビティ ┃←プッシュして積まれた ┃ルート・アクティビティ ┃ ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック
別のアクティビティをラウンチャーから起動すると、タスクがひとつ作成されて、アクティビティがスタックに積まれていく。
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃プリファレンス・アクティビティ ┃ ┃ ┃ ┃ルート・アクティビティ ┃ ┃ルート・アクティビティ ┃ ┗━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━┛ タスク1のアクティビティ・スタック タスク2のアクティビティ・スタック
タスクリストというのであろうか。2.3にはないが、3.2にはバックボタンと横並びで、起動中のタスクを表示できるボタンが付いている。これで、バックグラウンドにあるタスクをフォアグラウンドに移動することができる。
2.3だと同様のリストが、ホームボタンの長押しで表示できる。
タスクリストで選択するとスタックごとフォアグラウンドになる。
C言語で例えるなら、「コンテキストスイッチ」または「タスクスイッチ」されるっていうことか。まさにタスクスイッチだもんなぁ...
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃プリファレンス・アクティビティ ┃ ┃ ┃ ┃ルート・アクティビティ ┃ ┃ルート・アクティビティ ┃ ┗━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━┛ タスク1のアクティビティ・スタック タスク2のアクティビティ・スタック バックグラウンド フォアグラウンド
実際に、切り替えて操作してみるものの、どうも動きが異なる。ホームボタン長押しで表示されるリストは、タスク切り替えのためのリストではないらしい。単なる起動履歴なのか。
これらのことが、android developpersの日本語訳
http://developer.android.com/intl/ja/guide/topics/fundamentals.html#acttask
に書かれているのだが、わかりにくい。訳が悪いのであろうか。
デフォルト設定のインテントでプリファレンス・アクティビティに遷移するだけなら、同じタスクのスタックにプリファレンス・アクティビティが積まれる。しかし、アクティビティの設定とインテントの設定によっては、そうはならず、別のタスクのスタックに積むことも可能なのである。
まず、簡単に理解できるのは、インテントのFLAG_ACTIVITY_NEW_TASKフラグ。このフラグが立っていれば、アクティビティが起動される際に、新しくタスクが起こされる。
と思って読み進めると簡単でもなかった。常に新しいタスクが起こされるか、というとそうでもなく、「同じ親和性」が設定されているアクティビティを検索し、それが存在していると、そのアクティビティを含むタスクのスタックに積まれる。
親和性により、より親和度が高いとみなされるタスクに移動する、ということにもできるらしい。
しかし、それって便利なんだろうか。アプリを使っているうちにいろいろなアクティビティが開いたり、閉じたりしている。それらが開かれた順番にスタックに保持されていて、戻るボタンで順に戻っていけるのは、操作性としてわかりやすいと思う。親和性によるアクティビティの移動をすると、途中でスタックの順番が入れ替わってしまうんでしょ。そうすると、戻るボタンで戻らないことになるじゃない。親が変わってしまうのか。
例えば、「ブラウザ」を開いて、「マップ」を開いて、「電話をかける」を開いて、戻ってもう一度戻るとGoogle Earthに戻った。っていうことにならないか?
親和性が高いから違和感はないのかなぁ... あれ、Google Earth使ってたっけ?ということにならないか。もしかしてバグったかと思ってしまうかも。
allowTaskReparenting属性をfalseにしておけばそういったことは起きないのか。
ラウンチャから起動する場合は、新しいタスクが作成される。しかし、既存のタスクがあれば、そのタスクをフォアグラウンドにするだけ。
えーと、AREarthroidとプレイスを別々にラウンチャーから起動すると以下のようになる。
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃AREarthroid ┃ ┃プレイス ┃ ┗━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック アクティビティ・スタック バックグラウンド フォアグラウンド
後から起動したプレイスの方がフォアグラウンドにある。ラウンチャーでAREarthroidを起動(もしくは起動履歴リストから選択)すると、AREarthroidの方がフォアグラウンドになる。
別のアプリからインテントでアクティビティが起動される場合は、インテントとアクティビティの設定によるが、デフォルトだと呼び出す側のタスクのスタックに積まれる。
プレイスからAREarthroidを「この場所を共有」で開いて、設定画面を開くとタスクのスタックは
┃ ┃ ┃AREarthroidPreference ┃ ┃AREarthroid ┃ ┃プレイス ┃ ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック
という感じになる。
戻るボタンでプレイスまで戻っていくことができる。
さらに、設定画面を開いている状態で、ラウンチャーからAREarthroidを起動するとタスクが増えて、以下のようになる。
┃ ┃ ┃ ┃ ┃AREarthroidPreference ┃ ┃ ┃ ┃AREarthroid ┃ ┃ ┃ ┃プレイス ┃ ┃AREarthroid ┃ ┗━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━┛ アクティビティ・スタック アクティビティ・スタック
AREarthroidのインスタンスがふたつできる。
と思ったのであるが、どうも動きが違うような。インスタンスがふたつできるのはあっているぽいが...
プレイスを起動するとスタックがクリアされている感じ。行き場がなくなったAREarthroidがおかしな動きをしている。
このあたりはもう少し調べる必要がありそう。
どうも「ちゃんとしたタスク切り替えができない」っていうところに問題がありそうな気がしている。
サイト内を検索
2012-05-12 06:59
nice!(0)
コメント(0)
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0