戻るボタンでアクティビティを終了すると呼び出し元も終了してしまう

590 views
Skip to first unread message

ado

unread,
Jun 12, 2009, 2:19:07 PM6/12/09
to 日本Androidの会
SCUDERIA-Aの毛利です。

現在以下のような現象で悩んでいます。

A,B,Cのアクティビティがあります。
・メニュー画面のアイコンをクリックしてAを起動
・ボタン等のイベントでAからでBを起動
・同様にボタン等のイベントでBからでCを起動

この状態でCを終了するためにfinish();で終了させるとBに
制御が戻り正常に動作するのですが、「戻る」ボタンでCを
終了させるとBの画面が一瞬表示された後、Aまで戻ってしまうのです。

呼び出しはこのような感じでおこなっており、startActivity,startActivityForResult
どちらで呼び出しても同様の結果となっています。
Intent intent = new Intent(this, XXX.class);
startActivityForResult(intent, 1);
※Dev Phone,T-Mobile,カンファレンスで配られた端末,エミュレーターどれでも発生しています。
ターゲットは1.5で作成しました。

同じような現象が発生している人はいませんでしょうか?

kabayan

unread,
Jun 12, 2009, 3:06:46 PM6/12/09
to 日本Androidの会
onResume()とかを使ってデバッグしてみてはどうでしょうか?

Bのアクティビティは生きたままですか?

※もしかしてBをfinisih()してませんか?

kabayan

ado

unread,
Jun 13, 2009, 10:18:39 AM6/13/09
to 日本Androidの会
kabayanさん

はじめまして!

> Bのアクティビティは生きたままですか?
Cで戻るボタンを押下したあとに、BのonResume()やonRestart()で
確認しているのですが、正常に呼ばれていますね。

> ※もしかしてBをfinisih()してませんか?
最初はそう思って何度も確認しているのですが、Bにはfinisih()している箇所がないのです。
Cをfinisih()で終了した場合と戻るボタンで終了した場合のBの振る舞いが違うので
悩んでいるところです。

Akio Kondo

unread,
Jun 13, 2009, 10:42:18 AM6/13/09
to android-g...@googlegroups.com
こんどう@組み込みWGです。

再現させるのに必要なソースコードを提示してもらうと解決が早いかも知
れません。

最小限の構成で再現するコードを作ってるうちに原因がわかったりもしま
すし。



On 2009/06/13, at 23:18, ado <mob...@scuderia-a.com> wrote:

>
> kabayanさん
>
> はじめまして!
>
>> Bのアクティビティは生きたままですか?
> Cで戻るボタンを押下したあとに、BのonResume()や
> onRestart()で
> 確認しているのですが、正常に呼ばれていますね。
>
>> ※もしかしてBをfinisih()してませんか?
> 最初はそう思って何度も確認しているのですが、Bにはfinisih()
> している箇所がないのです。
> Cをfinisih()で終了した場合と戻るボタンで終了した場合のB
> の振る舞いが違うので
> 悩んでいるところです。
> >

Keiji Ariyama

unread,
Jun 13, 2009, 10:48:58 AM6/13/09
to android-g...@googlegroups.com
有山@大阪です。

 天性のめんどくさがり屋の僕ですので、全部のActivityに以下のコードを追加
するのはどうでしょう。

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.finish();
return true;
}
}

 とりあえず、finishで消せば問題ないなら、解決するんじゃないかと。
 近藤さんの言うとおり、ソースコード見るのが一番早いと思いますけど。

/*********************************************
有限会社シーリス
代表 有山 圭二
@Address
〒530-0044
大阪市北区東天満二丁目2番5号
第2新興ビル 601
@Web http://www.c-lis.co.jp
*********************************************/

ado

unread,
Jun 13, 2009, 1:01:01 PM6/13/09
to 日本Androidの会
@Override
public boolean onKeyUp(int keyCode,KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_ENTER){
}
return false;
// return super.onKeyDown(keyCode,event);
}


On 6月13日, 午後11:48, Keiji Ariyama <keiji_ariy...@c-lis.co.jp> wrote:
> 有山@大阪です。
>
>  天性のめんどくさがり屋の僕ですので、全部のActivityに以下のコードを追加
> するのはどうでしょう。
>
> public boolean onKeyDown(int keyCode, KeyEvent event) {
> if (keyCode == KeyEvent.KEYCODE_BACK) {
> this.finish();
> return true;
> }
> }
>
>  とりあえず、finishで消せば問題ないなら、解決するんじゃないかと。
>  近藤さんの言うとおり、ソースコード見るのが一番早いと思いますけど。
>
> /*********************************************
> 有限会社シーリス
> 代表 有山 圭二
> @Address
> 〒530-0044
> 大阪市北区東天満二丁目2番5号
> 第2新興ビル 601
> @Webhttp://www.c-lis.co.jp
> *********************************************/
>
>
>
> kabayan wrote:
> > onResume()とかを使ってデバッグしてみてはどうでしょうか?
> > +
> > Bのアクティビティは生きたままですか?
>
> > ※もしかしてBをfinisih()してませんか?
>
> > kabayan
>
> > On 6月13日, 午前3:19, ado <mob...@scuderia-a.com> wrote:
> >> SCUDERIA-Aの毛利です。
>
> >> 現在以下のような現象で悩んでいます。
>
> >> A,B,Cのアクティビティがあります。
> >> ・メニュー画面のアイコンをクリックしてAを起動
> >> ・ボタン等のイベントでAからでBを起動
> >> ・同様にボタン等のイベントでBからでCを起動
>
> >> この状態でCを終了するためにfinish();で終了させるとBに
> >> 制御が戻り正常に動作するのですが、「戻る」ボタンでCを
> >> 終了させるとBの画面が一瞬表示された後、Aまで戻ってしまうのです。
>
> >> 呼び出しはこのような感じでおこなっており、startActivity,startActivityForResult
> >> どちらで呼び出しても同様の結果となっています。
> >> Intent intent = new Intent(this, XXX.class);
> >> startActivityForResult(intent, 1);
> >> ※Dev Phone,T-Mobile,カンファレンスで配られた端末,エミュレーターどれでも発生しています。
> >> ターゲットは1.5で作成しました。
>
> >> 同じような現象が発生している人はいませんでしょうか?- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

ado

unread,
Jun 13, 2009, 1:09:42 PM6/13/09
to 日本Androidの会
上の投稿を誤って途中で投げてしまいました・・・

kabayanさん、こんどうさん、有山さん解決のヒントをありがとうございました。
頭にきて色々とソースを削っていくうちに原因が判明しました。
かなり恥ずかしいことをやっていたようです。

Bの処理でキーボードのENTERキー押下時に処理を入れたくて、
キーイベントを以下のように書いていました。

//キーダウンイベントの処理
@Override
public boolean onKeyUp(int keyCode,KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_ENTER){
//ENTERキー押下時の処理
}
return super.onKeyDown(keyCode,event);
}

このように書いているとCの戻るのキーイベントまで拾ってしまうようで
そのためBまで閉じてしまっていたようです。
return super.onKeyDown(keyCode,event);
     ↓
return false;
このように変更することで意図した動きになりました。

みなさま色々とありがとうございます!
Reply all
Reply to author
Forward
0 new messages