目錄
一、效能最佳化
1.如何對Android應用進行效能分析
2.什麼情況下會導致記憶體外洩
3.如何避免 OOM 異常
首先OOM是什麼?
Android的OOM怎麼樣?
如何避免OOM
減少記憶體物件的佔用
記憶體物件的重複利用
4.Android 中如何擷取未擷取的例外
5.ANR 是什麼?如何避免並解決 ANR(重要)
怎麼避免ANR
如何解决ANR
6.Android 线程间通信有哪几种方式
7.Devik 进程,linux 进程,线程的区别
8.描述一下 android 的系统架构
9.android 应用对内存是如何限制的?我们应该如何合理使用内存?
10. 简述 android 应用程序结构是哪些
11.请解释下 Android 程序运行时权限与文件系统权限的区别
12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么
13.多线程间通信和多进程之间通信有什么不同,分别怎么实现
14.Android 屏幕适配
15.什么是 AIDL 以及如何使用
16.Handler 机制
17.事件分发机制
18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
19.子线程中能不能 new handler?为什么
20.Android 中的动画有哪几类,它们的特点和区别是什么
21.如何修改 Activity 进入和退出动画
22.SurfaceView & View 的区别
二、项目框架的使用
23.开发中都使用过哪些框架、平台
24.使用过那些自定义View
25.自定义控件:绘制圆环的实现过程
26.自定义控件:摩天轮的实现过程
27.GridLayout的使用
28.流式布局的实现过程
29.第三方登陆
30.第三方支付
首頁 web前端 前端問答 Android進階面試問題及答案分析

Android進階面試問題及答案分析

Jul 31, 2020 pm 03:53 PM

推薦:《2020年Android面試題大匯總【收藏】

一、效能最佳化

1.如何對Android應用進行效能分析

android 效能主要之響應速度和UI刷新速度。

可以參考部落格:Android系統效能調優工具介紹

首先從函數的耗時來說,有一個工具TraceView 這是androidsdk自帶的工作,用於測量函數耗時的。

UI佈局的分析,可以有2塊,一塊就是Hierarchy Viewer 可以看到View的佈局層次,以及每個View刷新載入的時間。

這樣可以很快定位到那塊layout & View 耗時最長。

還有就是透過自訂View來減少view的層次。

2.什麼情況下會導致記憶體外洩

記憶體外洩是個折騰的問題。

什麼時候會發生記憶體外洩?記憶體外洩的根本原因:長生命週期的物件持有短生命週期的物件。短週期物件就無法及時釋放。

I. 靜態集合類別造成記憶體外洩

主要是hashmap,Vector等,如果是靜態集合 這些集合沒有及時setnull的話,就會一直持有這些物件。

II.remove 方法無法刪除set集  Objects.hash(firstName, lastName);

經過測試,hashcode修改後,就沒有辦法remove了。

III. observer 我們在使用監聽器的時候,往往是addxxxlistener,但是當我們不需要的時候,忘記removexxxlistener,就容易內存leak。

廣播沒有unregisterrecevier

IV.各種資料連結沒有關閉,資料庫contentprovider,io,sokect等。 cursor

V.內部類別:

java中的內部類別(匿名內部類別),會持有宿主類別的強引用this。

所以如果是new Thread這種,後台執行緒的操作,當執行緒沒有執行結束時,activity不會被回收。

Context的引用,當TextView 等等都會持有上下文的引用。如果有static drawable,就會導致該記憶體無法釋放。

VI.單例

單例 是一個全域的靜態對象,當持有某個複製的類別A是,A無法被釋放,記憶體leak。

3.如何避免 OOM 異常

首先OOM是什麼?

當程式需要申請一段「大」內存,但是虛擬機沒有辦法及時的給到,即使做了GC操作以後

這就會拋出OutOfMemoryException 也就是OOM

Android的OOM怎麼樣?

為了減少單一APP對整個系統的影響,android為每個app設定了一個記憶體上限。

    public void getMemoryLimited(Activity context)
    {
        ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        System.out.println(activityManager.getMemoryClass());
        System.out.println(activityManager.getLargeMemoryClass());
        System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024));
    }
登入後複製
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 512
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
登入後複製

HTC M7實測,192M上限。 512M 一般情況下,192M就是上限,但由於某些特殊情況,android允許使用一個更大的RAM。

如何避免OOM

減少記憶體物件的佔用

I.ArrayMap/SparseArray取代hashmap

II.避免在android裡面使用Enum

III.減少bitmap的記憶體佔用

  • inSampleSize:縮放比例,在把圖片載入記憶體之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。
  • decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,有很大差異。

IV.減少資源圖片的大小,過大的圖片可以考慮分段載入

記憶體物件的重複利用

大多數物件的複用,都是利用物件池的技術。

I.listview/gridview/recycleview contentview的複用

#II.inBitmap 屬性對於記憶體物件的複用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8

這個方法在某些條件下非常有用,例如要載入上千張圖片的時候。

III.避免在ondraw方法裡面new物件

IV.StringBuilder 取代

4.Android 中如何擷取未擷取的例外

public class CrashHandler implements Thread.UncaughtExceptionHandler {    private static CrashHandler instance = null;    public static synchronized CrashHandler getInstance()
    {        if(instance == null)
        {
            instance = new CrashHandler();
        }        return instance;
    }    public void init(Context context)
    {
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override    public void uncaughtException(Thread thread, Throwable ex) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("Thread:");
        stringBuilder.append(thread.toString());
        stringBuilder.append("\t");
        stringBuilder.append(ex);
        TraceLog.i(stringBuilder.toString());
        TraceLog.printCallStatck(ex);
    }
}
登入後複製

#CrashHandler

關鍵是實作Thread.UncaughtExceptionHandler

然後是在application的oncreate裡面註冊。

5.ANR 是什麼?如何避免並解決 ANR(重要)

ANR->Application Not Responding

也就是在規定的時間內,沒有回應。

三種:

1). KeyDispatchTimeout(5 seconds) --主要類型按鍵或觸控事件在特定時間內無回應

2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定時間內無法處理完成

3).ServiceTimeout(20 seconds) --小機率類型Service在特定的時間內無法處理完成

#為什麼會逾時:事件沒有機會處理& 事件處理超時

怎麼避免ANR

ANR的關鍵

是處理超時,所以應該避免在UI線程,BroadcastReceiver 還有service主線程中,處理複雜的邏輯和計算

而交給work thread操作。

1)避免在activity裡面做耗時操作,oncreate & onresume

2)避免在onReceiver裡面做過多操作

3)避免在Intent Receiver裡啟動一個Activity,因為它會創造一個新的畫面,並從目前使用者正在執行的程式中搶奪焦點。

4)尽量使用handler来处理UI thread & workthread的交互。

如何解决ANR

首先定位ANR发生的log:

04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}.  5009.8ms since event, 5009.5ms since waitstarted
登入後複製
CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况04-0113:12:15.872 E/ActivityManager(  220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager(  220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
登入後複製

从log可以看出,cpu在做大量的io操作。

所以可以查看io操作的地方。

当然,也有可能cpu占用不高,那就是 主线程被block住了。

6.Android 线程间通信有哪几种方式

1)共享变量(内存)

2)管道

3)handle机制

runOnUiThread(Runnable)

view.post(Runnable)

7.Devik 进程,linux 进程,线程的区别

Dalvik进程。

每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。

所以dalvik进程和linux进程是可以理解为一个概念。

8.描述一下 android 的系统架构

从小到上就是:

linux kernel,lib dalvik vm ,application framework, app

9.android 应用对内存是如何限制的?我们应该如何合理使用内存?

activitymanager.getMemoryClass() 获取内存限制。

关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。

10. 简述 android 应用程序结构是哪些

1)main code

2) unit test

3)mianifest

4)res->drawable,drawable-xxhdpi,layout,value,mipmap

mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.

google建议只把启动图片放入。

5)lib

6)color

11.请解释下 Android 程序运行时权限与文件系统权限的区别

文件的系统权限是由linux系统规定的,只读,读写等。

运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。

12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么

Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。

简单来说framework就是提供app生存的环境。

1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)

2)onCreate中的setContentView方法,会创建DecorView

3)DecorView 的addview方法,会把layout中的布局加载进来。

13.多线程间通信和多进程之间通信有什么不同,分别怎么实现

线程间的通信可以参考第6点。

进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,

Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。

14.Android 屏幕适配

屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。

dp来适配屏幕,sp来确定字体大小

drawable-xxdpi, values-1280*1920等 这些就是资源的适配。

wrap_content,match_parent, 这些是view的自适应

weight,这是权重的适配。

15.什么是 AIDL 以及如何使用

Android Interface Definition Language

AIDL是使用bind机制来工作。

参数:

java原生参数

String

parcelable

list & map 元素 需要支持AIDL

16.Handler 机制

参考:android 进程/线程管理(一)----消息机制的框架 这个系类。

17.事件分发机制

android 事件分发机制

18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么

EventBus,广播,view.post, runinUiThread

但是无论各种花样,本质上就2种:handler机制 + 广播

19.子线程中能不能 new handler?为什么

必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。

20.Android 中的动画有哪几类,它们的特点和区别是什么

视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。

属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0

帧动画,通过drawable一帧帧画出来。

Gif动画,原理同上,canvas画出来。

具体可参考:https://i.cnblogs.com/posts?categoryid=672052

21.如何修改 Activity 进入和退出动画

overridePendingTransition

22.SurfaceView & View 的区别

view的更新必须在UI thread中进行

surfaceview会单独有一个线程做ui的更新。

surfaceview 支持open GL绘制。

二、项目框架的使用

23.开发中都使用过哪些框架、平台

I.EventBus 事件分发机制,由handler实现,线程间通信

II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils

III.百度地图

IV.volley

V.fastjson

VI.picciso

VII.友盟

VIII.zxing

IX.Gson

24.使用过那些自定义View

pull2RefreshListView

25.自定义控件:绘制圆环的实现过程

package com.joyfulmath.samples.Cycle;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/**
 * Created by Administrator on 2016/9/11 0011. */public class CycleView extends View {
    Paint mPaint = new Paint();    public CycleView(Context context) {        this(context, null);
    }    public CycleView(Context context, AttributeSet attrs) {        super(context, attrs);
        initView();
    }    private void initView() {
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(20);
    }

    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);
        canvas.drawCircle(100,100,50,mPaint);
    }
}
登入後複製

CycleView

关键是canvas.drawCycle & paint.setsytle(stoken)

26.自定义控件:摩天轮的实现过程

27.GridLayout的使用

可以不需要adapter

28.流式布局的实现过程

TBD.

29.第三方登陆

QQ & 微信都有第三方登陆的sdk,要去注册app

30.第三方支付

需要看支付宝的API文档

以上是Android進階面試問題及答案分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

什麼是使用效果?您如何使用它執行副作用? 什麼是使用效果?您如何使用它執行副作用? Mar 19, 2025 pm 03:58 PM

本文討論了React中的使用效應,這是一種用於管理副作用的鉤子,例如數據獲取和功能組件中的DOM操縱。它解釋了用法,常見的副作用和清理,以防止記憶洩漏等問題。

咖哩如何在JavaScript中起作用,其好處是什麼? 咖哩如何在JavaScript中起作用,其好處是什麼? Mar 18, 2025 pm 01:45 PM

本文討論了JavaScript中的咖哩,這是一種將多重題材函數轉換為單詞彙函數序列的技術。它探討了咖哩的實施,諸如部分應用和實際用途之類的好處,增強代碼閱讀

JavaScript中的高階功能是什麼?如何使用它們來編寫更簡潔和可重複使用的代碼? JavaScript中的高階功能是什麼?如何使用它們來編寫更簡潔和可重複使用的代碼? Mar 18, 2025 pm 01:44 PM

JavaScript中的高階功能通過抽象,常見模式和優化技術增強代碼簡潔性,可重複性,模塊化和性能。

反應和解算法如何起作用? 反應和解算法如何起作用? Mar 18, 2025 pm 01:58 PM

本文解釋了React的對帳算法,該算法通過比較虛擬DOM樹有效地更新DOM。它討論了性能優勢,優化技術以及對用戶體驗的影響。

什麼是Usecontext?您如何使用它在組件之間共享狀態? 什麼是Usecontext?您如何使用它在組件之間共享狀態? Mar 19, 2025 pm 03:59 PM

本文解釋了React中的UseContext,該文章通過避免道具鑽探簡化了狀態管理。它討論了通過減少的重新租賃者進行集中國家和績效改善之類的好處。

如何使用Connect()將React組件連接到Redux Store? 如何使用Connect()將React組件連接到Redux Store? Mar 21, 2025 pm 06:23 PM

文章討論了使用Connect()將React組件連接到Redux Store,解釋了MapStateToprops,MapDispatchToprops和性能影響。

您如何防止事件處理程序中的默認行為? 您如何防止事件處理程序中的默認行為? Mar 19, 2025 pm 04:10 PM

文章討論了使用DestrestDefault()方法在事件處理程序中預防默認行為,其好處(例如增強的用戶體驗)以及諸如可訪問性問題之類的潛在問題。

受控和不受控制的組件的優點和缺點是什麼? 受控和不受控制的組件的優點和缺點是什麼? Mar 19, 2025 pm 04:16 PM

本文討論了React中受控和不受控制的組件的優勢和缺點,重點是可預測性,性能和用例等方面。它建議在選擇之間選擇因素。

See all articles