Androidの基本と基礎となるメカニズムのインタビューの質問

1.データベース操作の種類と外部データベースのインポート方法を教えてください。

トピックを理解します。漠然とした質問に遭遇した場合は、インタビュアーに適切に尋ねることができます。
面接のために面接官と協力する:面接は相互理解のプロセスです。面接官があなたの本当のスキルを見ることができるように、面接の質問と時間を十分に活用して能力とスキルを示す必要があります。

1)データベースの使用方法は何ですか?

(1)openOrCreateDatabase(String path);
(2)SqliteOpenHelperクラスを継承して、データベースとそのバージョンを管理します(onCreate、onUpgrade)このクラスのメソッドgetWritableDatabase()またはgetReadableDatabase();がプログラムで呼び出されると、データベース開かれます。その時点でデータベースファイルがない場合、システムは自動的にデータベースを生成します。

2)操作タイプ:
追加、削除、変更、CRUDのチェック、SQLステートメントの直接操作:SQliteDatabase.execSQL(sql);オブジェクト指向操作:SQLiteDatabase.insert(table、nullColumnHack、ContentValues);

外部データベースをインポートする方法は?

通常、外部データベースファイルはSDカードまたはres / rawまたはassetsディレクトリの下に配置できます。管理するDBManagerクラスを作成し、データベースファイルを移動し、最初にデータベースファイルを「/ data / data / packagename / databases /」ディレクトリにコピーしてから、db.openOrCreateDatabase(dbファイル)を介して使用するためにデータベースを開きます。これは前回のプロジェクトで行ったことです。アプリを起動する前に組み込む必要のある初期データがいくつかあるため、データのアップグレードなどの問題も発生します。これを実行しました...同時に、私が遭遇した最も興味深い問題は、データベースの同時実行性に関するものでした。次のような操作上の問題:データベースのマルチスレッド操作では、カプセル化を使用し、ミューテックスロックを使用して解決します...

2.ローカル放送を利用したことがありますか?グローバル放送との違いは何ですか?

ローカル放送を導入するメカニズムは、セキュリティの問題を解決することです
。1)送信中の放送はアプリケーションから分離されないため、アプリのデータ漏洩を心配する必要があります
。2)他のプログラムは送信できません。私のアプリケーションに、セキュリティについて心配する必要はありません。抜け穴。(例:強制終了できないサービスの作成方法-WeChat、Youmeng、Jiguangブロードキャストなどのアプリを起動するのを聞いて、自分で開始します。)
3)ローカルブロードキャストの送信は、グローバルブロードキャストの送信よりも効率的です。(グローバルブロードキャストによって維持されるブロードキャストセットテーブルは効率が低くなります。グローバルブロードキャストは、クロスプロセスが可能であり、最下層のサポートが必要であることを意味します。)

ローカルブロードキャストは静的登録を使用できません。----静的登録:プログラム停止後に監視できます。使用:
(1)登録
LocalBroadcastManager.getInstance(this).registerReceiver(new XXXBroadCastReceiver()、new IntentFilter(action));
(2)登録解除
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiv er)

3. IntentServiceを使用したことがありますか、その機能は何ですか、AIDLはどのような問題を解決しますか?(Xiaomi)

タスクがある場合、それは多くのサブタスクに分割でき、それらは順番に完了する必要があります。サービスで完了する必要がある場合は、IntentServiceを使用するのが最良の選択です。
通常、使用するサービスはメインスレッドで実行されるため、サービスに時間のかかる操作コードを記述すると、メインスレッドはANRを取得します。このような問題を解決するために、GoogleはIntentServiceを導入しました。IntentServiceの利点:
(1)すべてのインテントを処理するための独立したワーカースレッドを作成します。
(2)onHandleIntent()にインテントを1つずつ送信するワークキューを作成します。
(3)ソースコード自体が自動シャットダウンを実装しているため、サービスを終了するためにstopSelf()を呼び出す必要はありません。
(4)onBind()によって返されるnullは、デフォルトで実装されています。
(5)onStartCommand()のデフォルトの実装の目的は、インテントをワークキューに挿入することです。

概要:IntentServiceを使用する利点は何ですか。1つは、スレッドを手動で開始する手間を省く、2つ目は、サービスを手動で停止する必要がない、3つ目は、ワークキューが設計されているため、複数回開始できるstartService()ですが、サービスインスタンスは1つだけです。そして1つのワーカースレッド。1つずつ実行に精通してください。

AIDLはどのような問題を解決しますか?

AIDLのフルネーム:Androidインターフェース定義言語、Androidインターフェース定義言語。Androidシステムのプロセス間でメモリを共有することはできないため、異なるプロセス間のデータ通信のためにいくつかのメカニズムを提供する必要があります。
リモートプロシージャコール:RPC-リモートプロシージャコール。Androidは、サービスインターフェースを公開するためのIDLソリューションを提供します。AIDL:それは2者間の合意として理解することができます。両当事者は、この合意を保持する必要があります-テキスト合意xxx.aidlファイル(Androidが内部でコンパイルされると、aidlプロトコルはxxx.javaファイルに変換されます-プロキシモード:バインダードライバー関連、Linux基盤通信関連)。

システムサービスなど、システムソースコードで使用される多くの支援があります。

TVセットトップボックスシステムの開発。サービスは、使用する他の開発者に公開する必要があります。バインダーメカニズムを説明する

4.アクティビティ、ウィンドウ、ビューの違いは何ですか?また、フラグメントの特徴は何ですか?(360)

アクティビティ、ウィンドウ、およびビューの3つは、どのようにインターフェイスを一緒に表示しますか。-テストポイント:表示されたプロセス(ビュー描画プロセス)のソースコードに精通していること。
アクティビティは、ウィンドウグリル(制御)をカットします。ウィンドウウィンドウ(モデルが運ばれます)。ウィンドウグリルを表示します(表示されるビュー)。LayoutInflaterはさみ-レイアウト(図面)をウィンドウグリルにカットします。(Alt +方向矢印)

フラグメントの特徴は何ですか?(フラグメントを楽しんだり、落とし穴を踏んだりしましたか?)
フラグメントの設計は、主に、ロジックを含むアクティビティインターフェイスを多くの独立したモジュールに分割することで、モジュールの再利用とより柔軟なアセンブリを容易にします。インターフェイスの。

1)フラグメントはアクティビティインターフェイスの一部として使用できます
。2)複数のフラグメントを1つのアクティビティに表示でき、1つのフラグメントを複数のアクティビティで使用できます
。3)アクティビティの実行中に、動的に追加、削除、および置換できます。断片。
4)フラグメントには独自のライフサイクルがあり、入力イベントに応答できます。

ピットが踏んだ:

  1. 重複;
  2. newAPI(互換性パッケージソリューション)に注釈を付けます。
  3. Setarguement()はデータを初期化します。
  4. コミットできません;保存後...()メソッド
  5. スタック間の問題;-トランザクション。

アクティビティジャンプと同じ効果があり、戻ると前のページ(フラグメント)に戻ることができ、状態はそのままです。replace(f1、f2)はライフサイクルに深刻な影響を及ぼします:add()+ show + hide

5.低バージョンSDKは高バージョンAPIを実装します(Xiaomi)

2つの状況:
1)一般に、上位バージョンの多くの新しいAPIは、互換性パッケージに代替実装を見つけます。フラグメントなど。通知、v4互換性パッケージにはNotificationCompatクラスがあります。5.0以降backgroundTintとminSdkが5.0未満の場合、検出エラーが含まれます。v4互換性パッケージDrawableCompatクラス。
2)代替実装なしの手動実装。例:コントロールの水の波及効果-サードパーティの実装。または、この効果を下位バージョンで直接削除します。
3)補足:minSDKが設定されているが、コードでより高いバージョンのAPIが使用されている場合、検出エラーが発生します。コードでは、@ SuppressLintアノテーションや@TargetApiアノテーションなどの宣言型コンパイル検出戦略を使用して、コンパイラーにルールのコンパイルを促す必要があります。@SuppressLintは検出を無視します; @ TargetApi = 23は、関数で使用されているAPIに従ってSDKのバージョンと厳密に一致し、対応するコンパイルエラープロンプトを表示します。
4)ロケーションエラーを回避するために、廃止されたAPIを使用しないことをお勧めします。(通常の状況では、互換性の問題は発生しません。このAPIメソッドは、後でいつでも削除される可能性があります。パフォーマンスの問題です。)

6.起動モードのアプリケーションシナリオ(Baidu、Xiaomi、LeTV)

スタック:後入れ先出し
標準モード
シングルトップ:使用シナリオ:ブラウザのブックマーク、通信メッセージのチャットインターフェイス。
SingleTask:使用シナリオ:アクティビティがメインインターフェイスとして使用される場合。
SingleInstance:使用シナリオ:たとえば、BrowserActivityは非常にメモリを大量に消費し、アクティビティをシングルトンモードに設定できるように、多くのアプリがそれを呼び出す必要があります。例:目覚まし時計。

7.描画プロセスを表示する(Baidu)

測定:測定し、自分で測定します。ViewGroupの場合、その中のすべての子ビューを測定する必要があります。
どうすればよいですか?setMeasuredDimension(resolveSizeAndState(maxWidth、widthMeasureSpec、childState)、heightSizeAndState);独自のサイズを設定します。
レイアウト:場所、自分を置く場所。ViewGroupの場合、その中のすべての子ビューを配布する必要があります。
具体的にどのように配置しますか?

ドロー:ドロー

/*
 * Draw traversal performs several drawing steps which must be executed
 * in the appropriate order:
 *
 * 1. Draw the background 
 * 2. If necessary, save the canvas' layers to prepare for fading
 * 3. Draw view's content
 * 4. Draw children
 * 5. If necessary, draw the fading edges and restore layers
 * 6. Draw decorations (scrollbars for instance) */

8.メモリリークの原因(Meituan)

1)メモリリークとは:GCガベージコレクションのメカニズムとGCルートの概念を説明するのが最善です。
2)メモリリークが発生する理由:メモリリークは人為的ミスが原因であるためです。さらに、オブジェクト指向開発には複雑でマルチスレッドの関係があり、階層関係への深く混沌とした参照が発生しがちです。
3)メモリリークを引き起こす可能性のある状況;
4)メモリリークを解決する方法;

9.ANRのポジショニングと修正

/data/anr/traces.txtを表示すると、ANR情報を表示できます。
根本的な原因は次のとおりです。メインスレッドがスタックし、アプリケーションが5秒以内にユーザー入力イベントに応答できなくなります。
ANRエラーが発生するシナリオはたくさんあります
。1)IO /ネットワーク操作がメインスレッドで実行されるため、ブロックが簡単です。
2)時間のかかる計算はメインスレッドで実行されます。----コントロールをカスタマイズするときにonDrawメソッドで行われることがよくあります。(同時に、カスタムコントロールのパフォーマンスの最適化について説明しましょう。onDrawでオブジェクトを作成すると、メモリジッターが発生しやすくなります。描画アクションが継続的に呼び出され、多数のガベージオブジェクトが生成されるため、GCとメモリジッター。)メモリジッターはUIを引き起こす可能性があります。フレームのドロップとフリーズの問題があります。
3)BroadCastReceiverが10秒以内に処理を完了しませんでした。
4)BroadCastReceiverのonReceivedコードは、時間のかかる操作も最小限に抑える必要があります。処理にはIntentServiceを使用することをお勧めします。
5)サービスはメインスレッドでも実行されるため、サービスは時間のかかる操作を実行しました。そのため、時間のかかる操作は子スレッドのサービスで開く必要があります。
6)AsyncTaskを使用して、時間のかかるIOおよびその他の操作を処理します。
7)ThreadまたはHandlerThreadを使用する場合は、Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)またはjava.lang.Thread.setPriority(int priority)を使用して、優先度をバックグラウンド優先度に設定します。これにより、他のマルチスレッドによるCPU時間の同時消費が発生します。削減削減、これはメインスレッドの処理に役立ちます。
8)アクティビティのonCreateおよびonResumeコールバックで可能な限り時間のかかる操作。

10. oomの原因(LeEco、Meituan)

OOMの理由:メモリ不足、Androidシステムは各アプリケーションにハード条件を設定します:DalvikHeapSize最大しきい値64M / 48M / 24M。アプリケーションのメモリ使用量がこのしきい値に近い場合、この時点で再試行するとOOMが発生しますメモリが割り当てられたとき。
1)メモリリークが増えると、簡単にOOMにつながる可能性があります
。2)大きな画像の処理。画像を圧縮します。通常、開発では、オブジェクトの頻繁な作成とリサイクルに注意を払う必要があります。
3)適切な検出:ActivityManager.getMemoryClass()を使用して、現在のアプリケーションのHeapSizeしきい値を照会できます。これは、adb shellgetProp | grepdalvik.vm.heapxxxlimitという名前で表示できます。
メモリリークを回避する方法:
1)オブジェクトのメモリフットプリントを削減します
。a)より軽量なデータ構造を使用します。必要に応じて、HashMapなどの従来のデータ構造を置き換え、携帯電話用に特別に開発されたAndroidのデータ構造クラスArrayMap / SparseArrayを使用します。 。SparseLongMap / SparseIntMap / SparseBoolMapの方が効率的です。HashMap.put(string、Object); Object o = map.get(string);は、不要な自動ボックス化とボックス化解除を引き起こします。
b)通常の静的定数を使用する代わりに、Androidで列挙型列挙を使用することは適切に避けてください。(一般的に、私たちはまだ多目的列挙型ソフトウェアアーキテクチャ設計を提唱しています。多くの使用を必要とするこの列挙型に遭遇した場合は、パフォーマンスの問題を解決する傾向があります。)
c)ビットマップオブジェクトのメモリ使用量が少ない。inSampleSizeを使用して、画像圧縮の画像圧縮率を計算します。これにより、大きな画像の読み込みによって発生するOOMを回避できます。decodeformat:画像のデコード形式の選択、ARGB_8888 / RGB_565 / ARGB_4444 / ALPHA_8、WebPも使用できます。
d)小さい画像リソースを使用します。画像内に、圧縮できるスペースがあるかどうか。
2)メモリオブジェクトの再利用:オブジェクトプールテクノロジを使用して、2つのタイプ:
1。自分で書き込む;
2。システムの既存のオブジェクトプールメカニズムを使用する。たとえば、LRU(最近使用したもの)アルゴリズム。
a)ListView / GridViewソースコードは、ConvertViewの再利用を確認できます。RecyclerViewのリサイクラーソースコード。
b)ビットマップ多重化リストビューなどは多数の画像を表示する必要があります。画像を再利用するには、LRUキャッシュメカニズムを使用する必要があります。
c)onDrawメソッドでオブジェクトを作成することを避け、それらを再利用します。メモリジッターを回避します。
d)一般的な基本的なJavaの問題-StringBuilderなど
。3)オブジェクトのメモリリークを回避します
。4)いくつかのメモリ最適化戦略を使用します。ドキュメントを参照してください。

11.Androidサービスとアクティビティ間の通信のいくつかの方法

1)バインダー経由
2)放送経由

12.AndroidバージョンのAPIの違い

3.0 / 4.0、4.4、5.0、6.0 /7.0などのいくつかの主要バージョンの機能を覚えておいてください。

13. Requestlayout、onlayout、onDraw、DrawChild(チーター)の違いとつながり

RequestLayout()メソッド:Measure()メソッドとlayout()が呼び出されます。フラグビットに従ってonDraw()が必要かどうかを判断します;
onLayout():子コントロールをviewGroupに
配置しますonDraw():ビュー自体を描画します;(ViewGroupもすべての子コントロールを描画する必要があります)
drawChild() :それぞれをもう一度コールバックします。サブビューのdrawメソッド。child.draw(canvas、this、drawingTime);

14. invalidate()とpostInvalidate()の違いと使用法(百度)

 invalidate():在主线程当中刷新;
 postInvalidate():在子线程当中刷新;其实最终调用的就是 invalidate,原理依然 是通过工作线程向主线程发送消息这一机制。 
 public void postInvalidate() {
    
    
    postInvalidateDelayed(0);
 }
 public void postInvalidateDelayed(long delayMilliseconds) {
    
    
     // We try only with the AttachInfo because there's no point in invalidating
     // if we are not attached to our window
   final AttachInfo attachInfo = mAttachInfo;
   if (attachInfo != null) {
    
     
      attachInfo.mViewRootImpl.dispatchInvalidateDelayed(this, delayMilliseconds);
   }
 }
    public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
    
    
       Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view); 
       mHandler.sendMessageDelayed(msg, delayMilliseconds);
       }
 public void handleMessage(Message msg) {
    
    
     switch (msg.what) {
    
    
     case MSG_INVALIDATE: ((View) msg.obj).invalidate();
    } 
          break;

15. Androidアニメーションフレームワークの実装原則(Tencent)

従来のアニメーションフレームワーク:View.startAnimation();
短所:移動後にクリックできない。理由?それは実装メカニズムと関係があります。
ビューが常に更新され、描画と呼ばれるときに、すべての透明度、回転、平行移動、およびズームのアニメーションが実装されます。
canvas.translate(xxx)、canvas.scaleX(xxx)…を呼び出します。Xxx:マトリックスピクセルマトリックスを呼び出して、アニメーションデータを制御します。ソースコードを確認し、複数のズームされたデモでソースコードを確認することを忘れないでください。

16.各アプリケーションにAndroidによって割り当てられたメモリサイズはどれくらいですか?(美団)

特定の携帯電話プラットフォームに応じて、一般的なものは次のとおりです。64M/ 32Mなど。

17. LinearLayoutとRelativeLayout(Baidu)

パフォーマンスの比較:LinearLayoutのパフォーマンスはRelativeLayoutのパフォーマンスよりも優れています。
なぜなら、RelativeLayoutは2回測定するからです。デフォルト(重みは設定されていません)LinearLayoutは1回だけ測定されます。
なぜRelativeLayoutは2回測定するのですか?まず、RelativeLayoutでのサブビューの配置は相互依存関係に基づいており、この依存関係はレイアウト内のビューの順序とは関係がない場合があります。各サブビューの位置を決定するときは、各サブビューを並べ替える必要があります。最初。また、RelativeLayoutでは水平方向と垂直方向の相互依存が可能であるため、水平方向と垂直方向の両方で並べ替え測定を実行する必要があります。

18.カスタムビューを最適化する(Baidu、LeTV、Xiaomi)

1)onDrawでの大量の計算とオブジェクトの作成、および大量のメモリ割り当てを削減します。
2)invalidate()の数はできるだけ少なくする必要があります。
3)時間のかかる操作レイアウト。UIシステムがツリー全体を再トラバースしないようにrequestLayout()を減らします。Mearsure。
4)非常に複雑なレイアウトがある場合は、独自のViewGroupを使用してこの複雑なレイアウトを実装することをお勧めします。縮小されたツリーのすべての階層関係は、最適化の目的を達成するために、それ自体で測定およびレイアウトされます。(Facebookはしばしばこれを行います)

19. ContentProvider(LeEco)

ヒント:クロスプロセス通信。プロセス間のデータ交換と共有。

20.フラグメントのライフサイクル

21.ボレー分析(Meituan、LeTV)

22. AndroidGlideのソースコード分析

23. Android属性アニメーションの特性(LeTV、Xiaomi)

総括する

Androidの基本や基礎となるメカニズムなどのインタビューの知識ポイントがこれよりはるかに多いことは誰もが知っています。もっと書いてみんなに学んでもらいたかったのですが、記事の長さが限られているため、ここでしか共有できません。とりあえず。でも、暇なときにAndroid関連の面接の質問を集めて整理し、自分でブラッシングを行って、市場での地位のニーズを満たしているかどうかをテストするのが好きです。Android関連の面接の質問と知識について知りたい場合は、ポイント、あなたは私のGitHubプロジェクトアドレスに直接行くことができます:https://github.com/733gh/Android-T3表示するために。

おすすめ

転載: blog.csdn.net/u012165769/article/details/113871946