2年間のAndroid開発、アウトソーシング、12以上の中小工場へのインタビュー、そして最終的にオファーの取得後、Androidの主要なインタビューの質問が要約されています!

1.プロセス間通信のいくつかの方法

電話をかける、
ContentProviderデータベースストレージデータ
ブロードキャストブロードキャスト通信AIDL
通信、インターフェイスを介してデータを共有するなどの目的

2.待機と睡眠の違い

WaitはObjectのメソッド、waitはオブジェクトロックです。lockedメソッドは実行を継続しません。notifyメソッドが実行されると、実行を継続します。SleepはThreadのメソッドです。Sleepはスレッドをスリープし、あきらめます。 cpuであり、終了後も自動的に実行を継続します。

3. String、StringBuffer、StringBuilderの違い

文字列は変更できません。一度作成すると変更できません。

String str="aaa";
str="bbb";

上記のコードはstrを変更しますが、実行プロセスはstrを再利用し、値を新しいstrに割り当てることです。

StringBufferを作成した後、StringBuilderを変更したり、変更したりできます。実行効率はStringBufferよりも高く、安全ではありません。文字列は文字割り当て時に使用されにくく、StringBuilderは文字割り当て時に頻繁に使用され、StringBufferが使用されます。複数のスレッドがデータを同期的に操作する場合。

4.ViewとSurfaceViewの違い

Viewはメインスレッドに基づいてUIを更新し、SurfaceViewサブスレッドはUIを更新できます

5.図面の原則を見る

ビューはすべてのグラフィックコントロールの基本クラスであり、ビューの描画は3つの関数で完了します。

測定、ビューのサイズの計算、
レイアウト、表示するビューの位置の提供、
描画、描画。

6.JNIについて簡単に説明します

これは、JavaとC言語の間の架け橋です。Javaは半インタープリター言語であるため、逆コンパイルできます。Cプログラミングは、安全上重要な一種のコードに使用されます。さらに、多くの基礎となる関数は、C言語を呼び出して実装します。 Javaホイールを再発明する必要がないため、JNIインターフェースの実装が定義されています。

7. TCP、UDP、ソケットについて簡単に説明します

TCPはスリーウェイハンドシェイクであり、一連のデータ送信を完了するための4つのウェーブハンドです。UDPはコネクションレス型であり、IPアドレスとポート番号を知っているため、データが正常に送信されたかどうかに関係なく、データを送信できます。

Socketは別のコンピューターであり、ファイル転送、インスタントメッセージングなどのリアルタイム接続です。

8.オーディオおよびビデオ関連のカテゴリ

一般的に言えば、それはいくつかのカテゴリーに分けられます:

  • ビデオ録画、Camearカメラ録画ビデオカテゴリ、MediaProjection画面録画ビデオカテゴリ
  • エンコーディング、MediaCodec、MediaRecorder
  • プレビューに関しては、SurfaceView、GLSurfaceView、TextureView、VideoView

9.プロセスとスレッドの違い

概念:プロセスには複数のスレッドが含まれ、プログラムごとに1つのプロセスが含まれます。マルチスレッドの利点により、実行効率とリソース使用率を向上させることができます。

作成:スレッドクラスとRunnableインターフェイス。

一般的な方法は次のとおりです。

  • start()はスレッドを開始するために使用されます
  • run()は、スレッドオブジェクトのrunメソッドを呼び出します
  • join()キューを現在のスレッドにマージします
  • Sellp()スリープリリースCPUリソース
  • setPriority()はスレッドの優先順位を設定します

10.メモリリークをチェックして解決する方法

概念:一部のオブジェクトのライフサイクルは限られています。タスクが完了すると、ガベージコレクションが行われます。オブジェクトのライフサイクルが終了することになっている場合でも、オブジェクトはシリーズによって参照されているため、メモリリークが発生します。

解決策:オープンソースフレームワークLeakCanaryを使用して、ターゲットソリューションを検出します。

一般的なメモリリークは次のとおりです。

  • シングルトンによって引き起こされるメモリリーク。たとえば、シングルトンのコンテキストライフサイクルは、それ自体のコンテキストライフサイクルよりも大きくなります。
  • スレッドはHanderによって引き起こされたメモリシャックルを使用します。アクティビティが終了しても、スレッドはUIを更新するために実行中です。
  • 非静的クラスで静的変数を使用すると、回復および解放できなくなり、リークが発生します。
  • WebViewページが多すぎると、メモリリークが発生します。
  • データベースが使い果たされた後に接続を閉じるなど、リソースが閉じられないためにリークが発生します。

11.配信メカニズムの表示、競合のスライド

Viewのイベント配信シーケンスには、dispatchTouchEvent()がこのイベントを消費するかどうか、onInterceptTouchEvent()がこのイベントをインターセプトするかどうか、onTouchEvent()がこのイベントを処理するかどうか、スライディング競合が同じ方向のスライディング競合に分割されるかどうかの3つの重要なメソッドがあります。たとえば、ScrollViewとListViewが同じ方向にスライドすると、競合します。ListViewの高さを計算し、ListViewの高さを動的に設定できます。また、ScrollViewの高さは可変です。たとえば、ViewPagerとListViewには、異なる方向へのスライドの競合があります。1つは水平スライドで、もう1つは垂直スライドです。異なる方向にスライドすると、スライドのx、y軸が水平か垂直かを判断できます。水平と判断された場合スライドすると、ListViewイベントがインターセプトされます。垂直は反対です。

12.RecyclerViewとListViewの違い

キャッシング:前者はView + ViewHolder + flagをキャッシュし、毎回findViewByIdを呼び出さずに、後者はビューをキャッシュするだけです。

データの更新に関しては、前者は部分的な更新を提供し、後者はすべてを更新します。

13.recyclerViewネストラグソリューションを解決する方法

プリロードの数に設定します。
LinearLayoutManager.setInitialPrefetchItemCount(4)、デフォルトは2つのプリロード、ある
子アイテムのキャッシュを設定し、
内蔵の紛争解決プロパティrv.setHasFixedSize(true)をスライドセット;(偽)rv.setNestedScrollingEnabled;
することができ完全に解決されましたが、GoogleはRecyClerViewのネストされた使用を推奨していません。それを解決するには、ExpandableListViewに類似したサードパーティのコントロールを見つける必要があります。

14. MVC、MVP、MVVMについて話します

MVC:ビューはモデルに直接アクセスできます!したがって、ビューにはモデル情報が含まれ、一部のビジネスロジックは必然的に含まれます。MVCモデルでは、変更されていないモデルにより多くの注意が払われ、モデルとビューが同時に複数の異なる表示になります。したがって、MVCモデルでは、モデルはビューに依存しませんが、ビューはモデルに依存します。それだけでなく、一部のビジネスロジックはViewに実装されているため、Viewを変更することは困難であり、少なくともそれらのビジネスロジックは再利用できません。

MVP: MVPは、従来のパターンMVCから進化したものです。基本的な考え方には類似点があります。コントローラー/プレゼンターがロジック処理を担当し、モデルがデータを提供し、ビューが表示を担当します。新しいモデルとして、MVPとMVCには大きな違いがあります。ビューはMVPのモデルを直接使用せず、それらの間の通信はプレゼンター(MVCのコントローラー)を介して実行され、すべての対話はプレゼンターの内部とMVCで発生します。ビューは、コントローラーを介さずに直接モデルからデータを読み取ります。

MVVM:双方向データバインディング、データ駆動型UI、Mはデータを提供、Vビュー、VMはデータ駆動型レイヤーです

15.dagger2

Dagger2は、主に依存性注入に使用されるフレームワークであり、初期化オブジェクトの操作を減らし、結合を減らします。

16Androidのパフォーマンスの最適化

レイアウトの最適化:レイアウトレベルを下げ、ViewStubを使用して表示速度を上げ、レイアウトし、warp_contentをできるだけ使用せず、スペース内の不要な属性を削除し、過度の描画を避け、ウィンドウのデフォルトの背景を削除し、オンデマンドでブースマップを表示します、ビューの最適化をカスタマイズし、canvas.clipRect()を使用して表示領域を識別します。

起動速度:分散読み込み、非同期読み込み、遅延読み込みを使用してアプリケーションの初期化速度を向上させ、スレッドを使用してデータを初期化するなど、合理的な更新メカニズム。

メモリの側面:メモリリーク防ぐために、いくつかのサードパーティツールを使用して検出および解決します。

コードの最適化: Javaのライフサイクルに従う

インストールパッケージの最適化:不要なリソースの削除、画像の最適化、コードの難読化、在庫の重複の回避、プラグイン

17.ハンドラーの原則

ハンドラー、ループポーリング検出はメッセージをMessagerQueryに送信し、MessageQueryはメッセージをエンキューし、ハンドラーコールバックメソッドはメッセージを処理し、handMessageメソッドをオーバーライドしてUIを更新します。

18. SharedPreferenceがプロセス間で使用されるとどうなりますか?クロスプロセス使用の安全性を確保するにはどうすればよいですか?

2つのアプリケーションのマニフェスト構成で同じshartdUserId属性を使用します。アプリケーションAはデータを通常どおり保存し、アプリケーションBはcreatePackageContext( "com.netease.nim.demo"、CONTEXT_IGNORE_SECURITY)を使用してコンテキストを取得し、次にアプリケーションデータを取得します。データのセキュリティを確保するため、暗号化はストレージを使用します。

19.プッシュ到着率を改善する方法

携帯電話システムを判断すると、XiaomiはXiaomiプッシュを使用し、HuaweiはHuaweiプッシュを使用し、他の電話はUmengプッシュを使用します。

20.アクティビティ、フラグメント値の受け渡しの問題

バンドルを介して値を渡し、アクティビティで変数のパス値を定義し、フラグメントを展開してパス値を作成します

21.アクティビティとフラグメントの違い

ライフサイクル:

フラグメントの作成から破壊までのライフサイクル全体は次のとおりです。

onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach()

活動とは異なる方法があります

  • onAttach():フラグメントとアクティビティが関連付けられているときに呼び出されます。
  • onCreateView():フラグメントがビューを作成するときに呼び出されます。
  • onActivityCreated:フラグメントに関連付けられたアクティビティがonCreate();を完了した後に呼び出されます。
  • onDestoryView():フラグメントのレイアウトが削除されたときに呼び出されます。
  • onDetach():フラグメントとアクティビティの関連付けが解除されたときに呼び出されます。アクティビティで一般的に使用されるライフサイクルは次のとおりです。
  • onCreate():アクティビティが作成されていることを示し、setContentViewを呼び出してインターフェイスレイアウトリソースをロードしたり、アクティビティに必要なデータを初期化したりするなど、作業の初期化によく使用されます。
  • onRestart():アクティビティが再開していることを示します。通常、現在のAcitivtyが非表示から再び表示に変わると、OnRestartが呼び出されます。
  • onStart():アクティビティが開始されていることを示します。この時点では、アクティビティは表示されていますが、フォアグラウンドには表示されていません。まだバックグラウンドにあり、ユーザーと対話できません。
  • onResume():アクティビティにフォーカスがあることを示します。この時点で、アクティビティは前景に表示され、アクティビティを開始します。これはonStartとの違いです。
  • onPause():アクティビティが停止していることを示します。この時点で、データの保存やアニメーションの停止などの作業を行うことができますが、新しいアクティビティの表示に影響するため、それほど時間はかかりません。OnPause最初に実行する必要があり、新しいアクティビティのonResumeが実行されます。
  • onStop():アクティビティが停止しようとしていることを示します。ブロードキャストレシーバーからログオフしたり、ネットワーク接続を閉じたりするなど、重いリサイクル作業を行うことができます。時間はかかりすぎないようにしてください。
  • onDestroy():アクティビティが破棄されようとしていることを示します。これはアクティビティのライフサイクルの最後のコールバックであり、多くの場合、リサイクル作業とリソース解放を行います。

違い:

  • フラグメントにはアクティビティよりも4つのコールバックサイクルがあり、制御操作はより柔軟です。
  • フラグメントは、xmlファイルに直接書き込むことも、Activityに動的に追加することもできます。
  • フラグメントは、show()/ hide()またはreplace()を使用してフラグメントを切り替えることができます。切り替え時に明らかな効果はなく、アクティビティの切り替え時に明らかなページめくりやその他の効果があります。

22.フラグメントの追加と置換の違いは何ですか?

  • 追加はフラグメントを再初期化しません。置換は毎回行われます。
  • 同じフラグメントを追加する場合、replaceに変更はなく、addはIllegalStateExceptionを報告します。
  • replaceは、最初に同じIDを持つすべてのフラグメントを削除し、次に現在のフラグメントを追加し、addは前のフラグメントをカバーします。したがって、addを使用する場合、レイアウトの重複を避けるために、通常はhide()とshow()が付随します。
  • addを使用して、アプリケーションがバックグラウンドに配置されているか、他の方法でシステムによって破棄された場合、アプリケーションを再度開くと、hide()で参照されているフラグメントが破棄されるため、レイアウトの重複バグが残ります。replaceを使用できます。または、addパラメーターを使用するときにタグを追加します。

23. FragmentPagerAdapterとFragmentStatePagerAdapterの違いと使用シナリオは何ですか?

FragmentPagerAdapterの各フラグメントは、ユーザーがページに戻ることができる限り、FragmentManagerに永続的に保存され、破棄されることはありません。したがって、データが比較的静的でフラグメントの数が比較的少ないページに適しています。FragmentStatePagerAdapterは現在のページのみを保持し、ページが非表示の場合、フラグメントは削除され、そのリソースが解放されます。したがって、データがより動的で、より多くのメモリを占有し、より多くのフラグメントがある状況に適しています。

24.アクティビティの4つの起動モードとアプリケーションシナリオは何ですか?

  • 標準標準モード:アクティビティを開始するたびに、このインスタンスがすでに存在するかどうかに関係なく、新しいインスタンスが再作成されます。このモードのアクティビティは、デフォルトで開始したアクティビティのタスクスタックに入ります。
  • singleTopスタックトップ再利用モード:新しいアクティビティがすでにタスクスタックの一番上にある場合、このアクティビティは再作成されず、onNewIntentメソッドがコールバックされます。新しいアクティビティインスタンスがすでに存在しているが一番上にない場合スタックの場合、アクティビティは引き続き再作成されます。
  • SingleTaskスタック内再利用モード:アクティビティがタスクスタックに存在する限り、アクティビティが複数回開始された場合、インスタンスは再作成されず、onNewIntentメソッドがコールバックされます。このモードはアクティビティAを開始し、システムは最初に、Aが必要とするタスクスタックがあるかどうかを探します。存在しない場合は、タスクスタックを再作成してから、作成したAのインスタンスをスタックに配置します。
  • singleInstanceシングルインスタンスモード:これは拡張されたsingleTaskモードです。このモードのアクティビティは単一のタスクスタックにのみ配置でき、このタスクスタックにはインスタンスが1つだけあります。

25.アクティビティとウィンドウおよびビューの関係について話しますか?

アクティビティが作成されると、ウィンドウはPhoneWindowであるattach()によって初期化されます。PhoneWindowはDecorViewのインスタンスを保持します。DecorView自体はFrameLayoutであり、Viewから継承します。ActivtyはsetContentViewを介してViewにxmlレイアウトコントロールを継続的に追加します。私たちと対話するためのウィンドウ。

26.水平画面と垂直画面を切り替えると、アクティビティのライフサイクルが変わりますか?

アクティビティのandroid:configChangesが設定されていない場合、画面が切り取られると現在のアクティビティが破棄され、各ライフサイクルがリロードされます。水平画面が切り替わると1回、垂直画面が切り替わると2回実行されます。切り替え;

onPause()→onStop()→onDestory()→onCreate()→onStart()→onResume()

モデルでテストされたアクティビティのandroid:configChanges = "orientation"を設定します

Android5.1、つまりAPI 3 23レベルでは、画面が切り取られたときに各ライフサイクルが再度呼び出され、画面が水平または垂直に切り取られたときに1回だけ実行されます。

API 8 28レベルのAndroid9では、スクリーンカットは各ライフサイクルを再呼び出しせず、onConfigurationChangedメソッドのみが実行されます。

正式修正後の原語は以下の通りです

アプリがAndroid2 3.2をターゲットにしている場合、それはAPIレベル3 13以上を意味します
(minSdkVersionおよびtargetSdkVersionによる)

つづく...

面接前のシステムレビュールート

時には、選択は努力よりも重要であり、機会は闘争よりも重要です。ただし、機会は準備ができている人だけに予約されています。常に準備ができている場合にのみ、チャンスをつかむことができます。

ここで私の面接レビュールートをあなたと共有するために、困っている友人は参照することができます:

1.体系的な学習のためのビデオを見る

過去数年間のCrudの経験から、私は本当に新人の戦闘機であることがわかりました。また、Crudのおかげで、私の技術は比較的断片化されており、体系化するのに十分な深さではないため、もう一度勉強する必要があります。 。私に欠けているのは、システムの知識、貧弱な構造フレームワークとアイデアです。そのため、ビデオを通じて学ぶことは、より良く、より包括的です。ビデオ学習に関しては、個人がステーションBでの学習を推奨できます。ステーションBには多くの学習ビデオがあります。唯一の欠点は、無料で簡単に古くなることです。

2.知識を体系的に整理し、準備金を改善する

クライアント開発には非常に多くの知識ポイントがあり、インタビューにはまだほとんど何もありません。したがって、これらの知識ポイントにどれだけ準備しているかを確認するためだけに、面接のための他のトリックはありません。したがって、面接に出かけるときは、レビューでどの段階に到達したかを確認することをお勧めします。

システム学習の方向性:

  • アーキテクトに不可欠なスキル:詳細なJavaジェネリック+単純な言語でのアノテーション+並行プログラミング+データ送信とシリアル化+ Java仮想マシンの原則+リフレクションとクラスローディング+動的プロキシ+効率的なIO

  • Androidの高度なUIとFrameWorkのソースコード:高度なUIプロモーション+フレームワークカーネル分析+ Androidコンポーネントカーネル+データの永続性

  • 360°の全体的なパフォーマンスチューニング:設計アイデアとコード品質の最適化+プログラムパフォーマンスの最適化+開発効率の最適化

  • オープンソースフレームワーク設計アイデアの解釈:ホットリペア設計+プラグインフレームワーク解釈+コンポーネントフレームワーク設計+画像読み込みフレームワーク+ネットワークアクセスフレームワーク設計+ RXJavaレスポンシブプログラミングフレームワーク設計+ IOCアーキテクチャ設計+ AndroidアーキテクチャコンポーネントJetpack

  • NDKモジュール開発: NDK基本知識システム+基礎となる画像処理+オーディオおよびビデオ開発

  • WeChatミニプログラム:ミニプログラムの紹介+ UI開発+ API操作+ WeChatドッキング

  • ハイブリッド開発とFlutter: Html5プロジェクトの戦闘+ Flutter Advanced

知識を整理した後、不足している点を確認する必要があるので、これらの知識点については、手元にたくさんの電子書籍やメモを用意しました。これらのメモは、各知識点の完全な要約を提供します。

3.ソースコードを読み、実際の戦闘ノートを読み、神の考えを学びます

「プログラミング言語はプログラマーが表現する方法であり、アーキテクチャーはプログラマーの世界に対する認識です。」したがって、プログラマーがアーキテクチャーをすばやく理解して学習したい場合は、ソースコードを読むことが不可欠です。ソースコードを読むことは、問題を解決し、物事を理解することであり、さらに重要なことは、ソースコードの背後にあるアイデアを参照することです。プログラマーは、何千行ものソースコードを読み、何千もの方法を練習します。

4.インタビューの前夜に、スプリントの質問

面接前1週間以内に全力疾走を開始できます。質問をブラッシングするときは、テクノロジーが最優先であり、アルゴリズムは並べ替えなどの基本であり、知的質問は、学校の新入生でない限り、通常は質問されないことに注意してください。

面接の質問に関して、私はあなたがお互いから学ぶのを助けるために一連の体系的な面接の質問を個人的に準備しました:

上記のコンテンツは、フルバージョンが必要なすべての人、友人と無料で共有できますすべてのコンテンツを表示するにはここをクリックしてください

おすすめ

転載: blog.csdn.net/weixin_44339238/article/details/112853749