0

明確な答えを探してみましたが見つからなかったのでこちらで質問させていただきます。これがnOObの質問である場合はお詫び申し上げます。

私の質問は、Android はアクティビティの範囲外のビューのインフレをキャッシュしますか?

2 つのアクティビティがあるサンプル アプリを作成しました

活動A 活動B

A には B を起動するボタンがあるだけです。B にはかなり複雑なレイアウトがあります。

B にはビュー スタブがあり、ViewStub のインフレーション (基本的にレイアウト全体をレンダリングする) のタイミングを計りました。

Bのレイアウトが膨らむのにかかる時間を計ったとき。初回 約100msかかりました。さらなるインフレには 15 ~ 20 ミリ秒かかりました。奇妙な部分は、数回の反復の後、ランダムに B が再び膨張するのに 100 ミリ秒以上かかることでした。

また、複雑なアクティビティ (B) が破棄され、再び作成されることも確認しました (B から反撃し、A から B を再度起動したため)。

なぜこれが起こっているのかを説明できるAndroidコードベースには何も見つかりませんでした。

このキャッシュがどこで行われているのか誰か教えてください。

以下は、ComplexActivity の onCreate および onDestroy のログです。バックプレスを使用してアクティビティを破壊しています

04-30 13:32:09.879: I/testInflation(19298): onCreate setting up content view
04-30 13:32:09.895: I/testInflation(19298): onCreate content view set. Time took = 15 ms.
04-30 13:32:09.895: I/testInflation(19298): onCreate inflating ui
04-30 13:32:10.004: I/testInflation(19298): onCreate ui inflated. Time took = 108 ms. Total time into method = 123 ms.
04-30 13:32:12.450: I/testInflation(19298): activity destroyed
04-30 13:32:12.903: I/testInflation(19298): onCreate setting up content view
04-30 13:32:12.911: I/testInflation(19298): onCreate content view set. Time took = 13 ms.
04-30 13:32:12.911: I/testInflation(19298): onCreate inflating ui
04-30 13:32:12.926: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 26 ms.
04-30 13:32:13.958: I/testInflation(19298): activity destroyed
04-30 13:32:14.379: I/testInflation(19298): onCreate setting up content view
04-30 13:32:14.395: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:14.395: I/testInflation(19298): onCreate inflating ui
04-30 13:32:14.403: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 22 ms.
04-30 13:32:15.223: I/testInflation(19298): activity destroyed
04-30 13:32:15.622: I/testInflation(19298): onCreate setting up content view
04-30 13:32:15.637: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:15.637: I/testInflation(19298): onCreate inflating ui
04-30 13:32:15.645: I/testInflation(19298): onCreate ui inflated. Time took = 13 ms. Total time into method = 24 ms.
04-30 13:32:16.692: I/testInflation(19298): activity destroyed
04-30 13:32:17.934: I/testInflation(19298): onCreate setting up content view
04-30 13:32:17.950: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:17.950: I/testInflation(19298): onCreate inflating ui
04-30 13:32:17.965: I/testInflation(19298): onCreate ui inflated. Time took = 18 ms. Total time into method = 30 ms.
04-30 13:32:19.020: I/testInflation(19298): activity destroyed
04-30 13:32:23.825: I/testInflation(19298): onCreate setting up content view
04-30 13:32:23.833: I/testInflation(19298): onCreate content view set. Time took = 12 ms.
04-30 13:32:23.833: I/testInflation(19298): onCreate inflating ui
04-30 13:32:23.848: I/testInflation(19298): onCreate ui inflated. Time took = 11 ms. Total time into method = 23 ms.
04-30 13:32:26.622: I/testInflation(19298): activity destroyed
04-30 13:32:27.145: I/testInflation(19298): onCreate setting up content view
04-30 13:32:27.161: I/testInflation(19298): onCreate content view set. Time took = 15 ms.
04-30 13:32:27.161: I/testInflation(19298): onCreate inflating ui
04-30 13:32:27.231: I/testInflation(19298): onCreate ui inflated. Time took = 69 ms. Total time into method = 85 ms.
04-30 13:32:28.200: I/testInflation(19298): activity destroyed
04-30 13:32:28.645: I/testInflation(19298): onCreate setting up content view
04-30 13:32:28.661: I/testInflation(19298): onCreate content view set. Time took = 11 ms.
04-30 13:32:28.661: I/testInflation(19298): onCreate inflating ui
04-30 13:32:28.747: I/testInflation(19298): onCreate ui inflated. Time took = 91 ms. Total time into method = 102 ms.
4

1 に答える 1

0

android:launchMode アクティビティの起動方法に関する指示。Intent オブジェクトのアクティビティ フラグ (FLAG_ACTIVITY_* 定数) と連携して、インテントを処理するためにアクティビティが呼び出されたときに何が起こるかを決定する 4 つのモードがあります。彼らです:

"標準"

「シングルトップ」

「シングルタスク」

「単一インスタンス」

デフォルトのモードは「標準」です。

一方には「標準」および「singleTop」アクティビティがあり、もう一方には「singleTask」および「singleInstance」アクティビティがあります。「標準」または「singleTop」起動モードのアクティビティは、複数回インスタンス化できます。インスタンスは任意のタスクに属することができ、アクティビティ スタック内のどこにでも配置できます。通常、それらは startActivity() を呼び出したタスクに起動されます ( Intent オブジェクトに FLAG_ACTIVITY_NEW_TASK 命令が含まれている場合を除きます。この場合、別のタスクが選択されます — taskAffinity 属性を参照してください)。

対照的に、「singleTask」および「singleInstance」アクティビティは、タスクを開始することしかできません。それらは常にアクティビティ スタックのルートにあります。さらに、デバイスが一度に保持できるアクティビティのインスタンスは 1 つだけです。そのようなタスクは 1 つだけです。

したがって、バックスタックからのアクティビティを使用するよりも、デフォルトでは標準です。android Activity stack についてお読みください。アクティビティがバックスタックなどから来ているとき。ヒープに多くのオブジェクトがあるため、アクティビティを再度起動すると時間がかかりません

このドキュメントに従って、アクティビティがスタックからポップされると...破棄されます。http://developer.android.com/guide/components/tasks-and-back-stack.html

しかし、あなたの活動はあなたがそれを起動するときに異なる時間を要します. これは、システムのガベージ コレクターが一定期間実行され、オブジェクトに割り当てられたメモリがクリアされるためです。したがって、アクティビティ A を開始した後、アクティビティ B に移動します。戻るボタンを押しています。つまり、アクティビティ B がスタックからポップアウトされ、すぐに破棄されます。しかし、ガベージ コレクターが実行される前にそのアクティビティを開始しています。時間が短いのはそのためです

System.gc() を on destroy で実行するか、 onPause() で finish() を書き込む ...ur アクティビティは、レイアウトを拡張するのにほぼ同じ時間を要します。

于 2013-04-30T20:50:06.020 に答える