ゴールデンナインシルバーテン10のホッピングシーズンです。インタビューでより多くの友達がより良いオファーを得ることができるように、BATのよくあるインタビューの質問は時々共有されます。内容が多いため、読書が必要になることが予想されます... 。3ヶ月
今日は、主に4つの主要コンポーネントのアクティビティ関連の知識ポイントについてお話します。
アクティビティのライフサイクルを説明してください。
- onCreate()アクティビティが初めて作成されるときに呼び出されます。初期化操作の一部はここで完了できます。
- onStart()このメソッドは、アクティビティが非表示から表示に変更されたときに呼び出されます。
- onResume()メソッドは、アクティビティがユーザーと対話する準備ができたときに呼び出されます。このとき、アクティビティはリターンスタックの一番上にあり、実行状態である必要があります。
- onPause()このメソッドは、システムが別のアクティビティを開始または再開する準備ができたときに呼び出されます。
- onStop()メソッドは、アクティビティが完全に非表示になるときに呼び出されます。これとonPause()メソッドの主な違いは、開始された新しいアクティビティがダイアログスタイルのアクティビティの場合、onPause()メソッドは実行されますが、onStop()メソッドは実行されないことです。
- onDestroy()メソッドは、アクティビティが破棄される前に呼び出され、その後、アクティビティの状態は破棄された状態になります。
- onRestartメソッドは、アクティビティが停止状態から実行状態に変わる、つまりアクティビティが再開される前に呼び出されます。
ライフサイクル:メモリを統合するために、もう一度描画します。
アクティビティ間をジャンプするときのライフサイクル
AアクティビティがBアクティビティを開いたときに利用できるライフサイクルコールバックは何ですか?
A.onPause-> B.onCrete-> B.onStart-> B.onResume-> A.onStop
BアクティビティのlaunchModeが標準である場合、またはBアクティビティの再利用可能なインスタンスがない場合のみであるため、この回答は単にを渡しています。
BアクティビティのlaunchModeがsingleTopであり、Bアクティビティがすでにスタックの一番上にある場合(通知バーのクリックやドットなどの特殊なケース)、Bページのみにライフサイクルの変更があります。
B.onPause-> B.onNewIntent-> B.onResume
BアクティビティのlaunchModeがsingleInstance、singleTaskであり、対応するBアクティビティに再利用可能なインスタンスがある場合、ライフサイクルコールバックは次のようになります。
A.onPause-> B.onNewIntent-> B.onRestart-> B.onStart-> B.onResume-> A.onStop->(Aがスタックから削除された場合、別のA.onDestoryがあります)
活動開始モード
起動モードは4つあります。
- 標準標準モード
- シングルトップスタックトップ多重化モード
- singleTaskスタック多重化モード
- singleInstanceシングルトンモード
標準モード:起動するたびに、
スタックの一番上に新しいインスタンスが作成されます再利用モード:新しく作成されたインスタンスがスタックの一番上にある場合、インスタンスは再構築されませんが再利用されます。それ以外の場合は再作成されます。
スタック内再利用モード:インスタンスが現在のスタックに既に存在する場合、現在のインスタンスより上の他のすべてのインスタンスがスタックから削除されます。
シングルトンモード:新しいスタックを直接作成し、スタック上にインスタンスを作成します。
使い方:
1. AndroidMainifestのアクティビティ設定で設定できます:android:launchMode = "start mode"
2. Intentでフラグビットを設定します
val intent=Intent(this,SocendActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
//其中标志位属性
FLAGACTIVITYSINGLE_TOP:指定启动模式为栈顶复用模式( SingleTop)
FLAGACTIVITYNEW_TASK: 指定启动模式为栈内复用模式( SingleTask)
FLAGACTIVITYCLEAR_TOP:所有位于其上层的Activity都要移除, SingleTask模式默认具有此标记效果
FLAGACTIVITYEXCLUDEFROMRECENTS:具有该标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity上
では、これら2つの方法の違いは何ですか?
- 優先度異なるインテント設定方法の優先度>マニフェスト設定方法、つまり前者が優先されます。
- FLAG_ACTIVITY_CLEAR_TOPは制限付きスコープのマニフェスト設定モードでは設定できず、シングルインスタンスモード(SingleInstance)はインテント設定モードでは設定できません
onStart、onStop、onResume、onPauseの違いは?
アクティビティのライフサイクルでは、それらのほとんどは互いに向かい合っており、前景、可視、および背景の3つのタイプに分類できます。onStartとonStopの間のエクスペリエンスは表示されますが、ユーザーと対話できない場合があります。onResumeとonPauseの間のエクスペリエンスはフォアグラウンドに属し、ユーザーはこの時点で対話できます。
新しいアクティビティが透明なテーマである場合、古いアクティビティはonStopになりますか?
しない!
画面のロックと画面のロック解除、アクティビティはどのようにライフサイクルを実行しますか?
画面がロックされている場合、onPause()のみが呼び出され、onStopメソッドは呼び出されず、画面がオンになった後、onResume()が呼び出されます。
横画面と縦画面を切り替えるときのライフサイクルは何ですか?
android:configChanges属性がマニフェストファイルで設定されていない場合、ライフサイクル:最初にonPause()、onStop()、onDestroy()を破棄してから、onCreate()、onStart()、onResume()メソッドを再作成します。
orientation | screenSize(同時に表示する必要がある)プロパティ値を設定する場合、ライフサイクルメソッドは使用されず、onConfigurationChanged()メソッドのみが実行されます。
ポップアップダイアログはライフサイクルにどのような影響を与えますか?
ライフサイクルコールバックはすべて、アプリケーションプロセスに通知するためにバインダーを介してAMSによって呼び出され、ポップアップダイアログ、トースト、およびPopupWindowは基本的にWindowManager.addView()(AMSなし)を介して直接表示されるため、ライフサイクルに影響はありません。影響あり。
テーマがダイアログのアクティビティを開始する場合、ライフサイクルは次のとおりです。
A.onPause-> B.onCrete-> B.onStart-> B.onResume
注:前のアクティビティがない場合、onStopはコールバックされません。これは、onStopがバックグラウンドに切り替えられて表示されない場合にのみコールバックされるためです。また、ダイアログテーマのアクティビティがポップアップ表示されても、前のページは表示されますが、フォーカスは失われるため、onPauseのみが存在します。折り返し電話。
onResumeの後でのみアクティビティが表示される理由は何ですか?
Activityのレイアウトを設定しますが、通常、onCreateメソッドでsetContentViewを呼び出します。内部では、ウィンドウのsetContentViewを直接呼び出して、作成したレイアウトをラップするDecorViewを作成します。詳細は次のとおりです。
PhoneWindow.java
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
}
...
// 加载布局,添加到 mContentParent
// mContentParent 又是 DecorView 的一个子布局
mLayoutInflater.inflate(layoutResID, mContentParent);
}
ただし、この手順ではレイアウトをロードしてViewTreeを生成するだけです。答えは次のとおりです。
ActivityThread.java
public void handleResumeActivity(...){
// onResume 回调
ActivityClientRecord r = performResumeActivity(...)
final Activity a = r.activity;
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
ViewManager wm = a.getWindowManager();
wm.addView(decor, l);// 重点
}
}
WindowManagerのaddViewメソッドは、最後にDecorViewをWMSに追加します。これにより、画面への描画とタッチスクリーンイベントの受信が可能になります。特定の呼び出しチェーンは次のとおりです。
WindowManagerImpl.addView
-> WindowManagerGlobal.addView
-> ViewRootImpl.setView
-> ViewRootImpl.requestLayout() // 执行 View 的绘制流程
// 通过 Binder 调用 WMS ,WMS 会添加一个 Window 相关的对象
// 应用端通过 mWindowSession 调用 WMS
// WMS 通过 mWindow (一个 Binder 对象) 调用应用端
mWindowSession.addToDisplay(mWindow)
要約すると、onResumeコールバックの後、ViewRootImplが作成されます。その後、アプリケーションはWMSとの双方向呼び出しを行うことができます。
onActivityResultはどの2つのライフサイクルの間にコールバックしますか?
onActivityResultはActivityのライフサイクルに属していません。一般に、この質問をすると誰もが混乱します。
実際、答えは非常に簡単です。答えはonActivityResultメソッドのコメントに書き込まれます。
「アクティビティが再開すると、onResume()の直前にこの呼び出しを受け取ります。」
コード(TransactionExecutor.executeに興味がある場合は、自分で中断できます)をたどると、onActivityResultコールバックがアクティビティのすべてのライフサイクルコールバックに先行することがわかります。BアクティビティからAアクティビティへのライフサイクルコールは次のとおりです。
B.onPause-> A.onActivityResult-> A.onRestart-> A.onStart-> A.onResume
onCreateメソッドで無限ループを作成すると、ANRが発生しますか?
ANRの4つのシナリオ:
- サービスのタイムアウト:サービスは指定された時間内に実行されませんでした:フォアグラウンドサービスの場合は20秒、バックグラウンドの場合は200秒
- BroadCastQueue TimeOut:ブロードキャストは指定された時間内に処理されません:フォアグラウンドブロードキャストから10秒以内、バックグラウンドから60秒以内
- ContentProvider TimeOut:公開が10秒以内に完了しません
- 入力ディスパッチタイムアウト:5秒以内にキーボード入力、タッチスクリーン、その他のイベントに応答しません
ActivityのライフサイクルコールバックのブロックがANRをトリガーするシーンにないため、ANRが直接トリガーされないことがわかります。
無限ループがメインスレッドをブロックするだけで、上記の4つのイベントがシステムで発生した場合、対応する時間内に処理されず、ANRがトリガーされます。
onNewIntentはいつ呼び出されますか?
開始する必要のあるインスタンスが以前に開かれ、スタックの一番上にある場合、そのインスタンスは現在onPause、onStop状態であり、他のインスタンスが再び入る場合、実行順序はonNewIntent、onRestart、onStart、onResumeです。
onSaveInstanceState()メソッドは何をしますか?
異常な状況下で、システム構成が変更されると、アクティビティが強制終了および再作成され、リソースメモリが不十分なために優先度の低いアクティビティが強制終了されます
- システムは、onSaveInstanceStateを呼び出して現在のアクティビティ状態を保存します。このメソッドはonStopの前に呼び出され、onPauseとのタイミング関係は確立されていません。
- アクティビティが再構築されると、システムはonRestoreInstanceStateを呼び出し、onSave(略称)メソッドによって保存されたBundleオブジェクトをonRestore(略称)とonCreate()に同時に渡すため、これらの2つのメソッドを使用して、アクティビティが再構築されているかどうかを確認できます。 onStart後;
アクティビティ、ウィンドウ、ビューの関係は?
- Activityが作成されると、attach()メソッドを呼び出してPhoneWindow(Windowから継承)を初期化し、各Activityには一意のPhoneWindowが含まれます
- アクティビティは実際にsetContentViewを介してgetWindow()。setContentViewを呼び出してビューをPhoneWindowに設定し、PhoneWindowはWindowManager、addView、removeView、およびupdateViewLayoutの3つのメソッドを介して内部的にビューを管理します。WindowManagerは本質的にインターフェイスであり、最終的にWindowManagerImplによって実装されます
アプリの起動プロセス
1.デスクトップアプリアイコンをクリックします。Launcherプロセスは、Binder IPCを使用して、system_serverプロセスへのstartActivityリクエストを開始します。2。system_server
プロセスは、リクエストを受信した後、zygoteプロセスにプロセスを作成するリクエストを送信します。3。Zygote プロセスは、
Appである新しい子プロセスをforkします。プロセス;
4.アプリプロセスは、Binder IPCを介してsytem_serverプロセスへのattachApplicationリクエストを開始します;
5.リクエストを受信した後、system_serverプロセスは一連の準備を実行し、バインダーIPCを介してscheduleLaunchActivityリクエストをアプリプロセスに送信します;
6.アプリプロセスバインダースレッド(ApplicationThread)がリクエストを受信すると、ハンドラーを介してLAUNCH_ACTIVITYメッセージをメインスレッドに送信します。7。メッセージを
受信した後、メインスレッドは起動メカニズムを通じてターゲットアクティビティを作成し、Activity.onCreate()などのメソッドを呼び出します。
やっと
インタビュー用のロケットを作り、仕事でネジを締めます。ネジを締めたいだけですが、ロケットを組み立ててネジを締める作業を見つける必要があります。
面接で質問する必要があるHandlerメカニズムなど、理解するだけでなく、面接担当者が理解を認識できるようにそれらをうまく表現できるようにする必要がある点がいくつかあります。いくつかのあいまいな点があります。おそらくそれはインタビューにのみ存在し、実際の作業ではまったく使用しませんが、それが何かを知っている必要があります。
いくつかの基本的な知識と理論を覚えておく必要がありますが、理解する必要がある場合は、それらを母国語で要約して記憶してください。
それで、どのようにレビューするのですか?
皆さんのために次のレビュー資料を用意しました。
「Android開発7モジュールのコアナレッジノート」
「960ネットワーク全体で最も完全なAndroid開発ノート」
「379ページのAndroid開発インタビュー集」
6か月をかけて、市場で最も包括的なAndroidインタビューの質問をまとめました。Daquanに
は、Tencent、Baidu、キビ、アリ、TV Plus、USグループ、58、チーター、360、Sina、Sohuおよびその他のインターネット企業の第一線のインタビューが含まれていますトピック。この記事に記載されている知識ポイントに精通していると、技術面接の最初の2ラウンドに合格する可能性が大幅に高まります。
どうやって使うのですか?
1.必要なナレッジポイントをカタログインデックスから直接参照して、不足しているポイントを確認できます。
2. 5つ星の星の数は、インタビューの頻度を示し、重要な推奨指標を表します
「507ページのAndroid開発関連のソースコード分析」
プログラマーである限り、それがJavaでもAndroidでも、ソースコードを読まずにAPIドキュメントだけを見ても、肌に残るだけです。これは、ナレッジシステムの確立と完全性、および実際の戦闘技術の向上には適していません。
本当に最も能力を発揮できるのは、直接ソースコードを読み取ることです。主要なシステムのソースコードを読み取るだけでなく、さまざまな優れたオープンソースライブラリも含まれます。
マテリアルが多すぎるため、すべての表示が長さに影響します。当面は、これらのスクリーンショットの一部を最初にリストします。上記のリソースは無料で共有でき、上記のコンテンツはオープンソースプロジェクトに含まれています:[ github ]。自分で入手できます。