20

誰かが、次のことに関する具体的で信頼できる(そしてできれば簡潔な)情報の方向に私を押してくれませんか?

  1. コンポーネントがシステムによって破棄され、(該当する場合) 再作成される順序 (フラグメント、アクティビティ、アクティビティの Threads/AsyncTasks/Timers、静的データ (いつクラスがアンロードされるか)、他のクラスの Threads/AsyncTasks/Timers、ホスト TabActivity、アプリがバックグラウンドにある場合とフォアグラウンドにある場合の両方で、ActivityGroup、バインドされたローカル サービス、アプリケーション、プロセス)。
    どの時点で破壊を停止できますか (アプリケーションに戻ったときに、「Application オブジェクトを含むすべてが破壊され、プロセスは生きている」など、どのような状態になる可能性がありますか?

  2. (Androidを変更せずに)プログラムで同じ種類の破壊を自分自身で引き起こし、システムがそれを行うときと見分けがつかないようにすることは可能ですか、それとも私たち自身がメモリを解放することを選択したとき(onLowMemoryによってトリガーされる)に必要な別のメカニズムですか?

  3. 1) からのすべてのシナリオの信頼できる再現手順 (junit.framework でしょうか? 私はそれを調査していません) ?

  4. ユーザーが長時間タスクを離れた場合、システムはルート アクティビティを除くすべてのアクティビティのタスクをクリアします。ユーザーが再びタスクに戻ると、ルート アクティビティのみが復元されます」: これはプロセス/コンポーネントとは別にありますかライフサイクル/破壊、またはそれに関連付けられていますか?

私は、多くの場合不完全で誤解を招き、時には間違った情報を提供するさまざまな情報源を読みました。
確かに、私はドキュメントの一部をざっと読んだので、何かを見逃したり誤解したりしている可能性があります。

[編集] 誤解を避けるために: 私が求めているのは、Android がコンポーネントを破棄してメモリを解放し、 Activity.onDestroyをバイパスすることです。
アプリをバックグラウンドにして後で戻ると、次のいずれかのシーケンスが発生します。

  • onPause、onStop、onRestart、onStart、onResume
  • onPause、onStop、Application.onCreate、onCreate(notNull)、onStart、onResume

[EDIT2] バウンティ開始。信頼できる情報が必要です: アクティビティ、フラグメント、アプリケーション、バインドされた (リモートの可能性がある) サービス、プロセス。
部分的/完全な破壊のシナリオ。最初のポイントを参照してください。

4

6 に答える 6

1

さて、友よ、あなたは研究で多くの問題を抱えていると思います。基本的に、Dalvik ガベージ コレクターと Android ヒープ マネージャーの 2 つのブラック ボックスについて話しているためです。Androidがオブジェクト破壊の順序に従うとは信じられないと思います。しかし、このライフサイクルが続くことは信頼できます [Programming Android, 2011]:

アクティビティのライフサイクル:

onCreate() - Called after the instance of the activity has been created for the first  time
onRestart() - Called after an activity has been interrupted, just before the onStart();
onStart() - Called when the object activity and their visions become visible to the user;
onResume()-  Called when the object activity and their visions become interactive to the user;
onPause() - Called when a different instance of the activity is going to get visible and the present activity ceases to interact with the user
onStop() - Called when the activity is no longer visible or is not interacting
onDestroy() - Called when an activity instance must be destroyed and it's no longer needed. 

フラグメントには、メソッド onAttach、onCreateView、および onActivityCreated を含むさまざまなライフサイクルがあります。しかし、なぜオブジェクトの破壊順序を気にするのでしょうか? このようなイベントを監視する理由はわかりませんが、本当に必要な場合は、ガベージ コレクターについて詳しく学んでください。

于 2013-06-14T03:38:15.517 に答える
1

これは私の経験と、私が尋ねた開発者の経験が示唆しているようです:

    • フラグメントは自動破棄されません。
    • アプリのスタック上の非表示のアクティビティは、任意の順序および任意の数で自動破棄できます。
    • 破棄されたアクティビティ (または他のクラス) のスレッドと静的は、アプリケーションが破棄されるまでそのまま残ります。
    • TimerTasks: テストしていません。
    • バインドされたローカル サービス: 最後のバインディング アクティビティとアプリケーションの破棄の間のどこかで破棄されます。
    • アプリケーションはプロセス内で最後に実行されるものであり、すべてのスレッドと共に「実行」されます。
    • 自動タスク キラーがない限り、アプリケーション オブジェクトの破棄後、プロセスは長時間 (20 分以上) 存在する可能性があります。
    • TabActivity または ActivityGroups 内のアクティビティは自動破棄されませんが、コンテナーが破棄されるとすべてが一度に実行されます。
      例: タブの下に ActivityGroups がある TabActivity。すべてのアクティビティがライブです。フルスクリーンで別のアクティビティが開始されます。すべてが含まれている TabActivity は、Android による破棄の対象になりました。一度に、またはまったく破棄できません。
  1. いいえ
    アクティビティを手動で破棄すると、アクティビティはライフサイクル全体を通過し、再起動時に onCreate にバンドルを渡しません。
    また、onLowmemory は信頼できません。小さな割り当てステップであっても、OutOfMemoryError がスローされる前に呼び出されることはありません。
  2. いいえ
    自動破壊/復元は Android の主要な機能ですが、そのようなシナリオをテストする方法はありません。
  3. これはおそらく、プロセスがまだ存在するかどうかにのみ関連しています。その場合、Android は古いアクティビティの復元を試みます。そうでない場合は、クリーンな再起動です。

上記には、いくつかの仮定が含まれています。
私はまだ誰かがそれを確認し、いくつかのドキュメントを提供するのを待っています (クラスの現在の実装に依存しないことを保証します)。
これのいずれかが間違っている場合は、私を修正してください。

編集: 上記の情報は古くなっている可能性があります。Android 2.1-2.3 でテストされています。

于 2011-12-01T11:32:16.910 に答える
0

これは完全な答えではありませんが、これらの各方法でトーストメッセージを配置することをお勧めします。onPause()独自のonStop()、、などを追加し、onResume()内部に次のような行を入力します。

Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show();

これらのメソッドを直接呼び出すことはできませんが、別のアクティビティをスタックの最上位に移動すると、既存のアクティビティのこれらのメソッドが呼び出されます。もう1つ覚えておくonCreate()べきことは、アクティビティを開始するたびに呼び出す必要がないということです。たとえば、このインテントを送信するかどうかなど、アクティビティをどのように開始するかによって異なります。

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);

onNewIntent()すでに作成されている場合は、代わりに呼び出しが表示されます。要約すると、最高のことはトーストメッセージを見ることです。また、デバッガーの使用に集中する必要があります。各メソッドにブレークポイントを設定すると、それを確認できます。私が確信していることの1つは、のようなこれらのメソッドを直接呼び出すことはできないということですonPause()onDestroy()また、一般的に、いつ呼び出されるかわからないことにも注意してください。

于 2011-11-12T02:12:36.027 に答える
0
  1. ActivityManagerService#trimApplications() メソッドは、アプリケーションの現在のレシーバーが null で、アクティビティやサービスがない場合、未使用のアプリケーション プロセスを削除します。
于 2013-08-29T01:37:54.093 に答える
0

アクティビティに関しては、開発者が手動で finish() 関数を呼び出さない限り、Destroy() でのみ破棄されます。

フラグメントのライフ サイクルはその親アクティビティと完全に一致するため、親アクティビティが Destroy() で破棄されると、Destroy() のフラグメントも呼び出されます。

タイマー タスクは作業を終了し、ガベージ コレクションの候補になります。アクティビティがそれらを作成すると、タスクは独自のスレッドで実行されます。アクティビティとは関係なく、アクティビティが破棄されても、タスクは終了します....

于 2013-10-09T18:24:43.043 に答える