ホームページ >ウェブフロントエンド >フロントエンドQ&A >Android の面接体験を共有する [選択済み]

Android の面接体験を共有する [選択済み]

藏色散人
藏色散人転載
2020-07-31 15:09:554906ブラウズ

おすすめ:「2020 Android面接質問まとめ【集】

私は年初から多くの企業の面接に参加してきましたが、大手企業やその他の企業からいくつかのオファーを受けました。経験を要約することは、過去の振り返りと要約でもあります。

1. 履歴書

プログラマの履歴書に関するガイダンスはインターネット上にたくさんあるので、ここでは繰り返しません。インターネットで他の専門家の要約を検索して、自分の状況に基づいて変更してください。いくつか提案があります:

1. 派手にならないようにしましょう。プログラマーはデザイナーやプロダクト オペレーターとは異なります。私たちの履歴書が合否を決めるのは技術面接官であり、技術面接官が何を重視するかは技術面接官にあります。プロジェクトの経験内容とテクノロジーの説明。

2. スキルの説明では、自分が知っていて深く理解していることだけを書くようにしてください。新しいテクノロジーや人気のあるフレームワークを適宜追加することもできますが、これを理解する必要があります。ソース コードを読んで、それについて専門家が言ったことを見てみましょう。インターネット上には多くの要約があります。

3. 使用されたテクノロジー、使用された設計パターン、最適化されたデータ比較、詳細な概要など、プロジェクト エクスペリエンスにキーワードを追加するようにしてください。単にプロジェクトの内容(つまりプロダクトマネージャーの説明)を紹介するのではなく、例えばパフォーマンスの最適化をUIパフォーマンスの最適化、メモリの最適化、データベースの最適化、ネットワークの最適化、消費電力の最適化などに分けて紹介します。 1. 問題の発見方法、2. 問題の解決方法、3. 解決効果の比較の観点から説明できます。簡単な例を挙げると、UI の最適化では、UI でどのような問題が発生しているか (スタックやスムーズでない)、問題の発見方法 (モバイル開発者の権限 > GPU のオーバー描画でレイヤーの問題が見つかった、TraceView の CPU 使用率分析) を確認できます。問題の解決方法(レベルを下げる、カスタムビューの描画の問題など) 問題を解決した後、再度パフォーマンスを比較してください。

2. スキルリザーブ

(1) Java

1. HashMap と Hashtable の違いは何ですか?

これについてはソース コードを読む必要があります。ソースコードを見てください!ソースコードを見てください!どうしても我慢できない場合は、オンラインにアクセスして他の人の分析を読むこともできます。簡単な概要:

1. HashMap は null Key と null Value をサポートしますが、Hashtable はそれを許可しません。これは、HashMap が null に対して特別な処理を実行し、null の hashCode 値を 0 に設定し、ハッシュ テーブルの 0 番目のバケットに格納するためです。

2.HashMap は非スレッドセーフです。HashMap でスレッドセーフを実装するメソッドは、Map map = Collections.synchronziedMap(new HashMap()); です。Hashtable はスレッドセーフです。

3.HashMap のデフォルトの長さは 16 です。展開は元の 2 倍です。Hashtable のデフォルトの長さは 11 で、展開は元の 2n です。1

4.HashMap は AbstractMap を継承し、Hashtable は Dictionary を継承します。

拡張機能、HashMap と ConcurrentHashMap の比較、HashMap と SparseArray の比較、LinkedArray と ArrayList、ArrayList と Vector

2. Java ガベージ コレクション メカニズム

JVM を理解する必要があります。メモリ分割 - メソッド領域、メモリ ヒープ、仮想マシン スタック (スレッド プライベート)、ローカル メソッド スタック (スレッド プライベート)、プログラム カウンター (スレッド プライベート)、リサイクル アルゴリズムの理解 - マークおよびクリア アルゴリズム、到達可能性分析アルゴリズム、マークおよびソート アルゴリズム、コピーアルゴリズム、世代別アルゴリズム、メリットとデメリットを理解してください。

詳細については、他の学生が書いた内容を読み、クリックしてリンクを開くことができます。

3. クラス読み込みメカニズム

これは、ホット リペアと組み合わせることができます。深い理解。クリックしてリンクを開きます。

4. スレッドとスレッド プール、同時実行性、ロック、および一連の問題

これは展開できます。スレッド プールを自分で実装するにはどうすればよいですか?

5. HandlerThread と IntentService を理解する

6. 弱参照とソフト参照の違い

7. int と Integer の違いは何ですか

主に値の転送と参照の受け渡しの問題を評価します

8. 手書きのプロデューサー/コンシューマー モデル

(2) Android

1. Android の起動モード

必要があります。アクティビティ スタックと taskAffinity を理解する

1.Standard: システムのデフォルト、毎回もう 1 つのアクティビティ インスタンスが開始されます

2.SingleTop: スタックの最上位が再利用されます。スタックのライフサイクルは onCreate() および onStart() を経由せず、onNewIntent() が呼び出されます。これは、ニュース プッシュ詳細アクティビティなどのメッセージ詳細ページのプッシュに適しています。

3。 SingleTask: スタック内で再利用します。スタック内に存在する場合、そのアクティビティはすべてスタックからポップされ、スタックの最上位になります。ライフ サイクルは SingleTop と同じです。アプリのホームページは基本的にこれを使用します。

4.SingleInstance: これは、SingleTask の拡張バージョンです。システムは、開始するアクティビティ用に別のスタックを開きます。これは、このスタック内の唯一のスタックです。新しく開かれたアクティビティやアプリに適しています。システムの目覚まし時計や WeChat のビデオ チャット インターフェイスなど、独立して開くことができます。同じかどうかはわかりません。ご存知の場合は、お知らせください。ありがとうございます。

さらに、SingleTask と SingleInstance は onActivityResult のコールバックに影響を与えるようです。具体的な問題については検索してください。

インテントでは、アクション、データ、カテゴリの使用法と機能、一般的に使用される

Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TOP

などについてもさらに理解する必要があります。詳細については、ソース コードを参照してください。

2. 描画プロセスの表示

ViewRoot
-> performTraversal()
-> performMeasure()
-> performLayout()
-> perfromDraw()
-> View/ViewGroup measure()
-> View/ViewGroup onMeasure()
-> View/ViewGroup layout()
-> View/ViewGroup onLayout()
-> View/ViewGroup draw()
-> View/ViewGroup onDraw()

無効化メソッドを見てみましょう。パラメータは 4 つありますが、パラメータのないものとの違いは何ですか? requestLayout は測定とレイアウトをトリガーします。グローバルな再測定の問題を回避するために、ローカルな再測定を実装します。

3. イベント配信メカニズム

-> dispatchTouchEvent()
-> onInterceptTouchEvent()
-> onTouchEvent()
requestDisallowInterceptTouchEvent(boolean)

onTouchEvent()、onTouchListener、onClickListenerの順序も同様です

4. メッセージ配布メカニズム

このテストは非常に一般的です。コードはそれほど多くないので、必ずソース コードを確認してください。いくつかの質問をしながら見てみましょう:

1. スレッドに Looper と MessageQueue が 1 つだけあるのはなぜですか?

2. 現在のスレッドの Looper を取得するにはどうすればよいですか?それはどのように達成されるのでしょうか? (ThreadLocal について)

3. どのスレッドでもハンドラーをインスタンス化できますか?制約はありますか?

4.Looper.loop は無限ループです。処理する必要があるメッセージを取得できない場合はブロックされます。それでは、なぜ UI スレッドで ANR が発生しないのでしょうか?

5.Handler.sendMessageDelayed() はどのように遅延を実装しますか? Looper.loop() ループ、Message=messageQueue.next() および MessageQueue.enqueueMessage() 分析と組み合わせます。

5. AsyncTask のソースコード分析

利点と欠点の分析は、インターネット上にたくさんあるので繰り返しません。

6. サービスが強制終了されないようにする方法は?プロセスが強制終了されないようにするにはどうすればよいでしょうか?

これら 2 つの質問は、私の面接中に 3 社から聞かれました。

7. バインダー メカニズム、プロセス通信

Android で使用されるプロセス通信の最下層は、基本的にバインダー、AIDL、メッセージャー、ブロードキャスト、および ContentProvider です。あまり深く理解していません。少なくとも ADIL の使い方と Messager の使い方は書いたり読んだりできます。また、シリアル化 (Parcelable と Serilizable) を比較する必要があります。この点については、Android アートを読むことができますRen Yugang による開発探求の本。

8. 動的なパーミッションの適応の問題と、非常に変化する実装原則

この点については、Hongyang のブログ投稿を見てみましょう

9. SharedPreference 原則、クロス可能か-プロセス?どのように達成するか?

(3) パフォーマンスの最適化に関する問題

1. UI の最適化

a. RelativeLayout、LinearLayout、FrameLayout を適切に選択します。RelativeLayout はサブビューの onMeasure 呼び出しを 2 回行います。レイアウトが比較的複雑な場合、onMeasure は比較的複雑で非効率的ですが、LinearLayout では、weight>0 の場合、サブビューで onMeasure を 2 回呼び出すこともできます。 LinearLayout の重み測定分散原理。

b. タグ dcf91641426a34cf32ecc36140f28baf76deed1c218ccc4d4a17740bf4fefa6ae7ce6ff74a06bd752b5697fed60b5487

c. レイアウト レベルを下げます。モバイル開発者向けオプション > GPU トランジション描画ビュー、一般レベルを使用できます。コントロール 4階層以内、5階層を超える場合はレイアウトを再配置するか検討する必要があります。

d. View をカスタマイズするときは、onDraw() メソッドを書き直して、このメソッドで新しいオブジェクトを作成しないでください。そうしないと、簡単に GC がトリガーされ、パフォーマンスの低下につながる可能性があります。

e. 再利用が必要ですListView contentView を使用する場合は、Holder を使用して findViewById を減らしてビューをロードします。

f. 不要な背景を削除します (getWindow().setBackgroundDrawable(null))

g. ImageView TextView レイアウトの代わりに TextView の leftDrawabel/rightDrawable を使用します

2. メモリの最適化

主に、OOM と GC の頻繁なトリガーによって引き起こされるパフォーマンスの低下を回避するためです

a.Bitmap.recycle(),Cursor.close,inputStream.close()

b. 大量読み込みBitmap の場合、View サイズに従って Bitmap をロードし、inSampleSize、RGB_565 エンコード方法を適切に選択し、LruCache キャッシュを使用します

c. Handler、thread、AsyncTask

# などの内部クラスの代わりに静的内部クラス WeakReference を使用します##d .新しいスレッドを避けるために、スレッド プールを使用してスレッドを管理します

e. シングルトンを使用してコンテキストを保持し、忘れずに解放するか、グローバル コンテキストを使用します

f. 静的な解放に注意してくださいコレクション オブジェクト

g. 属性アニメーションによりメモリ リークが発生する

h. webView を使用する場合は、Activity.onDestory、webView.removeAllViews()、および webView.destory() で削除して破棄する必要があります。

準備: LeakCanary を使用してメモリ リークを検出する

3. 応答速度の最適化

Activity が 5 秒以内に画面タッチ イベントやキーボード入力イベントに応答できない場合、ANR が発生します。 , そして、BroadcastReceiver が 10 秒以内に画面タッチ イベントやキーボード入力イベントに応答できない場合、20 秒以内に操作が実行される前に ANR が発生します。ANR を回避するには、時間のかかる操作を実行するサブスレッドを開始できます。ただし、サブスレッドは UI を更新できないため、スレッド通信にはハンドラー メッセージ メカニズム、AsyncTask、および IntentService が必要です。

注: ANR が発生すると、adb pull data/anr/tarces.txt とログ分析が組み合わされます

4. その他のパフォーマンスの最適化

a. 定数に静的な最終変更を使用します。

b. HashMap の代わりに SparseArray を使用します

c. スレッド プールを使用してスレッドを管理します

d. ArrayList の走査には通常の for ループを使用し、LinkedList には foreach を使用します

e. 整数よりも大きなメモリ領域を占有する列挙型を過度に使用しないでください

f. 文字列の結合には StringBuilder と StringBuffer を優先します

g. データベース ストレージはバッチ挿入トランザクションを使用します

(4) デザインパターン

1. シングルトンパターン: いくつかの書き方があり、メリット・デメリットを分析しながら手書きで書ける必要があります。 Volatile は二重チェックロックで一般的に使用されており、Volatile の原理を分析する必要があります

2. オブザーバー モード: 手書きで書ける必要があります。面接官によっては使用したことがあるかどうか尋ねられることがあります。プロジェクトの中で?本当に聞いたことがない場合は、オブザーバー パターンを使用する EventBus について話してください。

3. アダプター パターン: 手動で記述できることが必要です。一部の企業では、オブザーバー パターンとは何ですかと尋ねるでしょう。デコレータパターンやプロキシパターンとの違いは何ですか?

4. ビルダー モード ファクトリ モード: 手書きできることが必要です

5. ストラテジー モード: この質問は比較的まれですが、一部の電子商取引担当者が尋ねることがあります。

6.MVC、MVP、MVVM: 類似点と相違点を比較し、得意なものを選択してそれに重点を置きます

(5) データ構造

1. HashMap、LinkedHashMap、ConcurrentHashMap の使用法と原則の違いは何ですか? 多くの企業が HashMap 原則をテストし、中国の 1.3 などの拡張を行う予定です。 10億人の人口年齢のソート問題、年齢はバケットの数に対応し、同じ年齢と同じハッシュの問題は類似しています。

2. ArrayList や LinkedList と比較すると、これは比較的単純です。

3. バランス二分木、二分探索木、赤黒木でもテストを受けました。

4.集合原理、これは HashMap テストに似ています。このテストはハッシュ アルゴリズムに関連しています。一般的に使用されるハッシュ アルゴリズムについて質問されました。 HashSet は内部的に HashMap

を使用します (6) アルゴリズム

アルゴリズムは主に質問のテストに使用されます。ブラッシュアップするには LeetCode と Niuke.com にアクセスしてください。

(7) ソース コードの理解

オープンソース フレームワークはプロジェクトで多かれ少なかれ使用されており、多くの企業は原理やネットワークなどのソース コードを見たことがあるかどうかについて尋ねることを好みます。フレームワーク Okhttp が最も一般的に使用されていますが、Retrofit RxJava も現在非常に人気があります。

1. ネットワーク フレームワーク ライブラリ Okhttp

okhttp ソース コードを必ず読んでください。その中のいくつかの主要なクラスと、接続プールとインターセプタを覚えておいてください。それらを理解する必要があります。特定のドメイン名の URL にヘッダーを追加する方法について質問されましたが、コードを自分でカプセル化する場合は、カプセル化されたリクエスト内で解決することもできますし、インターセプターを追加してインターセプターを通じて実行することもできます。

OK を説明する良い記事をお勧めしますhttp

2. メッセージ通知 EventBus

1. EventBus の原則: ソース コードを確認することをお勧めしますが、多くはありません。内部実装: オブザーバー パターン アノテーション リフレクション

2. EventBus はクロスプロセスできますか? EventBus を置き換える方法 (RxBus)

3. 画像読み込みライブラリ (Fresco、Glide、Picasso)

1. プロジェクトで選択された画像読み込みライブラリはどれですか?なぜそれを選ぶのでしょうか?他のライブラリはダメなのでしょうか?これらのライブラリの違い

2. プロジェクト内の画像ライブラリの原理 (Glide (LruCache と弱参照の組み合わせ) など) を選択すると、面接官は LruCache の原理について質問し、次に次の点について質問します。 LinkedHashMap の原理なので、レイヤーごとに作成します。人々は質問するので、理解できない点がある場合は、中に入って見てみることをお勧めします。たとえば、MVC デザイン パターンでは Fresco が使用され、5.0 以下では共有メモリが使用されます。共有メモリはどのように使用するのですか? Fresco で角を丸くするにはどうすればよいですか? Fresco でキャッシュを設定するにはどうすればよいですか?

4. メッセージ プッシュ

1. プロジェクトへのメッセージ プッシュは自分で行いましたか、それともサードパーティを使用しましたか?オーロラのように。他にも使ったことがありますか?これらの会社の利点と違いは何ですか?また、なぜそれらの会社を選んだのですか?

2. メッセージ プッシュの原理は何ですか?ハートビート接続を実装するにはどうすればよいですか?

5. TCP/IP、Http/Https

履歴書に TCP/IP プロトコルと Http/Https プロトコルに精通していると記載されている場合は、必ず質問されるでしょうし、私もそうします。それを確認してください。一般に、ネットワーク層の関係、TCP と UDP の違い、TCP スリーウェイ ハンドシェイク (必ず明確に説明してください。SYN、ACK などのフラグ ビットやメッセージ構造をよく知っている必要があります)、および4回手を振ります。なぜ3回握手するのですか? DDoS攻撃。なぜ3回握手し、4回手を振るのでしょうか? HTTP メッセージの構造、ネットワーク リクエストのプロセスは何ですか? HTTP と HTTPS の違いは何ですか? SSL/TLS は暗号化されたハンドシェイクをどのように実行しますか?証明書を確認するにはどうすればよいですか?対称暗号化アルゴリズムと非対称暗号化アルゴリズムとは何ですか?使い慣れた暗号化アルゴリズムを選択して、簡単に説明しますか? DNS 解決はどのように機能しますか?

6. ホット アップデート、ホット リペア、およびプラグイン (この分野はより要求が厳しく、一般に上級エンジニアが理解する必要があります)

classLoader について理解する

7. 新しいtechnology

RxJava、RxBus、RxAndroid、行きたい企業に面接に行く際に、パッケージをデコンパイルして使用されているかどうかを確認することができますが、使用されている場合は面接で必ず質問されます。そうでない場合は、なぜですか? 無視しても問題ありませんが、学習意欲の高い学生はこれを参照すると、比較的人気のあるフレームワークです。

レトロフィット、okhttp に詳しい学生は、見てみることをお勧めします。RxJava と組み合わせるととてもクールだと聞きました。

Kotlin

3. 最後に

社内紹介方法は履歴書の第一選択であり、高速かつ効率的です。続いてサビ、ボス、マイマイ、ストリートを見てみましょう。履歴書には、テクノロジーに精通している場合は、その技術に精通している必要があります。そうしないと、質問されたときに恥ずかしくないと書かれています。どのような種類のプロジェクトを行ってきましたか?プロジェクトの規模が大きくなくても、実装の原則を熟知している必要があります。それはあなたが担当する部分ではありません。同僚がそれをどのように実装しているかを見ることもできます。あなただったらどうしますか?プロジェクトの内容によって、これまでに何をしてきたか、何を知っているかは多岐にわたります。しかし、あなたが何をし、どのような状態に到達したかは、あなた個人の学習能力と問題解決に対する態度に関わる深い問題です。大企業は深さを重視し、中小企業は幅を重視します。大手企業の面接では何を知っているかがわかりますが、中小企業の面接では何を知っているかがジョブマッチング度になります。

行きたい企業をいくつか選んだ後、まずいくつかの中小企業に行き、面接の練習をしてスキルを学びましょう。要約すると、面接の雰囲気を知ることもできます。同僚や製品について話すこともできます。 PK。非常に明確で明確です。現場に行くと本当に違います。自分の行動すべてをどのように説明するかは、間違いなく学術的な質問です。

面接中は必ず礼儀正しくしてください。たとえ面接官があなたを尊重しておらず、よく説明を遮ると感じたとしても、あるいは面接官があなたほど優秀ではなく、面接官の質問にプロ意識が欠けていると感じたとしても、面接官を尊重しなければなりません。あなたからのオファーを待っています。最終的に彼を選ぶのはあなたです。

さらに、問題を説明するのが遅いはずです。一度にたくさん話さないようにしましょう。ゆっくり話すということは、あなたが落ち着いていて自信があり、次にどうすればもっと上手に話せるかについて自分の考えを考える時間がまだあることを示しています。最近の開発はIDEに依存しすぎているのでデメリットが発生します 面接で説明する際に、その方法の読み方が分からないことが多いのが欠点です…主要なクラス名、メソッド名、キーワードは正確に読み取る必要があります。面接官の中には「どれについて話しているのですか?」と焦る人もいますが、このとき混乱しやすくなります。正しい発音、穏やかな説明、素敵な声は間違いなくプラスです。

最も重要なのはメンタルです!メンタル!メンタル!大事なことは3回言いましょう!面接時間は非常に短く、短期間で相手に素性を知られるのは比較的現実的ではないため、視力で判断されることもありますが、まだまだ顔の時代です。

皆さんが自分に合った納得のいく仕事を見つけられることを願っています!ファインティング!

以上がAndroid の面接体験を共有する [選択済み]の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjianshu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。