站長資訊網
        最全最豐富的資訊網站

        Android高級面試題及答案分析

        推薦:《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文檔

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 日韩精品视频在线观看免费| 亚洲av无码成人精品国产| 国产区精品福利在线观看精品| 一本大道久久a久久精品综合| 狠狠精品久久久无码中文字幕 | 久久青草国产精品一区| 四虎国产精品永久在线观看| 久草热8精品视频在线观看| 久久se精品一区精品二区| 国语精品一区二区三区| 中文字幕无码精品亚洲资源网久久| 精品久久久久久无码国产| 93精91精品国产综合久久香蕉| 国产精品熟女高潮视频| 亚洲AV永久无码精品| 亚洲国产一成久久精品国产成人综合| 国产一区二区精品久久岳| 国产成人精品亚洲精品| 911亚洲精品国内自产| 久久青草国产精品一区| 99在线热播精品免费99热| 囯产精品一品二区三区| 国产精品无码AV一区二区三区| 久久久久女人精品毛片| 日韩精品人妻系列无码专区| 亚洲日韩国产AV无码无码精品| 午夜福利麻豆国产精品| 欧美精品色婷婷五月综合| 久久这里有精品视频| 黑巨人与欧美精品一区 | 亚洲国产精品激情在线观看| 蜜臀AV无码国产精品色午夜麻豆| 国产精品高清免费网站| 国产精品国产三级国产a| 国产农村妇女毛片精品久久| 国产精品伊人久久伊人电影| 国产精品人人做人人爽| 国产精品亚洲w码日韩中文| 国产农村妇女毛片精品久久| 久久久久人妻一区精品| 久久精品国产精品亚洲人人 |