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
(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の
仕様だったと記憶しています。
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...
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の
仕様だったと記憶しています。
(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()
と叫べばよい、という割と自然な結論でよいのではないでしょうか。
もしも、コールスタックが深いところで、なんらかの理由により、
コールスタックを巻き戻ることなく即刻終了しなければならないような
悲惨な事態になっているのなら、それは別途考えたいです。