2010-11-28 8 views
0

実行時にアクティビティがいつ、どのように殺されるかの概要を誰にも教えてください。一時停止した状態と停止した状態の違いを知りたい。停止されたアクティビティ、停止したのとまったく同じ(メモリ不足の)理由をシステムに強制する可能性があるのは何ですか?アクティビティがシステムによってどのように殺されるかの概要

電話がかかって(突然メモリ不足のために)アクティビティが一時停止した場合、システムは単に停止したアクティビティのリソースを解放することを好みます。しかし、それはどのように行われますか? finish()を呼び出すことによってアクティビティを「親切に」尋ねるのはいつですか?そうでない場合は、いつonDestroy()も呼び出されますか?

+0

[developer.android.com](http://developer.android.com/guide/topics/fundamentals.html#actlife)の 'Application Fundamentals'セクションのアクティビティライフサイクルの詳細な説明があります。あなたの質問のほとんどに答える必要があります。 –

+0

いいえ、上記の質問には答えません。あなたがそれを疑うなら一見をしてください。 – cody

+0

@cody:Josefがリンクしているドキュメンテーションで実際に時間をかけて*読んだら、Androidアプリケーションのライフサイクルがどのように機能するかを理解する必要があります。まだ不明なことがいくつかある場合は、これについて*具体的な質問をすることをお勧めします。 – Nailuj

答えて

4

あなたが尋ねたことの大部分はドキュメントによってかなりよく説明されていますが、私はいくつかのことを明確にすることができます。

私は一時停止と停止状態の違いを知りたいと思います。

視認性。一時停止したアクティビティは、Dialogテーマが適用されたアクティビティなどの別のアクティビティによって部分的にしか隠されない可能性があるため、2つの状態が区別されます。そのためには、視覚的な状態を維持するために必要なリソースをすべて保持する必要があります。停止した活動は、リソースが逼迫している場合には、破壊されている活動と保存されている活動との間に差異を生み出す可能性のあるそれらの資源を投棄することができる。

私は...単にシステムが停止した 活動のressourcesを解放するために を好むと思います。しかし、それはどのように行われますか?

です。停止した活動は完全に見えないので、ユーザーが見ているものに何らかの貢献をしているものよりも殺害の候補になります。私はAndroidが再開されたものの中から中断された、しかし部分的に目に見えるものを取り除いたことは決して見たことがありませんが、適切な状況下で起こる可能性があります。システムは各アクティビティの状態を把握しているため、アクティビティの状態を把握しています。システムは、(仕上げを呼び出すことによって 活動を「親切に尋ねる」ん

)とするとき ない、とonDestroy()がまだ 呼び出されるのでしょうか?それができるシステムが秩序破壊を行います

が、APIのみ保証は活動が今までonPause()onSaveInstanceState()が表示されますということです。

ETA:アクティビティがスタックから削除される理由は、ソースにあります。あなたは普遍的な真実であるその理由に頼るべきではありません。なぜなら、Androidの将来のバージョンがその意思決定を異ならせるかもしれないからです。

+0

ありがとう、それはそれを明確にするのに役立ちました。したがって、onDestroy()とonStop()が呼び出されない場合もあります。 – cody

4

コースのために、私は見る!私は、貴重な情報と、高価な誤情報が混在しているのを見ています。いいえ、オンラインドキュメントは、プロセスがどのような状況で死んでいるかを正確に特定するものではありません。これは予告なしに変更される可能性があるため、これは意図的なものです。確かに、onDestroy()が呼び出される最も一般的な理由は、システムのメモリが不足していることです。新しい電話ではあまりメモリがないため、あまり一般的ではありません。しかしそれがそれが呼び出される唯一の理由であるという保証はない。

しかし、Androidと開発者の間の契約は、必要なときに必要なライフサイクルコールバックを実装してルールを遵守すると、機能し、あなたはどんな状況下で正確に知る必要がないということですonStop()、onSaveInstanceState()およびonDestroy()が呼び出されます。

Googleとは異なり、私は契約の文言がポイントでやや曖昧であることを認めます。これは、他の理由が少ない中で、「フォアグラウンド」などの業界標準の意味を持つ用語を使用するためですが、若干変更された意味で使用しているためです。そして、変更は決して説明されないか、あいまいな場所でのみ説明される。また、ダイアグラムが「アクティビティが状態間で取る可能性のあるパス」を示すことを目的としていても、onDestroy()を何度も呼び出すことができず、ResumedからStoppedへの遷移を回避することもできません。しかし、そのテキストはその可能性をはっきりと説明している。

これは、残念ながら、「Application Fundamentals」のApplication Lifecycleセクションを読むだけでは不十分である理由です。その代わりに、アクティビティのコールバックの各コールバックのJavadocと、プロセスの「アプリケーションの基礎」のセクションも参照する必要があります。

その後、各コールバックにLog.dステートメントを配置し、ライフサイクルを通じてアプリケーションを循環させながらlogcat出力を監視することは非常に役に立ちます。しかし、それでも、上記のオンラインドキュメントのいずれかでそれを正当化することができない限り、logcatで表示されるライフサイクルイベントに依存しないでください。

関連する問題