Androidフレームワーク基礎インタビュー~

Android アプリケーション開発の面接では、フレームワークに関する質問がよく調査されます。以下は、Framework の典型的な面接でよくある質問とその詳細な説明です。

1. Android アプリケーションのライフサイクルとは何ですか? どのような段階で構成されているか説明していただけますか?

Android アプリケーションのライフ サイクルとは、起動からシャットダウンまでのアプリケーションのプロセス全体を指します。

これには次の 4 つの段階が含まれます。

  • onCreate (作成): このステージはアプリケーションのエントリ ポイントであり、アプリケーションが初期化され、そのインターフェイスが作成されます。
  • onStart (スタートアップ): この段階では、バックグラウンドで重要な操作を実行するなど、アプリケーションがまだ表示されていないときに作業が行われます。
  • onResume (再開): この段階で、アプリケーションが表示され、ユーザーの操作に応答し、通常はユーザーにフォアグラウンド インターフェイスを表示します。
  • onPause (一時停止): フォーカスが失われたため、アプリケーションのこのフェーズは一時停止されます。このフェーズ中に、アプリケーションはデータを保存し、リソースを解放することがあります。

2. ライフサイクルのさまざまなフェーズで特定の操作を実行するにはどうすればよいですか?

Activity クラスのライフサイクル メソッドを使用すると、異なるライフサイクル フェーズ間で特定の操作を実行できます。たとえば、アプリケーションは onCreate() メソッドで初期化したり、onPause() メソッドで停止したりできます。ライフサイクル メソッドとその一般的な使用例のいくつかを次に示します。

  • onCreate(): このメソッドはアクティビティが最初に作成されるときに呼び出され、通常はレイアウトの設定と変数の初期化に使用されます。
  • onStart(): このメソッドは、表示されていてもインタラクティブではないときに呼び出されます。通常、時間のかかる操作やネットワーク リクエストがここで実行されます。
  • onResume(): このメソッドは、アクティビティが表示されて対話型になったときに呼び出され、通常、アニメーション、音楽、ビデオなどを開始したり、中断されたタスクを再開したりするために使用されます。
  • onPause(): このメソッドは、アクティビティがフォーカスを失ったときに呼び出され、通常はデータを保存し、アニメーションやその他の時間のかかる操作を停止するために使用されます。
  • onStop(): このメソッドは、アクティビティが完全に非表示になったときに呼び出され、通常はリソースを解放し、データを保存するために使用されます。
  • onDestroy(): このメソッドはアクティビティが破棄されるときに呼び出され、通常はすべてのリソースをクリーンアップしてメモリを解放するために使用されます。

Activity クラスのライフサイクル メソッドを賢明に使用することで、開発者はアプリケーションのパフォーマンスを最適化し、ユーザー エクスペリエンスを向上させ、アプリケーションを常に適切な状態に保つことができます。

3. インテントおよびインテント フィルターとは何ですか?

Android アプリケーション開発の面接では、インテントとインテント フィルターとは何かと尋ねられることがよくあります。よくある質問とその説明を以下に示します。

1. 意図

Android では、インテントは、さまざまなコンポーネント (アクティビティ、サービス、ブロードキャストレシーバーなど) 間でメッセージ、データ、操作を転送できるメッセージング メカニズムです。インテントは、文字列、整数などの単純なデータ型を渡すことができますが、カスタム オブジェクトなどの複雑なデータ型も渡すことができます。インテントは通常、アクティビティの開始、サービスの開始、ブロードキャストの送信、またはその他の操作の実行に使用されます。

2. インテントフィルター

インテント フィルターは、Android システムにコンポーネントを登録するために使用される一連の宣言です。インテント フィルターを使用すると、開発者はコンポーネントが指定されたタイプのインテントに応答 (処理) できるようになります。インテント フィルターを通じて、Android システムはインテントの処理にどのコンポーネントを使用するかを決定できます。

3. インテントとインテント フィルターの使用方法は?

インテントとインテント フィルターを使用すると、Android システムでさまざまなコンポーネント間の通信と対話を実現できます。たとえば、開発者はアクティビティ内のインテントを使用して、別のアクティビティを開始し、データを運ぶことができます。具体的には、一般的なインテントの使用法を次に示します。

  • アクティビティの開始: Intent を使用して別のアクティビティを開始し、putExtra() メソッドを使用してデータを渡します。startActivityForResult() メソッドを使用して、アクティビティ間で結果を渡します。
  • サービスの開始: インテントを使用してサービスを開始すると、サービスはバックグラウンドでいくつかのタスクを実行できます。
  • ブロードキャストの送信: インテントはブロードキャストの送信に使用でき、BroadcastReceiver はブロードキャストを受信して​​対応するタスクを実行できます。
  • 他の操作を実行する: インテントを使用して、アプリケーションを開いたり、Web を閲覧したり、電話をかけたり、その他のタスクを行うことができます。

インテント フィルターは、Activity、Service、BroadcastReceiver などの宣言で android:name 属性を使用して、対応するコンポーネントを登録できます。次のように:

<activity android:name=".ExampleActivity">
   <intent-filter>
       <action android:name="com.example.ACTION_EXAMPLE" />
       <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
</activity>

上記は、Android のインテントとインテント フィルターに関する基本的な概念と使用法です。

4. Android アプリケーションでマルチスレッドと同時実行に対処するにはどうすればよいですか?

Android アプリケーションでは、メイン スレッド (UI スレッド) は、レンダリング、ユーザー イベントへの応答、コントロールの更新などの操作を含む、ユーザー インタラクションの処理と UI インターフェイスの更新を担当します。時間のかかる操作 (ネットワーク リクエスト、データベースの読み取りと書き込みなど) がメイン スレッドで実行されると、UI のフリーズ、応答の遅延、さらには ANR (アプリケーション応答なし) エラーが発生します。したがって、複数のスレッドを使用すると、メインスレッドをブロックすることなく、時間のかかる操作をバックグラウンドで実行できます。

Android アプリケーションでは、マルチスレッドと同時実行を実現する方法がいくつかあります

  • Thread クラス: 従来のマルチスレッド プログラミングの場合、Thread クラスを継承するか、Runnable インターフェイスを実装することによってスレッドを作成できます。Thread クラスを使用する場合、スレッドの状態、同期、ロックなどの問題を手動で管理する必要があることに注意してください。
  • AsyncTask クラス: バックグラウンドでタスクを実行し、UI スレッドで UI インターフェイスを更新できる、単純なマルチスレッド タスクに適しています。AsyncTask クラスは、コールバック関数を通じてタスクを完了し、UI を更新し、手動のスレッド管理と同期の問題を回避します。
  • ハンドラー クラス: メッセージの送信と処理に使用され、メイン スレッドとサブスレッド間のメッセージの送信、UI インターフェイスの更新、タスクやその他の操作の実行の遅延に使用できます。Handler クラスは、Thread クラスおよび Runnable インターフェイスと連携して、マルチスレッドおよび同時操作を実装することもできます。
  • 同時実行クラス: Android は、スレッド プール、非同期タスク、Future、セマフォ、CountDownLatch など、開発者がスレッドと同時操作をより効率的かつ柔軟に管理できるようにするいくつかの同時実行クラスを提供します。

マルチスレッドと同時実行を使用する場合は、次の問題を避けるために注意する必要があります

  • 競合状態: 複数のスレッドが共有リソースをめぐって競合すると、データの不整合が生じる可能性があります。競合状態を回避するには、同期メソッド、ロック、およびアトミック操作を使用する必要があります。
  • デッドロック: 複数のスレッドがリソースのロックをお互いに待機すると、デッドロックが発生する可能性があるため、複数のロックや循環依存関係の使用を避ける必要があります。
  • コンテキストの切り替え: スレッド間のコンテキストの切り替えは CPU リソースを消費し、パフォーマンスに影響を与えます。したがって、あまりにも多くのスレッドを作成したり、負荷の高いスレッド操作を使用したりすることを避ける必要があります。

5. Android では、どのような種類のデータを SharedPreferences に保存できますか?

SharedPreferences は、Android アプリケーションに少量のキーと値のデータを保存するための軽量のストレージ方法です。Android では、次のタイプのデータを SharedPreferences に保存できます。

  1. 基本データ型: boolean、float、int、long

  2. 文字列タイプ: 文字列

  3. コレクション データ型: 文字列のリストである Set は、文字列データのセットを格納するために使用されます。

SharedPreferences を使用してデータを保存する場合は、最初に SharedPreferences インスタンスを取得し、SharedPreferences の名前と保存モード (プライベート モードなど) を指定する必要があることに注意してください。次に、put 操作を使用してデータを SharedPreferences に保存し、commit メソッドまたは apply メソッドを通じて変更を送信すると、データが SharedPreferences に永続的に保存されます。

例えば:

// 获取SharedPreferences实例
SharedPreferences sharedPreferences = getSharedPreferences("myData", MODE_PRIVATE);

// 存储数据
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("name", "Tom");
editor.putInt("age", 18);
editor.putBoolean("male", true);
editor.apply();

// 读取数据
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);
boolean male = sharedPreferences.getBoolean("male", false);

実際のアプリケーションでは、SharedPreferences は通常、アプリケーション構成情報、ユーザー設定、ログイン ステータス、その他のデータを保存するために使用されます。大規模または複雑なデータ構造の保存には適していません。その場合は、SQLite データベースまたはファイル ストレージを検討する必要があります。

6. Android アプリケーションの 4 つのコンポーネントについて説明します。

Android アプリケーションでは、4 つのコンポーネントは、Activity、Service、BroadcastReceiver、ContentProvider を指します。

  1. アクティビティ: アクティビティは Android アプリケーションで最も一般的なコンポーネントであり、アプリケーションのインターフェイスまたは画面に相当します。各アクティビティは独自のプロセスで実行され、ユーザーと対話するための UI とロジックをカプセル化します。アプリケーションには複数のアクティビティを含めることができ、これらのアクティビティはインテントを通じてジャンプして通信できます。

  2. サービス: サービスは、バックグラウンドで実行され、UI インターフェイスを含まないコンポーネントであり、長時間実行されるタスクを完了したり、音楽の再生やファイルのダウンロードなどの時間のかかる操作を処理したりするために使用されます。サービスは通常、メインスレッドのブロックを避けるために別のスレッドでタスクを実行します。

  3. BroadcastReceiver: BroadcastReceiver は、システム ブロードキャストおよびアプリケーション定義のブロードキャストを監視し、応答するためのブロードキャスト レシーバーです。ブロードキャストは、イベント バスに似たシステム全体のクロスプロセス メッセージング メカニズムであり、アプリケーション間でメッセージと通知を送信できます。BroadcastReceiver は通常、登録時に、対象のブロードキャストをフィルターで除外するために、対応する IntentFilter を指定します。

  4. ContentProvider: ContentProvider は、異なるアプリケーション間でデータを共有するために使用されます。これは、データの読み取り、書き込み、更新などの操作を提供できるデータ プロバイダーに相当します。ContentProvider は、送信のためにデータを Uri オブジェクトと Cursor オブジェクトにカプセル化することができ、クエリ条件を示すために Uri にパラメータを追加することもできます。

これら 4 つのコンポーネントは Android アプリケーションの基本コンポーネントであり、さまざまなコンポーネントが Binder、Intent、ContentResolver などを介して通信および対話し、完全なアプリケーション システムを形成します。面接中、面接官はあなたの理解力と応用能力をテストするために、これら 4 つのコンポーネントの動作メカニズム、ライフサイクル、および使用シナリオについて詳細な質問をする場合があります。

7. Android アプリケーションで最も一般的に使用されるライブラリまたはオープンソース フレームワークを挙げてください。

Android アプリケーションで最も一般的に使用されるライブラリとオープン ソース フレームワークは数多くあります。その一部を以下に示します。

1. OkHttp: ネットワーク要求と通信に使用され、HTTP/2 プロトコルをサポートします。
2. Retrofit: OkHttp パッケージに基づく RESTful API リクエスト フレームワーク。使いやすく、JSON/XML 形式の応答データの自動解析をサポートします。
3. Glide: 画像、GIF アニメーション、ビデオのロードと表示に使用され、複数の画像形式のキャッシュと処理をサポートします。
4.EventBus: コンポーネント間の通信を簡素化するためにイベント パターンをパブリッシュ/サブスクライブするためのフレームワーク。
5. ButterKnife: View インジェクションの実装に使用され、findViewById などの面倒な操作が不要になります。
6. ButterKnife Zelezny: 共通の View インジェクション コードを自動的に生成できる ButterKnife のプラグインです。
7. Dagger 2: コンポーネント間の依存関係を簡素化し、コードの保守性を向上させるために使用される依存関係注入フレームワーク。
8. RxJava: オブザーバー パターンに基づく応答性の高いプログラミング フレームワーク。非同期およびイベント駆動型プログラミングの実装に使用されます。
9. RecyclerView: ListView に代わる、高度にカスタマイズ可能なリスト ビューを実装するために使用されます。
10. ViewPager: スライド式ページビューを実現するために使用され、TabLayout と連携してページ切り替えを実現できます。

これらのライブラリとフレームワークは Android アプリケーション開発で非常に一般的に使用されており、これらを使用すると、コードの重複を減らし、開発プロセスを簡素化し、アプリケーションのパフォーマンスを向上させることができます。面接では、これらのフレームワークの使用方法、利点と欠点、実装原則についてのより深い理解を必要とする詳細な質問がいくつかある場合があります。

実際、面接中、面接官はあなたの技術スキルを確認するために、自身のフレームワーク スキルやプロジェクト開発の経験に基づいた質問をします。この枠組みは基本的なインタビュー記事ではありますが、面接で最もよく聞かれる質問でもあり、面接官はこれらの質問に沿って質問を続けていきます。したがって、高収入のポジションを目指して全力を尽くしたい場合は、フレームワークをマスターすることが不可欠です。

このコンテンツを包括的に確認できるように、ハンドラー、バインダー、AMS、WMS、PMS、イベント配布メカニズム、UI 描画について記録した「Android Framework Core Knowledge Points Manual」をここに示します。 . など、ほぼすべてのフレームワーク関連の知識ポイントを本に収録

「フレームワークコアナレッジポイント概要マニュアル」https://qr18.cn/AQpN4J

ハンドラー メカニズムの実装原理の一部:
1. マクロ理論分析とメッセージ ソース コード分析
2. MessageQueue ソース コード分析
3. ルーパー ソース コード分析
4. ハンドラー ソース コード分析
5. まとめ

Binder の原則:
1. Binder を学習する前に理解する必要がある知識ポイント
2. ServiceManager のバインダーの仕組み
3. システム サービスの登録プロセス
4. ServiceManager の起動プロセス
5. システム サービスの取得プロセス
6. Java Binder の初期化
7. Java システムの登録プロセスバインダーのサービス

受精卵:

  1. Androidシステムの起動処理とZygoteの起動処理
  2. アプリケーションプロセスの起動プロセス

AMS ソースコード分析::https://qr18.cn/AQpN4J

  1. アクティビティのライフサイクル管理
  2. onActivityResult実行処理
  3. AMSのアクティビティスタック管理の詳細説明

詳細な PMS ソース コード:

1. PMSの起動プロセスと実行プロセス
2. APKのインストールとアンインストールのソースコード解析
3. PMSのインテントフィルタマッチング構造

WMS::https://qr18.cn/AQpN4J
1. WMS の誕生
2. WMS の主要メンバーと Window の追加プロセス
3. Window の削除プロセス

おすすめ

転載: blog.csdn.net/weixin_61845324/article/details/130495395