안드로이드 개발 2 년, 아웃소싱 후 12 개 이상의 중소 공장을 인터뷰하고 드디어 제안을받은 후 안드로이드 1 차 인터뷰 질문을 정리했습니다!

1. 여러 프로세스 간 통신 방법

인 텐트 전화 걸기,
ContentProvider 데이터베이스 저장 데이터
방송 방송 통신
AIDL 통신, 인터페이스를 통한 데이터 공유 등

2. 대기와 수면의 차이

Wait는 Object의 메서드이고 wait는 객체 잠금입니다. locked 메서드는 실행을 계속하지 않습니다. 알림 메서드가 실행되면 계속 실행됩니다. Sleep은 Thread의 메서드입니다. Sleep은 스레드를 sleep, 포기하는 것입니다. cpu, 종료 후 자동으로 실행을 계속합니다.

3. String, StringBuffer, StringBuilder의 차이점

문자열은 변경할 수 없으며 생성 된 후에는 수정할 수 없습니다.

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

위의 코드는 str을 변경하지만 실행 프로세스는 str을 회수하고 값을 새 str에 할당하는 것입니다.

StringBuffer 생성 후 StringBuilder를 수정하거나 수정할 수 있습니다. 실행 효율성은 안전하지 않은 StringBuffer보다 실행 효율이 높습니다. 문자 할당시 String 사용이 적고 문자 할당시 StringBuilder가 자주 사용되며 StringBuffer 사용 여러 스레드가 데이터를 동 기적으로 작동 할 때.

4. View와 SurfaceView의 차이점

View는 기본 스레드를 기반으로 UI를 새로 고치고 SurfaceView 하위 스레드는 UI를 새로 고칠 수 있습니다.

5. 그리기 원리보기

View는 모든 그래픽 컨트롤의 기본 클래스이며 View의 그리기는 3 가지 기능으로 완성됩니다.

측정, 뷰 크기 계산,
레이아웃, 표시 할 뷰 위치 제공,
그리기, 그리기.

6. JNI에 대한 간략한 설명

Java와 C 언어를 연결하는 가교 역할을합니다 .Java는 반 해석 언어이므로 디 컴파일이 가능합니다 .C 프로그래밍은 안전에 중요한 코드에 사용됩니다. 또한 많은 기본 함수가 C 언어를 호출하여 구현합니다. Java 휠을 재발 명 할 필요가 없으므로 JNI 인터페이스의 구현이 정의됩니다.

7. TCP, UDP, 소켓에 대한 간략한 설명

TCP는 3 방향 핸드 셰이크, 네 손을 흔들어 일련의 데이터 전송을 완료하고, UDP는 연결이 없으며, IP 주소와 포트 번호를 알고 데이터가 성공적으로 전송되었는지 여부에 관계없이 데이터를 보낼 수 있습니다.

소켓은 파일 전송, 인스턴트 메시징과 같은 다른 컴퓨터, 실시간 연결입니다.

8. 오디오 및 비디오 관련 카테고리

일반적으로 다음과 같은 여러 범주로 나뉩니다.

  • 비디오 녹화, Camear 카메라 녹화 비디오 카테고리, MediaProjection 화면 녹화 비디오 카테고리
  • 인코딩, MediaCodec, MediaRecorder
  • 미리보기, SurfaceView, GLSurfaceView, TextureView, VideoView 측면에서

9. 프로세스와 스레드의 차이점

개념 : 프로세스에는 여러 스레드, 프로그램 당 하나의 프로세스가 포함되며 멀티 스레딩의 장점은 실행 효율성과 리소스 활용을 향상시킬 수 있습니다.

만들기 : 스레드 클래스 및 실행 가능 인터페이스;

일반적인 방법은 다음과 같습니다.

  • start ()는 스레드를 시작하는 데 사용됩니다.
  • run ()은 스레드 객체에서 run 메소드를 호출합니다.
  • join () 큐를 현재 스레드에 병합
  • sellp () 절전 해제 CPU 리소스
  • setPriority ()는 스레드 우선 순위를 설정합니다.

10. 메모리 누수 확인 및 해결 방법

개념 : 일부 개체는 제한된 수명 주기만 가지고 있습니다. 작업이 완료되면 가비지 수집됩니다. 개체의 수명주기가 종료 될 예정인 경우 개체는 여전히 시리즈에서 참조되므로 메모리 누수가 발생합니다..

솔루션 : 오픈 소스 프레임 워크 LeakCanary를 사용하여 대상 솔루션을 감지합니다.

일반적인 메모리 누수는 다음과 같습니다.

  • 단일 항목으로 인한 메모리 누수, 예를 들어 단일 항목의 컨텍스트 수명주기가 자체 컨텍스트 수명주기보다 큽니다.
  • 스레드는 Hander로 인한 메모리 섀클을 사용합니다. 활동이 종료되면 스레드가 UI를 업데이트하기 위해 계속 실행됩니다.
  • 비 정적 클래스에서 정적 변수를 사용하면 복구 및 해제가 불가능하여 누출이 발생합니다.
  • WebView 페이지가 너무 많으면 메모리 누수가 발생합니다.
  • 리소스가 닫히지 않아 데이터베이스가 사용 된 후 연결을 닫는 등의 누출이 발생합니다.

11.보기 배포 메커니즘, 슬라이딩 충돌

View의 이벤트 전달 시퀀스에는 dispatchTouchEvent ()가이 이벤트를 소비하는지, onInterceptTouchEvent ()가이 이벤트를 가로채는 지, onTouchEvent ()가이 이벤트를 처리하는지, 슬라이딩 충돌이 같은 방향의 슬라이딩 충돌로 나뉩니다. 예를 들어 ScrollView와 ListView가 같은 방향으로 슬라이딩 충돌하면 ListView의 높이를 계산하고 ListView의 높이를 동적으로 설정할 수 있으며 ScrollView의 높이는 가변적입니다. 예를 들어, ViewPager와 ListView는 서로 다른 방향으로 슬라이딩 충돌이 있습니다. 하나는 수평 슬라이딩이고 다른 하나는 수직 슬라이딩입니다. 서로 다른 방향으로 슬라이딩하면 슬라이딩 x, y 축이 수평인지 수직인지를 결정할 수 있습니다. 수평으로 판단되면 슬라이딩하면 ListView 이벤트를 가로 챌 수 있습니다., Vertical은 반대입니다.

12. RecyclerView와 ListView의 차이점

캐싱 : 전자는 매번 findViewById를 호출하지 않고 View + ViewHolder + flag를 캐시하고 후자는 뷰를 캐시합니다.

데이터 새로 고침 측면에서 전자는 부분 새로 고침을 제공하고 후자는 모두 새로 고칩니다.

13. recyclerView 중첩 지연 솔루션을 해결하는 방법

사전로드 수 설정 :
LinearLayoutManager.setInitialPrefetchItemCount (4), 기본값은 2 개 사전로드,
하위 항목 캐시
설정, 기본 제공 슬라이딩 충돌 해결 속성 설정 rv.setHasFixedSize (true); rv.setNestedScrollingEnabled (false);
가능 하지만 Google은 RecyClerView의 중첩 사용을 권장하지 않습니다.이를 해결하려면 ExpandableListView와 유사한 타사 컨트롤을 찾아야합니다.

14. MVC, MVP, MVVM에 대해 이야기

MVC : 보기는 모델에 직접 액세스 할 수 있습니다! 따라서 뷰에는 모델 정보가 포함되고 일부 비즈니스 로직이 필연적으로 포함됩니다. MVC 모델에서는 변경되지 않은 모델에 더 많은주의를 기울이며 동시에 모델 및보기의 여러 다른 디스플레이가 있습니다. 따라서 MVC 모델에서 Model은 View에 의존하지 않고 View는 Model에 의존한다. 뿐만 아니라 일부 비즈니스 로직이 뷰에 구현되어있어 뷰 변경이 어렵고, 적어도 해당 비즈니스 로직은 재사용 할 수 없습니다.

MVP : MVP는 고전적인 패턴 MVC에서 발전했습니다. 그들의 기본 아이디어에는 유사점이 있습니다. 컨트롤러 / 발표자는 로직 처리를 담당하고 모델은 데이터를 제공하며 뷰는 디스플레이를 담당합니다. 새로운 모델로서 MVP와 MVC는 큰 차이가 있습니다. View는 MVP에서 Model을 직접 사용하지 않고, 이들 간의 통신은 Presenter (MVC의 Controller)를 통해 수행되며 모든 상호 작용은 Inside the Presenter 및 MVC에서 발생합니다. 뷰는 컨트롤러를 통하지 않고 직접 모델에서 데이터를 읽습니다.

MVVM : 양방향 데이터 바인딩, 데이터 기반 UI, M은 데이터 제공, V보기, VM은 데이터 기반 계층

15. 대거 2

Dagger2는 주로 종속성 주입에 사용되는 프레임 워크로 초기화 개체 작업을 줄이고 결합을 줄입니다.

16Android 성능 최적화

레이아웃 최적화 : 레이아웃 수준을 낮추고, ViewStub을 사용하여 표시 속도를 높이고, 레이아웃을 늘리고, 가능한 한 warp_content를 사용하고, 공간에서 쓸모없는 속성을 삭제하고, 과도한 그리기를 피하고, 창의 기본 배경을 제거하고, 필요에 따라 부스 맵을 표시합니다. ,보기 최적화를 사용자 정의하고 canvas.clipRect ()를 사용하여 가시 영역을 식별합니다.

시작 속도 : 분산로드, 비동기로드, 지연로드를 사용하여 애플리케이션 초기화 속도를 개선하고 스레드를 사용하여 데이터를 초기화하는 등 합리적인 새로 고침 메커니즘을 사용합니다.

메모리 측면 : 메모리 누수 방지 하려면 일부 타사 도구를 사용하여 감지하고 해결합니다.

코드 최적화 : Java 라이프 사이클 따르기

설치 패키지 최적화 : 불필요한 리소스 삭제, 사진 최적화, 코드 난독 화, 중복 인벤토리 방지, 플러그인

17. Hander 원리

핸들러, 루프 폴링 감지는 MessagerQuery로 메시지를 보내고, MessageQuery는 메시지를 대기열에 넣고, 핸들러 콜백 메서드는 메시지를 처리하고, handMessage 메서드를 재정 의하여 UI를 새로 고칩니다.

18. SharedPreference가 여러 프로세스에서 사용되면 어떻게됩니까? 교차 프로세스 사용의 안전을 보장하는 방법은 무엇입니까?

두 응용 프로그램의 매니페스트 구성에서 동일한 shartdUserId 속성을 사용합니다. 응용 프로그램 A는 데이터를 정상적으로 저장하고 응용 프로그램 B는 createPackageContext ( "com.netease.nim.demo", CONTEXT_IGNORE_SECURITY)를 사용하여 컨텍스트를 얻은 다음 응용 프로그램 데이터를 가져옵니다. 데이터 보안을 보장하기 위해 , 암호화는 스토리지에 사용됩니다.

19. 푸시 도착률 개선 방법

휴대폰 시스템을 판단하면 샤오 미는 샤오 미 푸시를, 화웨이는 화웨이 푸시를, 다른 휴대폰은 우멩 푸시를 사용합니다.

20. 활동, 조각 값 전달 문제

Bundle을 통해 값을 전달하고, 활성에서 변수 전달 값을 정의하고, 조각을 확장하여 전달 값을 생성합니다.

21. 활동과 조각의 차이

수명주기 :

조각의 생성에서 파괴에 이르는 전체 수명주기는 다음과 같습니다.

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

활동과는 다른 방법이 있습니다

  • onAttach () : Fragment와 Activity가 연결될 때 호출됩니다.
  • onCreateView () : Fragment가 뷰를 생성 할 때 호출됩니다.
  • onActivityCreated : 프래그먼트와 연관된 활동이 완료된 후 호출됩니다. onCreate ();
  • onDestoryView () : Fragment의 레이아웃이 제거 될 때 호출됩니다.
  • onDetach () : Fragment와 Activity가 연결 해제 될 때 호출됩니다. 일반적으로 사용되는 활동 수명주기는 다음과 같습니다.
  • onCreate () : 활동이 생성되고 있음을 나타내며 setContentView를 호출하여 인터페이스 레이아웃 리소스를로드하고 활동에 필요한 데이터를 초기화하는 등 작업을 초기화하는 데 자주 사용됩니다.
  • onRestart () : 활동이 다시 시작됨을 나타냅니다. 일반적으로 현재 Acitivty가 보이지 않음에서 다시 표시로 변경되면 OnRestart가 호출됩니다.
  • onStart () : 활동이 시작되고 있음을 나타냅니다. 현재 활동은 표시되지만 포 그라운드에는 없습니다. 여전히 백그라운드에 있으며 사용자와 상호 작용할 수 없습니다.
  • onResume () : 활동에 초점이 있음을 나타냅니다. 이때 활동이 표시되고 포 그라운드에 있으며 활동을 시작합니다. 이는 onStart와의 차이점입니다.
  • onPause () : 활동이 중지되고 있음을 나타냅니다. 현재 데이터 저장 및 애니메이션 중지와 같은 일부 작업을 수행 할 수 있지만 새 활동의 표시에 영향을 미치므로 너무 많은 시간이 걸리지 않아야합니다. 먼저 실행해야하며 새 활동의 onResume이 수행됩니다.
  • onStop () : 활동이 곧 중지됨을 나타내며 브로드 캐스트 수신기에서 로그 오프, 네트워크 연결 종료 등과 같은 무거운 재활용 작업을 수행 할 수 있으며 시간이 너무 많이 걸리지 않아야합니다.
  • onDestroy () : 활동이 곧 폐기 될 예정임을 나타냅니다. 이것은 활동의 수명주기에서 마지막 콜백으로, 종종 재활용 작업과 자원 해제를 수행합니다.

차이점:

  • Fragment는 Activity보다 콜백주기가 4 개 더 많으며 제어 작업이 더 유연합니다.
  • 단편은 xml 파일에 직접 작성하거나 활동에 동적으로 추가 할 수 있습니다.
  • Fragment는 show () / hide () 또는 replace ()를 사용하여 Fragment를 전환 할 수 있습니다. 전환 할 때 명백한 효과가 없으며 활동 전환시 명백한 페이지 전환 또는 기타 효과가 있습니다.

22. Fragment에서 추가와 바꾸기의 차이점은 무엇입니까?

  • 추가는 조각을 다시 초기화하지 않고 매번 교체합니다.
  • 동일한 프래그먼트를 추가 할 때 교체에 변경 사항이 없으며 add는 IllegalStateException을보고합니다.
  • replace는 먼저 동일한 ID를 가진 모든 조각을 제거한 다음 현재 조각을 추가하고 add는 이전 조각을 덮습니다. 따라서 add를 사용하면 일반적으로 레이아웃이 겹치지 않도록 hide () 및 show ()가 동반됩니다.
  • add를 사용하면 응용 프로그램이 백그라운드에 배치되거나 다른 방식으로 시스템에 의해 파괴되는 경우 다시 열릴 때 hide ()에서 참조 된 조각이 파괴되므로 여전히 레이아웃 오버랩 버그가 발생합니다. replace를 사용할 수 있습니다. 또는 매개 변수 추가를 사용할 때 태그를 추가하십시오.

23. FragmentPagerAdapter와 FragmentStatePagerAdapter의 차이점과 사용 시나리오는 무엇입니까?

FragmentPagerAdapter의 각 프래그먼트는 사용자가 페이지로 돌아갈 수있는 한 영구히 FragmentManager에 저장됩니다. 따라서 상대적으로 정적 인 데이터와 상대적으로 적은 수의 프래그먼트가있는 페이지에 적합합니다 .FragmentStatePagerAdapter는 현재 페이지 만 유지하며 페이지가 보이지 않으면 프래그먼트가 제거되고 해당 리소스가 해제됩니다. 따라서 데이터가 더 동적이고 더 많은 메모리를 차지하며 더 많은 조각이있는 상황에 적합합니다.

24. 활동의 4 가지 시작 모드와 애플리케이션 시나리오는 무엇입니까?

  • 표준 표준 모드 : 활동을 시작할 때마다이 인스턴스가 이미 존재하는지 여부에 관계없이 새 인스턴스가 다시 생성됩니다.이 모드의 활동은 기본적으로 시작된 활동의 작업 스택에 들어갑니다.
  • singleTop 스택 최상위 재사용 모드 : 새 활동이 이미 작업 스택의 맨 위에있는 경우이 활동이 다시 생성되지 않고 onNewIntent 메서드가 다시 호출됩니다. 새 활동 인스턴스가 이미 존재하지만 맨 위에 있지 않은 경우 스택의 경우 활동은 여전히 ​​다시 생성됩니다.
  • SingleTask in-stack 재사용 모드 : Activity가 작업 스택에 존재하는 한 Activity가 여러 번 시작되면 인스턴스가 다시 생성되지 않고 onNewIntent 메서드가 다시 호출됩니다.이 모드는 Activity A를 시작하고 시스템이 시작됩니다. 먼저 A가 원하는 작업 스택이 있는지 확인하고, 존재하지 않으면 작업 스택을 다시 만든 다음 생성 된 A 인스턴스를 스택에 넣습니다.
  • singleInstance 단일 인스턴스 모드 : 향상된 singleTask 모드입니다.이 모드의 활동은 단일 작업 스택에만있을 수 있으며이 작업 스택에는 인스턴스가 하나만 있습니다.

25. 활동과 창 및보기의 관계에 대해 이야기합니까?

Activity가 생성되면 PhoneWindow 인 attach ()에 의해 Window가 초기화됩니다. PhoneWindow는 DecorView의 인스턴스를 보유합니다. DecorView 자체는 FrameLayout이며 View에서 상속됩니다. Activty는 setContentView를 통해 지속적으로 xml 레이아웃 컨트롤을 View에 추가합니다. 우리와 상호 작용하는 창;

26. 수평 화면과 수직 화면을 전환 할 때 활동 수명주기가 변경됩니까?

활동의 android : configChanges가 설정되지 않은 경우 화면이 잘릴 때 현재 활동이 소멸되고 각 라이프 사이클이 다시로드됩니다. 수평 화면 전환시 1 회, 수직 화면 전환시 2 회 실행됩니다. 전환됨;

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

모델에서 테스트 한 활동의 ​​android : configChanges = "orientation"설정

Android5.1 즉, API 3 23 레벨에서는 화면이 잘릴 때 각 라이프 사이클이 다시 호출되고 화면이 가로 또는 세로로 잘릴 때 한 번만 실행됩니다.

API 8 28 레벨 인 Android9에서는 화면 잘라내 기가 각 수명주기를 다시 호출하지 않고 onConfigurationChanged 메서드 만 실행됩니다.

공식 수정 후 원어는 다음과 같습니다.

앱이 Android 2 3.2를 대상으로하는 경우 이는 API 레벨 3 13 이상을 의미합니다
(minSdkVersion 및 targetSdkVersion에 따라).

계속하려면 ...

인터뷰 전 시스템 검토 경로

때로는 노력보다 선택이 더 중요하고 투쟁보다 기회가 더 중요합니다. 그러나 기회는 준비된 사람들에게만 예약되어 있습니다. 항상 준비가되어있을 때만 기회가 올 때 포착 할 수 있습니다.

여기 내 인터뷰 검토 경로 를 공유하기 위해 도움이 필요한 친구는 다음을 참조 할 수 있습니다.

1. 체계적인 학습 영상보기

크루 드의 지난 몇 년간의 경험을 통해 내가 정말 신인 선수라는 것을 깨닫게되었고, 크루 드 덕분에 내 기술이 상대적으로 파편화되어 있고 체계적이 될만큼 깊지 않아서 다시 공부할 필요가있다. . 내가 부족한 것은 시스템 지식, 열악한 구조적 프레임 워크 및 아이디어이므로 비디오를 통해 배우는 것이 더 좋고 포괄적입니다. 비디오 학습과 관련하여 개인은 B 스테이션에서 공부하는 것이 좋습니다. 스테이션 B에는 많은 학습 비디오가 있습니다. 유일한 단점은 무료이며 쉽게 구식이라는 것입니다.

2. 체계적으로 지식을 분류하고 매장량을 개선합니다.

클라이언트 개발에는 많은 지식 포인트가 있으며 인터뷰에는 여전히 적은 것이 있습니다. 따라서 이러한 지식 포인트를 얼마나 잘 준비하는지 확인하기 위해 인터뷰를위한 다른 트릭은 없습니다. 따라서 인터뷰를 위해 외출 할 때 리뷰에서 어느 단계에 도달했는지 확인하는 것이 좋습니다.

시스템 학습 방향 :

  • 아키텍트를위한 필수 기술 : 심층 자바 제네릭 + 간단한 언어 주석 + 동시 프로그래밍 + 데이터 전송 및 직렬화 + 자바 가상 머신 원칙 + 리플렉션 및 클래스 로딩 + 동적 프록시 + 효율적인 IO

  • Android 고급 UI 및 FrameWork 소스 코드 : 고급 UI 프로모션 + 프레임 워크 커널 분석 + Android 구성 요소 커널 + 데이터 지속성

  • 360 ° 전체 성능 튜닝 : 디자인 아이디어 및 코드 품질 최적화 + 프로그램 성능 최적화 + 개발 효율성 최적화

  • 오픈 소스 프레임 워크 디자인 아이디어 해석 : 핫 리페어 디자인 + 플러그인 프레임 워크 해석 + 컴포넌트 프레임 워크 디자인 + 이미지 로딩 프레임 워크 + 네트워크 액세스 프레임 워크 디자인 + RXJava 반응 형 프로그래밍 프레임 워크 디자인 + IOC 아키텍처 디자인 + Android 아키텍처 컴포넌트 Jetpack

  • NDK 모듈 개발 : NDK 기본 지식 시스템 + 기본 이미지 처리 + 오디오 및 비디오 개발

  • WeChat Mini 프로그램 : Mini 프로그램 소개 + UI 개발 + API 운영 + WeChat Docking

  • 하이브리드 개발 및 Flutter : Html5 프로젝트 전투 + Flutter Advanced

지식이 정리 된 후 빠진 부분을 확인해야하므로 이러한 지식 포인트에 대해 많은 e-book과 메모를 준비해 두었습니다.이 메모는 각 지식 포인트에 대한 완벽한 요약을 제공합니다.

3. 소스 코드를 읽고 실제 전투 노트를 읽고 신의 생각을 배웁니다.

"프로그래밍 언어는 프로그래머가 표현하는 방식이고 아키텍처는 프로그래머가 세상에 대한 인식입니다." 따라서 프로그래머가 아키텍처를 빠르게 이해하고 배우고 싶다면 소스 코드를 읽는 것이 필수적입니다. 소스 코드를 읽는 것은 문제를 해결하고 사물을 이해하는 것입니다. 더 중요한 것은 소스 코드의이면에있는 아이디어를보고 프로그래머가 말합니다 : 수천 줄의 소스 코드를 읽고 수천 가지 방법을 연습하는 것입니다.

4. 인터뷰 전날 질문 스프린트

인터뷰 1 주일 전에 스프린트를 시작할 수 있습니다. 질문을 할 때 기술이 최우선이고 알고리즘은 분류 등의 기본이며, 학교 신입생이 아닌 지적 질문은 일반적으로 묻지 않습니다.

인터뷰 질문과 관련하여 저는 여러분이 서로 배울 수 있도록 체계적인 인터뷰 질문을 개인적으로 준비했습니다.

위의 콘텐츠는 정식 버전이 필요한 모든 사람, 친구와 무료로 공유 할 수 있습니다 . 모든 콘텐츠를 보려면 여기를 클릭하십시오 .

추천

출처blog.csdn.net/weixin_44339238/article/details/112853749