既存のアクティビティの呼び出しについて

7,733 views
Skip to first unread message

triplane

unread,
Jan 11, 2011, 7:10:45 PM1/11/11
to 日本Androidの会
アクティビティの呼び出しについてご質問させてください。
アクティビティAからアクティビティBを呼び出し、その後、BからAに戻りたい場合、どのようにするのでしょうか?
Web上で見るサンプルコードなどでは、

Intent intent = new Intent(this, ActivityA.class);
startActivity(intent);

のようにしているコードが多いですが、これだと、新しいアクティビティが作成されているように思います。
(onCreate() メソッドが実行されているので、)
そうではなく、すでにそのAcitvityがスタートしている場合、それを呼び出したいと思います。
理由としては、ActivityAはマップビューを持っており、すでにそこにマーカーのOverlayを配置してあります。
ところが、BからAもどると、新たにActivityが作成され、既存のマーかはすべて消えています。(というかOverlayそのものがなくなってい
る)
このように、起動済みのActivityを呼び出したいケースって多いと思うのですがどのようにするのでしょうか。
ご教示いただけるとありがたいです。
よろしくお願いいたします。

mosaki4

unread,
Jan 11, 2011, 11:00:56 PM1/11/11
to android-g...@googlegroups.com
大崎といいます

Androidのアクティビティは呼び出すたびに上に重ねていくイメージなので
アクティビティAからアクティビティBを呼び出した場合は
アクティビティBの下にアクティビティAが隠れているので
アクティビティBをfinish()メソッドで終了させるだけでアクティビティAに戻ることができます。

2011年1月12日9:10 triplane <gunn...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


おく

unread,
Jan 11, 2011, 11:08:34 PM1/11/11
to 日本Androidの会
おく@amay077 です。

> 起動済みのActivityを呼び出したいケースって多いと思うのですがどのようにするのでしょうか。

どうも Android の思想的には、そのようなものは無いみたいです。

こちら↓

画面遷移 | テックファーム
http://www.techfirm.co.jp/lab/android/transition.html

の説明にあるように、遷移情報はスタックされるようなので、A→B と遷移したあと、
B で「戻る」を押すと A に戻るようですが、インスタンスが使いまわされるのはなく A が新しく生成されますね。

Android の Activity のライフサイクルの特長である、
「バックグラウンドに退避した Activity は、システムによっていつ消されてもおかしくない」
と、関連してそうです。
たぶんメモリ使用をできるだけ抑えるような思想なんだと思います。

A のインスタンスを保持したいまま B を表示するには、B を AlertDialog などで表示するしかないと思います。
それでも、"モーダル表示" (A が、B が閉じられるまで待機する) は通常行えないようです。

今までの Windows アプリ開発だと、上記のような事は当然のようにできていたので自分もまだ慣れていませんが、
間違っている点などありましたらご指摘頂ければ幸いです。

----
おく
http://twitter.com/amay077
http://amay077.posterous.com/
http://iddy.jp/profile/amay077/

. k-matsuda

unread,
Jan 11, 2011, 11:38:35 PM1/11/11
to android-g...@googlegroups.com
松田です。

下記のようなのでいかがでしょうか

Intent intent = new Intent(this, TopActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);


私が作るアプリで階層の深いところからトップ画面に一気に戻すときは
Intent.FLAG_ACTIVITY_CLEAR_TOP
このフラグを設定することが多いです。

他にもフラグはいろいろとあるので試してみるといいかもしれません。

まとはずれだったらすいません。

----------------
松田幸一
横浜Androidデベロッパーズ倶楽部

2011年1月12日9:10 triplane <gunn...@gmail.com>:

triplane

unread,
Jan 12, 2011, 1:26:06 AM1/12/11
to 日本Androidの会
大崎さん
ありがとうございます。

> アクティビティBをfinish()メソッドで終了させるだけでアクティビティAに戻ることができます。

はい。それは存じておるのですが、アクティビティBも、状態を保持して再利用したいと思っているので、できらら、finishすることなく画面を切り替
えることができれば、と考えております。



On 1月12日, 午後1:00, mosaki4 <mosa...@gmail.com> wrote:
> 大崎といいます
>
> Androidのアクティビティは呼び出すたびに上に重ねていくイメージなので
> アクティビティAからアクティビティBを呼び出した場合は
> アクティビティBの下にアクティビティAが隠れているので
> アクティビティBをfinish()メソッドで終了させるだけでアクティビティAに戻ることができます。
>
> 2011年1月12日9:10 triplane <gunny...@gmail.com>:
>
>
>
>
>
>
>
> > アクティビティの呼び出しについてご質問させてください。
> > アクティビティAからアクティビティBを呼び出し、その後、BからAに戻りたい場合、どのようにするのでしょうか?
> > Web上で見るサンプルコードなどでは、
>
> > Intent intent = new Intent(this, ActivityA.class);
> > startActivity(intent);
>
> > のようにしているコードが多いですが、これだと、新しいアクティビティが作成されているように思います。
> > (onCreate() メソッドが実行されているので、)
> > そうではなく、すでにそのAcitvityがスタートしている場合、それを呼び出したいと思います。
> > 理由としては、ActivityAはマップビューを持っており、すでにそこにマーカーのOverlayを配置してあります。
> > ところが、BからAもどると、新たにActivityが作成され、既存のマーかはすべて消えています。(というかOverlayそのものがなくなってい
> > る)
> > このように、起動済みのActivityを呼び出したいケースって多いと思うのですがどのようにするのでしょうか。
> > ご教示いただけるとありがたいです。
> > よろしくお願いいたします。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。

triplane

unread,
Jan 12, 2011, 1:34:34 AM1/12/11
to 日本Androidの会
おく@amay077 さん

ありがとうございます。

なるほどそうなんですね。
ただ、よくある、アクティビティのライフサイクルのフローチャートを見ると、アクティビティが破棄されない限り、戻ってきた時は、
onCreate() ではなく、onResume(), または、onStart() が呼ばれるのでは、と思いました。
new Intent() で新しく作成するから、既存のactivity とは別のインスタンスができているのでは、と思っていました。

現状の問題で言うと、mapViewに設定したoverlay がなくなっていることが問題となっています。




On 1月12日, 午後1:08, おく <okuoku...@gmail.com> wrote:
> おく@amay077 です。
>
> > 起動済みのActivityを呼び出したいケースって多いと思うのですがどのようにするのでしょうか。
>
> どうも Android の思想的には、そのようなものは無いみたいです。
>
> こちら↓
>
> 画面遷移 | テックファームhttp://www.techfirm.co.jp/lab/android/transition.html

triplane

unread,
Jan 12, 2011, 1:36:46 AM1/12/11
to 日本Androidの会
松田さん

ありがとうございます。
なるほど。下記
http://developer.android.com/reference/android/content/Intent.html
でみるといろいろなフラグがあるのですね。
早速試してます。

ありがとうございました。



On 1月12日, 午後1:38, ". k-matsuda" <caldi...@gmail.com> wrote:
> 松田です。
>
> 下記のようなのでいかがでしょうか
>
> Intent intent = new Intent(this, TopActivity.class);
> intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
> startActivity(intent);
>
> 私が作るアプリで階層の深いところからトップ画面に一気に戻すときは
> Intent.FLAG_ACTIVITY_CLEAR_TOP
> このフラグを設定することが多いです。
>
> 他にもフラグはいろいろとあるので試してみるといいかもしれません。
>
> まとはずれだったらすいません。
>
> ----------------
> 松田幸一
> 横浜Androidデベロッパーズ倶楽部
>
> 2011年1月12日9:10 triplane <gunny...@gmail.com>:

yokmama

unread,
Jan 12, 2011, 1:50:33 AM1/12/11
to android-g...@googlegroups.com
夜子ままです

このあたり、とくに分かりにくいところなので難しいところだと思います。

考えているとおり

ActivityAからBをよびだして、 BackあるいはstartActivityでAを呼んだらら

onCreateは呼ばれずに、onResumeが呼ばれます。

だから認識はあっています。

だけど、これは、Activityが生きていることを保障するものではないので、
メモリが足りなくなったら勝手に殺されてしまいます。
そのため、それを期待してプログラムするのは危険です。

BのActivityを呼び出す前に、Preferenceに値を保存するか。(またはSQLとか)
SaveInstanceStateで値を保存して、onRestoreInstanceStateで値を取得するか
BにOverlayの情報を渡して、ActivityForResultでBからまたOverlayの情報をもらうか
ApplicatoinContextを継承してそこで管理するか

というような方法で回避をすることをお勧めします。



2011年1月12日15:34 triplane <gunn...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。




--
*************************************************
Re:Kayo-System Co.,Ltd. 

CEO    Masafumi Terazono
Twitter @yokmama
*************************************************


triplane

unread,
Jan 12, 2011, 2:08:36 AM1/12/11
to 日本Androidの会
夜子ままさん

ありがとうございます。
なるほど。そうなんですね。
今の状態では、ApplicatoinContextを継承したクラスを作ってそこにマーカーの情報を保持しています。
また、アクティビティBでも、上記のデータを使用してリストビューを表示しているのですが、
・アクティビティBでは保持した情報を更新しない
・マップのマーカー操作は処理が重そう(勝手な憶測)
などの理由で、すでに表示されている状態の、アクティビティAを再表示できれば、と考えました。

やはり、この保持している情報を使って、アクティビティAで再度マーカーの描画や、各種イベントの処理を行う(つまり、アクティビティAが初めて表示さ
れるときと同じ処理を再度行う)のがいいのでしょうか?
また、SaveInstanceState などの方がいいのでしょうか?

よろしくお願い致します。




On 1月12日, 午後3:50, yokmama <hijirinhiji...@gmail.com> wrote:
> 夜子ままです
>
> このあたり、とくに分かりにくいところなので難しいところだと思います。
>
> 考えているとおり
>
> ActivityAからBをよびだして、 BackあるいはstartActivityでAを呼んだらら
>
> onCreateは呼ばれずに、onResumeが呼ばれます。
>
> だから認識はあっています。
>
> だけど、これは、Activityが生きていることを保障するものではないので、
> メモリが足りなくなったら勝手に殺されてしまいます。
> そのため、それを期待してプログラムするのは危険です。
>
> BのActivityを呼び出す前に、Preferenceに値を保存するか。(またはSQLとか)
> SaveInstanceStateで値を保存して、onRestoreInstanceStateで値を取得するか
> BにOverlayの情報を渡して、ActivityForResultでBからまたOverlayの情報をもらうか
> ApplicatoinContextを継承してそこで管理するか
>
> というような方法で回避をすることをお勧めします。
>
> 2011年1月12日15:34 triplane <gunny...@gmail.com>:
> >http://twitter.com/amay077http://amay077.posterous.com/http://iddy.jp...
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>

おく

unread,
Jan 13, 2011, 11:30:40 PM1/13/11
to 日本Androidの会
おく@amay077 です。

triplane さん
> アクティビティのライフサイクルのフローチャートを見ると、アクティビティが破棄されない限り、戻ってきた時は、
> onCreate() ではなく、onResume(), または、onStart() が呼ばれるのでは、と思いました。

夜子まま さん
> このあたり、とくに分かりにくいところなので難しいところだと思います。
> 考えているとおり
> ActivityAからBをよびだして、 BackあるいはstartActivityでAを呼んだらら
> onCreateは呼ばれずに、onResumeが呼ばれます。
> だから認識はあっています。

すいません、半分間違っていましたね。
勉強になりました。

triplane さん
> ・マップのマーカー操作は処理が重そう(勝手な憶測)

これはマーカーに ItemizedOverlay を使われているのでしたら、
どのくらいの数の OverlayItem を Activity の初期化時に登録しているかによると思います。

多少ムチャクチャなやり方かもしれませんが、ApplicatoinContext に ItemizedOverlay 自体を入れておくと、
Overlay 自体を作り直さなくて良くなる(Item を登録しなおさなくてよくなる)ので "重さ" は改善できるのかも知れません。

ただ素直に再生成しても、数十~100個程度のマーカー数なら、体感できるほどでもないと思います。

西川正樹

unread,
Jan 16, 2011, 11:30:34 PM1/16/11
to 日本Androidの会
西川と申します。

私も投稿者様と同じような疑問を持ったため、当ディスカッションを参考にさせていただきました。
私の場合は、通知バーから通知を押した際に、最後に表示した画面を再表示するということを実現したかったのですが
Activityの起動モードを"singleTop"にしてみたところ、上手く行きました。
もしくは、ActivityのFlagにFLAG_ACTIVITY_SINGLE_TOPを指定することで実現できます。

Activityの起動モードについては以下を参考にしました。
http://developer.android.com/intl/ja/guide/topics/fundamentals.html#lmodes

ただ、上記URLにも書いてある通り、
起動モードを"singleTop"にしても、アクティビティスタックがA-B-C-Dとなっている状態で
BのActivityを起動した場合は、再度onCreateが呼ばれてしまいます。
こちらに関して、対応方法をご存知の方がいらっしゃいましたら、教えていただきたいです。

よろしくお願いいたします。

西川正樹

unread,
Jan 16, 2011, 11:36:08 PM1/16/11
to 日本Androidの会
西川と申します。

私も投稿者様と同じような疑問を持ったため、当ディスカッションを参考にさせていただきました。
私の場合は、通知バーから通知を押した際に、最後に表示した画面を再表示するということを実現したかったのですが
Activityの起動モードを"singleTop"にしてみたところ、上手く行きました。
もしくは、ActivityのFlagにFLAG_ACTIVITY_SINGLE_TOPを指定することで実現できます。

Activityの起動モードについては以下を参考にしました。
http://developer.android.com/intl/ja/guide/topics/fundamentals.html#lmodes

ただ、上記URLにも書いてある通り、
起動モードを"singleTop"にしても、アクティビティスタックがA-B-C-Dとなっている状態で
BのActivityを起動した場合は、再度onCreateが呼ばれてしまいます。
こちらに関して、対応方法をご存知の方がいらっしゃいましたら、教えていただきたいです。

よろしくお願いいたします。

西川正樹

unread,
Jan 17, 2011, 1:06:45 AM1/17/11
to 日本Androidの会
最初の投稿からしばらく経つのですが、ディスカッションになかなか反映されないですね。。。
2重投稿になっていたらすみません。

Activityの起動モードを"singleTop"にし、フラグにFLAG_ACTIVITY_CLEAR_TOPをセットしたところ、
アクティビティスタックがA-B-C-Dとなっている状態でBのActivityを呼んでも、onCreateが呼ばれなくなりました。
FLAG_ACTIVITY_CLEAR_TOPにすると、上記の場合、C,DのActivityを消してくれるようです。

よろしくお願いいたします。

On 1月12日, 午前9:10, triplane <gunny...@gmail.com> wrote:
Reply all
Reply to author
Forward
0 new messages