iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
iOSアプリケーションは伝統的なUnixアプリケーションだが、Androidは独特だ。
アクティビティを簡単に説明すると画面という事になるのだが、システムのアクティビティマネージャによって開かれた画面はスタック構造で管理され、WebブラウザのBackボタンのように、前のアクティビティに戻る動きをする。
Linuxのプロセスとアプリケーションのライフサイクルは等号でなく、プロセスはアクティビティを入れる容器にすぎない。
アクティビティには、launchModeという開かれた際の挙動を定義する項目があり、これには以下の4つの種類がある。
LaunchMode | android:launchMode | 起動タスク | インスタンス化 |
---|---|---|---|
standard | multiple | 呼び出し元タスク | 追加 |
singleTop | singleTop | 呼び出し元タスク | 対象アクティビティが最上位でない場合は追加。その他は再利用。 |
singleTask | singleTask | 新規タスク | 既存インスタンスの再利用。 |
singleInstance | singleInstance | 新規タスク | 追加 |
アクティビティが呼び出し元タスクに属する事に驚いたが、同一アプリケーション内部の場合に限定すると、あるアクティビティを開くインテントを実行した際に、とにかく開く要求が発生したら、その度に、ある画面を出したい場合はstandardを、そのアクティビティが開かれていた場合は新規に画面を開きたくない場合は、simgleTopをというのが良さそうだ。
実は、あるアプリケーションを作っていて、それはアプリ内のサービスから、通知経由で、そのアプリをフロントに移動させるという動きをさせたいのだが、フロントに移動する度にアクティビティが追加されて困っていた為、調査していた。
この問題そのものについて、Android関連のMLで答えを教えてもらったので、それも紹介しよう。
同一アプリで、あるアクティビティを開く場合は、以下のようにインテントを記述すると思うが、
Intent intent = new Intent(this, アクティビティ名.class);
startActivity(intent);
この時に以下の設定を追加すればいい。
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
質問の場を設けてくれた日本Androidの会の皆さん、ありがとうございます。助かりました!