Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

Androidのアクティビティとタスク

Androidのアクティビティとタスクの振る舞いについて、developer サイトの 「開発の基礎」のページ のアクティビティとタスクの章を読んでみました。

AndroidではIntentを使ってアクティビティから別のアクティビティを呼びだすことができます。これらの関連するアクティビティをスタックにまとめたものがタスクです。アクティビティが他のアクティビティをIntentで呼び出し、自分と同じタスクのスタックに積んでいき、Back(戻る)ボタンで積んだアクティビティをポップするというのがAndroid標準の動作です。しかし、このタスクの振る舞いはアクティビティを呼び出すときのIntentに与えるフラグや、呼び出すアクティビティそのものの属性で変わってきます。

「開発の基礎」のページでこれを丁寧に解説してあります。じっくり読んでみてすごくよくわかりました。実際にはどういうところで使われているのだろうと思って実例を探してみました。(ただし推測も混じっているので必ずそう動いている確信はありません)

[1] ギャラリーからの共有

ギャラリーアプリのAndroidManifest.xml を見ると、clearTaskOnLauch 属性が True になっていました。ということは、ギャラリーから他のアクティビティを呼び出した場合、一旦ホームに戻ってしまうと呼び出したアクティビティはクリアされてしまうので、再びギャラリーを起動してもギャラリーが立ち上がるだけです。

[2] 他のアプリから Gmailの呼び出し

Gmail の AndroidManifest.xml を見ると、allowTaskReparentng 属性が True になっていました。ということは、他のアプリから呼び出されてスタックに積まれたGamilアクティビティは、Gmailと親和性(Affinity)のあるタスクがフォアグラウンドに移るとそちらのタスクに移動することになります。たとえば、

・Gmailを起動し、新規作成する
・新規作成の画面のまま、一旦ホームに戻る
・ギャラリーを立ち上げ、適当な写真の共有メニューからGmailを起動する
・一旦ホームに戻る。

GmailのLaunchモードは singleTaskでもsingleInstanceでもないので、この時点でのタスクは(1)Gmailのリスト→新規作成 と (2)ギャラリー → Gmail作成 の2つのタスクがあると思われます。

・Gmailを起動することで (1)のタスクに切り換える

すると、(2)のギャラリーから読んだGmail作成画面が現れます。さらに、Backボタンで戻ると (1)の新規作成画面になります。つまり、(2)のGmailアクティビティが(1)のタスクに移動したように見えます。

[3] ブラウザからのページ共有

ブラウザのAndroidManifest.xml を見ると、まずlauch mode が singleTask になっています。つまり、ブラウザは必ずタスクのルートになります。他のアプリからブラウザを呼び出しても、自分のタスクに積むことはできず、新たなタスクになってしまいます。また、alwaysRetainTaskState 属性が True になっており、これでタスクのスタックがいつまでも保存されます。

しかし、ブラウザから「ページの共有」で他のアプリを呼んだときに、そのまま一旦ホームに戻り、次にブラウザを起動してもブラウザが立ち上がるだけです。どうしてでしょ?

実はブラウザから「ページの共有」で他のアプリを呼ぶときに、Intent に FLAG_ACTIVITY_PREVIOUS_IS_TOP というフラグを付けています。このフラグは、Intentで呼んだアクティビティはすぐに終了するアクティビティなので、自分がタスクのトップであると見なしていいよ、というフラグらしいのです。なので、次にブラウザのタスクに切り換えた時にブラウザ自身がタスクのトップと見なされるのではないかと思います。(ちょっとこのあたり確信ない)

************************************************************************************************************

というようなことになっているのですが、一般のユーザにこんなことを説明しても、これだからAndroidって… と言われて嫌われるだけのような気がします。うんちくを語るのは相手を選びましょう。

一般ユーザにとっては、なんだかわからないけど無意識のうちにうまく使えているというのが一番だと思います。アクティビティとタスクの設計によっていろいろできてしまうので、奇妙な動きをしない、予想通りの使い方ができる、というふうにしなければいけないのだと思います。

PAGE TOP