finish()でActivityが終了しない

7,954 views
Skip to first unread message

そうめい

unread,
Sep 19, 2010, 10:38:16 AM9/19/10
to 日本Androidの会
みなさま

お世話になります。

Activityがfinish()で終了せずに困っております。

Activity内ではいくつかfinish()を設定しているんですが
1か所だけ終了しないものがあります。

試しに、
---
Log.d("CHECK", "before finish()");
finish();
Log.d("CHECK", "after finish()");
---
としてLogCatを見てみたんですが

---
09-19 23:29:37.263: DEBUG/CHECK(13016): before finish()
09-19 23:29:37.273: DEBUG/CHECK(13016): after finish()
---
としっかりスルーされてしまい
「『after finish()』じゃねーよ!!ヾ(`Д´*)ノ」
と一人ボケツッコミのようなことをしてしまいました。


なにか、finish()が無効になるような条件があるのでしょうか?

原因をご存知の方、
同じような症状に悩んだことのある方、
いらっしゃいましたらアドバイスいただけますと幸いです。


よろしくお願いします。

hirokuma ueno

unread,
Sep 19, 2010, 11:05:46 AM9/19/10
to android-g...@googlegroups.com
こんばんは。

Activity.finish()の実装としては(Android 2.2R1.1)、

public void finish() {
if (mParent == null) {
・・・
}else{
mParent.finishFrmoChild();
}
}
public void finishFromChild(Activity child) {
finish();
}

となっていて、「・・・」のところでは、終了コードの設定と
mFinishedフラグをONにしている程度でした。


finish()の説明が、

>Call this when your activity is done and should be closed.

となっていたこともあり、finish()は「私のアプリは終了させてもいいのだ」という
宣言程度にしかならないと思われます。

基本的に AndroidのActivity(プロセス?)は
Androidの好きなタイミングで殺されるだけだと思います。
(殺すのもコストが高いですし。)


自分の作ったアプリでは、終了させる処理の流れであれば
最初に finish() を呼んでからあれこれ呼んでいます。

--
//ueno

tmsute

unread,
Sep 19, 2010, 11:13:04 AM9/19/10
to android-g...@googlegroups.com
tmsuteです。

(2010/09/19 23:38), そうめい wrote:
> Activityがfinish()で終了せずに困っております。
>
> Activity内ではいくつかfinish()を設定しているんですが
> 1か所だけ終了しないものがあります。
finish()すれば、大抵即時終了するのに、一箇所だけ即時終了しない
ということですか?

私の認識では、finish()は終了の告知であって、即時終了とは異なる
もの、と思っています。もしCを書かれるのでしたら、Cで言うexit()
とは違うという認識です。

> 試しに、
> ---
> Log.d("CHECK", "before finish()");
> finish();
> Log.d("CHECK", "after finish()");
> ---
> としてLogCatを見てみたんですが
>
> ---
> 09-19 23:29:37.263: DEBUG/CHECK(13016): before finish()
> 09-19 23:29:37.273: DEBUG/CHECK(13016): after finish()
> ---
> としっかりスルーされてしまい
> 「『after finish()』じゃねーよ!!ヾ(`Д´*)ノ」
> と一人ボケツッコミのようなことをしてしまいました。

通常、そうなるものと認識しています。
問題は、finish()をコールしたにもかかわらず、onDestory()が
呼ばれていないケースだと思います。そうならそれは重大で、
掘り下げて議論すべきだと思います。

デストラクタは呼ばれないことがある、というのはAndroidの
仕様だったと記憶しています。

Kd

unread,
Sep 19, 2010, 11:15:25 AM9/19/10
to android-g...@googlegroups.com

R と申します。
もしかしてfinishその時点 で終了しないということですか?
On pause,
Onstop,
On destory
までいっちゃいますよ。
それで終了するはずです

2010/09/20 0:05 "hirokuma ueno" <ueno...@gmail.com>:



こんばんは。

Activity.finish()の実装としては(Android 2.2R1.1)、

 public void finish() {
   if (mParent == null) {
     ・・・
   }else{
      mParent.finishFrmoChild();
   }
 }
 public void finishFromChild(Activity child) {
   finish();
 }

となっていて、「・・・」のところでは、終了コードの設定と
mFinishedフラグをONにしている程度でした。


finish()の説明が、

>Call this when your activity is done and should be closed.

となっていたこともあり、finish()は「私のアプリは終了させてもいいのだ」という
宣言程度にしかならないと思われます。

基本的に AndroidのActivity(プロセス?)は
Androidの好きなタイミングで殺されるだけだと思います。
(殺すのもコストが高いですし。)


自分の作ったアプリでは、終了させる処理の流れであれば
最初に finish() を呼んでからあれこれ呼んでいます。


-------- Original Message --------
Subject: [android-group-japan: 6593] finish()でActivityが終了しない

Fro...

//ueno


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-group-japan@googlegroup...

Kd

unread,
Sep 19, 2010, 11:21:00 AM9/19/10
to android-g...@googlegroups.com

Rと申します。
もしかしてfinish のその時点で終了しないということですか?

Onpause
Onst op
On destory
までいっちゃいますよ。
それで終了するはずです

2010/09/20 0:13 "tmsute" <tms...@gmail.com>:

 tmsuteです。


(2010/09/19 23:38), そうめい wrote:
> Activityがfinish()で終了せずに困っております。
>

> Activity内ではいくつかfinish()を設定してい...

finish()すれば、大抵即時終了するのに、一箇所だけ即時終了しない
ということですか?

私の認識では、finish()は終了の告知であって、即時終了とは異なる
もの、と思っています。もしCを書かれるのでしたら、Cで言うexit()
とは違うという認識です。


> 試しに、
> ---
> Log.d("CHECK", "before finish()");
> finish();
> Log.d("CHECK", "after finish()");

>...

通常、そうなるものと認識しています。
問題は、finish()をコールしたにもかかわらず、onDestory()が
呼ばれていないケースだと思います。そうならそれは重大で、
掘り下げて議論すべきだと思います。

デストラクタは呼ばれないことがある、というのはAndroidの
仕様だったと記憶しています。

そうめい

unread,
Sep 19, 2010, 11:51:39 AM9/19/10
to 日本Androidの会
みなさま

ご回答ありがとうございます。
とても助かります。


えっと、私の認識が少しズレていたのですかね?

『finish()を呼んでも、すぐに終了されるとは限らない』
ということでしょうか?



> finish()すれば、大抵即時終了するのに、一箇所だけ即時終了しない
> ということですか?

> もしかしてfinishその時点 で終了しないということですか?

そのとおりです。

該当箇所1か所だけが即時終了せず、
ほかの箇所では即時終了します。

もっというと、該当箇所も以前は即時終了していたのですが、
少しコードを改編したら即時終了しなくなってしまいました。



いままで即時終了していたのは『たまたま』だったということでしょうか?

だとすると、Androidでは『Cで言うexit() 』は存在しないのでしょうか?


よろしくお願いします。

tmsute

unread,
Sep 19, 2010, 12:26:54 PM9/19/10
to android-g...@googlegroups.com
tmsuteです。

(2010/09/20 0:51), そうめい wrote:
> いままで即時終了していたのは『たまたま』だったということでしょうか?
>
> だとすると、Androidでは『Cで言うexit() 』は存在しないのでしょうか

「Cで言うexit()」、が何をもたらすかという点で、OSごとに作用が
異なる(たとえばUnixなら親processがSIGCHILDを受け取るであろう
けど、他のOSではそうではないでしょう、とか)ので、ここで持ち出したこと
に少し後悔していますが、即時終了という点で「Cで言うexit()が
Androidにあるかどうか」という議論については、とりあえずないです、
というのが答えだと思います。

しかしそれは通常のJavaのAPIも含めて、ない、と言ってるのであって、
JNIなどを通じて作ってしまえば、あるのかも知れません。

それより、建設的には、finish()を呼んだ後にはすぐには終了しないかも
知れないけれど、ほとんどその直後に終了することになっているので、
終了する前に行うことはfinish()より前に行えばよく、最後にfinish()
と叫べばよい、という割と自然な結論でよいのではないでしょうか。

もしも、コールスタックが深いところで、なんらかの理由により、
コールスタックを巻き戻ることなく即刻終了しなければならないような
悲惨な事態になっているのなら、それは別途考えたいです。


もちこ。

unread,
Sep 19, 2010, 8:09:08 PM9/19/10
to 日本Androidの会
どうも、もちこ。です。

finish()のあとで何らかの処理が記述されていると、
finish()が無視されて終了されないようになることがあるようです。
finish()で終了されるものとされないものの差に疑問をお持ちならまずこの辺を疑ってみてはいかがかと。

そうめい

unread,
Sep 23, 2010, 4:34:41 PM9/23/10
to 日本Androidの会
みなさま

ご回答ありがとうございます。
解決いたしました。

結論から言うと、ご指摘いただいていた
『finish()のあとに何らかの処理がある』
が原因だったようです。

お騒がせいたしました。


finish() は人間から見たら即時終了でも
Androidから見たら即時終了ではないんですね。

しかし、ということは、
処理の間にIF文をはさんで
『この条件の時は終了、それ以外は続行』
というようなことはできないってことなんでしょうかね?

---
前処理
if (式) finish();
後処理
---


なんにせよ、無事解決いたしました。

ご協力くださったみなさま、ありがとうございましたm(_ _)m





Reply all
Reply to author
Forward
0 new messages