中高級(jí)Android工程師面試

Activity面試詳情

activity生命周期

1.activity的4種狀態(tài)

running/paused/stopped/killed

2.activity的生命周期

activity啟動(dòng)->onCreate()->onStart()->onResume()

點(diǎn)擊home鍵回到主界面(activity不可見(jiàn))->onPause()->stop()

當(dāng)我們?cè)俅位氐皆璦ctivity時(shí)->onRestart()->onStart()->onResume()

退出當(dāng)前activity時(shí)->onPause()->onStop()->onDestroy()

3.android進(jìn)程優(yōu)先級(jí)

前臺(tái)/可見(jiàn)/服務(wù)/后臺(tái)/空

二.android任務(wù)棧


三.activity啟動(dòng)模式

啟動(dòng)模式可在AndroidManifest.xml中俏竞,通過(guò)標(biāo)簽的android:launchMode屬性設(shè)置长捧。

1.standard模式

? ? a.Activity的默認(rèn)啟動(dòng)模式

? ? b.每啟動(dòng)一個(gè)Activity就會(huì)在棧頂創(chuàng)建一個(gè)新的實(shí)例。例如:鬧鐘程序

?? ?缺點(diǎn):當(dāng)Activity已經(jīng)位于棧頂時(shí)叔收,而再次啟動(dòng)Activity時(shí)還需要在創(chuàng)建一個(gè)新的實(shí)例撤奸,不能直接復(fù)用吠昭。

2.singleTop模式

?? ?特點(diǎn):該模式會(huì)判斷要啟動(dòng)的Activity實(shí)例是否位于棧頂,如果位于棧頂直接復(fù)用胧瓜,否則創(chuàng)建新的實(shí)例矢棚。 例如:瀏覽器的書簽

?? ?缺點(diǎn):如果Activity并未處于棧頂位置,則可能還會(huì)創(chuàng)建多個(gè)實(shí)例府喳。

3.singleTask模式

?? ?特點(diǎn):使Activity在整個(gè)應(yīng)用程序中只有一個(gè)實(shí)例。每次啟動(dòng)Activity時(shí)系統(tǒng)首先檢查棧中是否存在當(dāng)前Activity實(shí)例兜粘,如果存在

?? ??? ? ? ?? 則直接復(fù)用弯蚜,并把當(dāng)前Activity之上所有實(shí)例全部出棧孔轴。例如:瀏覽器主界面

4.singleInstance模式

?? ?特點(diǎn):該模式的Activity會(huì)啟動(dòng)一個(gè)新的任務(wù)棧來(lái)管理Activity實(shí)例,并且該勢(shì)力在整個(gè)系統(tǒng)中只有一個(gè)熟吏。無(wú)論從那個(gè)任務(wù)棧中??? 啟動(dòng)該Activity,都會(huì)是該Activity所在的任務(wù)棧轉(zhuǎn)移到前臺(tái)悍引,從而使Activity顯示帽氓。主要作用是為了在不同程序中共享一個(gè)Activity

四.scheme跳轉(zhuǎn)協(xié)議

Android中的Scheme是一種頁(yè)面內(nèi)跳轉(zhuǎn)協(xié)議趣斤,通過(guò)自定義Scheme協(xié)議,可以跳轉(zhuǎn)到app中的任何頁(yè)面浓领。

1.服務(wù)器可以定制化跳轉(zhuǎn)app頁(yè)面

2.app可以通過(guò)Scheme跳轉(zhuǎn)到另一個(gè)app頁(yè)面

3.可以通過(guò)h5頁(yè)面跳轉(zhuǎn)app原生頁(yè)面



fragment面試詳解

一.fragment為什么會(huì)稱為第五大組件

Android有四大組件,activity势腮,broadcastReceiver联贩,service,contentprovider捎拯。沒(méi)錯(cuò)泪幌,可是我覺(jué)得Fragment的作用不亞于它們,因此自封為第五大組件署照。

二.fragment加載到activity的兩種方式

1.添加fragment到activity的布局文件當(dāng)中

靜態(tài)啟動(dòng):所謂的靜態(tài)啟動(dòng)就是在xml文件中指定該fragment組件

2.動(dòng)態(tài)在activity中添加fragment

所謂的動(dòng)態(tài)啟動(dòng)祸泪,就是通過(guò)代碼啟動(dòng)fragment:

三.FragmentPageAdapter和FragmentPageStateAdapter的區(qū)別

FragmentPageAdapter在每次切換頁(yè)面的的時(shí)候,是將Fragment進(jìn)行分離建芙,適合頁(yè)面較少的Fragment使用以保存一些內(nèi)存禁荸,對(duì)系統(tǒng)內(nèi)存不會(huì)多大影響

FragmentPageStateAdapter在每次切換頁(yè)面的時(shí)候右蒲,是將Fragment進(jìn)行回收,適合頁(yè)面較多的Fragment使用翰撑,這樣就不會(huì)消耗更多的內(nèi)存

四.fragment的通信

1.在fragment調(diào)用activity方法? getActivity()

2.在activity調(diào)用fragment方法 接口回調(diào)

3.在fragment調(diào)用fragment方法 findFragmentById

新的方案回答?

方案一,? ?handler方案

activity向fragment傳遞消息

activity響應(yīng)事件乓土,發(fā)送msg喳挑,到fragment中唯袄,而fragment中用來(lái)接收msg,所以用注冊(cè)Handler對(duì)象翻伺,activity中發(fā)送msg的對(duì)象與fragment中handler對(duì)象必須為同一個(gè)(handler姐浮,msgqueen和looper相互唯一綁定)蟀瞧,所以要在activity中暴露pubilic方法讓fragment的acttch周期中傳遞handler

方案二,利用廣播的方式

在fragment中發(fā)送廣播,在activity中注冊(cè)廣播接收者

方案三笛谦、使用EventBus3.0通信*

EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線

方案四赋除,使用接口’

在fragment中創(chuàng)建接口箕肃,activity實(shí)現(xiàn)接口中方法督函,完成回調(diào)和參數(shù)傳遞嘀粱。

總結(jié):

如果項(xiàng)目中fragment不是很多話,可以用廣播傳遞辰狡,注意廣播的注銷锋叨,也比較簡(jiǎn)單。

最后不要使用Handler宛篇,耦合比較高娃磺,處理不好容易內(nèi)存泄露,無(wú)法獲取activity返回值

EventBus采用反射機(jī)制叫倍,造成性能上問(wèn)題偷卧,無(wú)法獲取activity的返回值

普通接口豺瘤,用于少量fragment中,性能還不錯(cuò)听诸,怕擴(kuò)展坐求。


五.fragment的replace,add,remove三個(gè)方法



Service面試詳解

一.service是什么?

四大組件之一,service是一個(gè)一種可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而沒(méi)有用戶界面的應(yīng)用組件

二service啟動(dòng)方式

1.startService

1.定義一個(gè)類繼承service

2.在manifest.xml文件中配置該service

3.使用context的startService(intent)啟動(dòng)該service

4.不再使用時(shí),調(diào)用stopService(Intent)停止該服務(wù)


2.bindService

1.創(chuàng)建bindService服務(wù)段,繼承自service并在類中,創(chuàng)建一個(gè)實(shí)現(xiàn)binder接口的實(shí)例對(duì)象并提供公共方法給客戶端調(diào)用

2從onbind()回調(diào)方法返回此binder實(shí)例

3在客戶端中,從onserviceconnected()回調(diào)方法接收binder,并使用提供的方法調(diào)用綁定服務(wù)



BroadCast receiver面試詳情

一.廣播定義

在android中,broadcast是一種廣泛的運(yùn)用的在應(yīng)用程序直接傳輸信息的機(jī)制,android中我們要發(fā)送的廣播內(nèi)容是一個(gè)intent,這個(gè)intent中可以攜帶我們要傳送的數(shù)據(jù)

二.廣播使用場(chǎng)景

1.同一個(gè)app具有多個(gè)進(jìn)程的不同組件之間的消息通信

2.不同app之間的組件之間消息通信

三.實(shí)現(xiàn)廣播-receiver

1.靜態(tài)注冊(cè):注冊(cè)完成就一直運(yùn)行

2.動(dòng)態(tài)注冊(cè):跟隨activity的生命周期



webview面試詳解


一.webview常見(jiàn)的一些坑

1. webview 在android api16以及之前版本的安全漏洞晌梨,該漏洞是因?yàn)槌绦驔](méi)有正確的限制webview.addjavascriptinterface方法桥嗤,讓遠(yuǎn)程攻擊者可以使用java的反射機(jī)制利用該漏洞執(zhí)行任意的java對(duì)象方法。

2. webview動(dòng)態(tài)添加到其他布局的時(shí)候仔蝌,在activity銷毀的生命周期時(shí)泛领,需要主動(dòng)調(diào)用webview.removeallviews和webview的ondestory方法釋放內(nèi)存,否則會(huì)導(dǎo)致內(nèi)存泄漏掌逛。

3. jsbridge 师逸,js橋可以允許遠(yuǎn)程網(wǎng)頁(yè)端與android的native端進(jìn)行通信司倚,通俗的說(shuō)就是使用js橋可以在android代碼中調(diào)用網(wǎng)頁(yè)的js方法豆混,也可以讓js調(diào)用原生的代碼

4. 當(dāng)前正在加載的網(wǎng)頁(yè)產(chǎn)生跳轉(zhuǎn)的時(shí)候這個(gè)方法可能會(huì)被多次調(diào)用,所以當(dāng)你的WebView需要加載各種各樣的網(wǎng)頁(yè)并且需要在頁(yè)面加載完成時(shí)采取一些操作的話动知,可以在WebChromeClient.onProgressChanged()中處理原本用WebViewClient.onPageFinished()執(zhí)行的操作

5.webview硬件加速導(dǎo)致渲染問(wèn)題皿伺,比如加載的時(shí)候會(huì)有閃屏現(xiàn)象,解決方式就是暫時(shí)關(guān)閉硬件加速盒粮。



handler面試詳解

一.handlerd的工作原理

處理過(guò)程:?

從handler中獲取一個(gè)消息對(duì)象鸵鸥,把數(shù)據(jù)封裝到消息對(duì)象中,通過(guò)handler的send…方法把消息push到MessageQueue隊(duì)列中丹皱。?

Looper對(duì)象會(huì)輪詢MessageQueue隊(duì)列妒穴,把消息對(duì)象取出。?

通過(guò)dispatchMessage分發(fā)給Handler摊崭,再回調(diào)用Handler實(shí)現(xiàn)的handleMessage方法處理消息讼油。

流程圖:?


Handler的實(shí)現(xiàn)中適及以下對(duì)象:?

1、Handler本身:負(fù)責(zé)消息的發(fā)送和處理?

2呢簸、Message:消息對(duì)象?

3矮台、MessageQueue:消息隊(duì)列(用于存放消息對(duì)象的數(shù)據(jù)結(jié)構(gòu))?

4、Looper:消息隊(duì)列的處理者(用于輪詢消息隊(duì)列的消息對(duì)象根时,取出后回調(diào)handler的dispatchMessage進(jìn)行消息的分發(fā)瘦赫,dispatchMessage方法會(huì)回調(diào)handleMessage方法把消息傳入,由Handler的實(shí)現(xiàn)類來(lái)處理)

Message對(duì)象的內(nèi)部實(shí)現(xiàn)是鏈表蛤迎,最大長(zhǎng)度是50确虱,用于緩存消息對(duì)象,達(dá)到重復(fù)利用消息對(duì)象的目的替裆,以減少消息對(duì)象的創(chuàng)建校辩,所以通常我們要使用obtainMessage方法來(lái)獲取消息對(duì)象

安全:Handler的消息處理機(jī)制是線程安全

關(guān)系:創(chuàng)建Handler時(shí)會(huì)創(chuàng)建Looper唱较,Looper對(duì)象的創(chuàng)建又創(chuàng)建了MessageQueue



view繪制機(jī)制

一.View結(jié)構(gòu)原理

View定義了繪圖的基本操作基本操作由三個(gè)函數(shù)完成:measure()、layout()召川、draw()南缓,其內(nèi)部又分別包含了onMeasure()、onLayout()荧呐、onDraw()三個(gè)子方法汉形。具體操作如下:

1、measure操作? ? ?measure操作主要用于計(jì)算視圖的大小倍阐,即視圖的寬度和長(zhǎng)度概疆。在view中定義為final類型,要求子類不能修改峰搪。measure()函數(shù)中又會(huì)調(diào)用下面的函數(shù):? ? ?

(1)onMeasure()岔冀,視圖大小的將在這里最終確定,也就是說(shuō)measure只是對(duì)onMeasure的一個(gè)包裝概耻,子類可以覆寫onMeasure()方法實(shí)現(xiàn)自己的計(jì)算視圖大小的方式使套,并通過(guò)setMeasuredDimension(width, height)保存計(jì)算結(jié)果。?

2鞠柄、layout操作? ? ?layout操作用于設(shè)置視圖在屏幕中顯示的位置侦高。在view中定義為final類型,要求子類不能修改厌杜。layout()函數(shù)中有兩個(gè)基本操作:? ? ?(1)setFrame(l,t,r,b)奉呛,l,t,r,b即子視圖在父視圖中的具體位置,該函數(shù)用于將這些參數(shù)保存起來(lái)夯尽;? ? ?

(2)onLayout()瞧壮,在View中這個(gè)函數(shù)什么都不會(huì)做,提供該函數(shù)主要是為viewGroup類型布局子視圖用的匙握;?

3咆槽、draw操作? ? ?draw操作利用前兩部得到的參數(shù),將視圖顯示在屏幕上肺孤,到這里也就完成了整個(gè)的視圖繪制工作罗晕。子類也不應(yīng)該修改該方法,因?yàn)槠鋬?nèi)部定義了繪圖的基本操作:? ? ?

(1)繪制背景赠堵;? ? ?

(2)如果要視圖顯示漸變框小渊,這里會(huì)做一些準(zhǔn)備工作;? ? ?

(3)繪制視圖本身茫叭,即調(diào)用onDraw()函數(shù)酬屉。在view中onDraw()是個(gè)空函數(shù),也就是說(shuō)具體的視圖都要覆寫該函數(shù)來(lái)實(shí)現(xiàn)自己的顯示(比如TextView在這里實(shí)現(xiàn)了繪制文字的過(guò)程)。而對(duì)于ViewGroup則不需要實(shí)現(xiàn)該函數(shù)呐萨,因?yàn)樽鳛槿萜魇恰皼](méi)有內(nèi)容“的杀饵,其包含了多個(gè)子view,而子View已經(jīng)實(shí)現(xiàn)了自己的繪制方法谬擦,因此只需要告訴子view繪制自己就可以了切距,也就是下面的dispatchDraw()方法;? ? ?

(4)繪制子視圖,即dispatchDraw()函數(shù)惨远。在view中這是個(gè)空函數(shù)谜悟,具體的視圖不需要實(shí)現(xiàn)該方法,它是專門為容器類準(zhǔn)備的北秽,也就是容器類必須實(shí)現(xiàn)該方法葡幸;? ? ?

(5)如果需要(應(yīng)用程序調(diào)用了setVerticalFadingEdge或者setHorizontalFadingEdge),開(kāi)始繪制漸變框贺氓;? ? ?

(6)繪制滾動(dòng)條蔚叨;? ? ? 從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個(gè)方法。


事件分發(fā)機(jī)制


請(qǐng)謹(jǐn)記:Android事件分發(fā)流程 =?Activity -> ViewGroup -> View

即:1個(gè)點(diǎn)擊事件發(fā)生后辙培,事件先傳到Activity蔑水、再傳到ViewGroup、最終再傳到?View


從上可知虏冻,要想充分理解Android分發(fā)機(jī)制肤粱,本質(zhì)上是要理解:

Activity對(duì)點(diǎn)擊事件的分發(fā)機(jī)制

ViewGroup對(duì)點(diǎn)擊事件的分發(fā)機(jī)制

View對(duì)點(diǎn)擊事件的分發(fā)機(jī)制

即按順序講解:Activity事件分發(fā)機(jī)制弹囚、ViewGroup事件分發(fā)機(jī)制厨相、View事件分發(fā)機(jī)制

1.Activity的事件分發(fā)機(jī)制

當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí),事件最先傳到Activity的dispatchTouchEvent()進(jìn)行事件分發(fā)

當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí)鸥鹉,從Activity的事件分發(fā)開(kāi)始(Activity.dispatchTouchEvent())


方法總結(jié)

2 ViewGroup事件的分發(fā)機(jī)制

ViewGroup事件分發(fā)機(jī)制從dispatchTouchEvent()開(kāi)始

結(jié)論:Android事件分發(fā)總是先傳遞到ViewGroup蛮穿、再傳遞到View

過(guò)程:當(dāng)點(diǎn)擊了某個(gè)控件時(shí)

示意圖

核心方法總結(jié)

示意圖

3 View事件的分發(fā)機(jī)制

View事件分發(fā)機(jī)制從dispatchTouchEvent()開(kāi)始

每當(dāng)控件被點(diǎn)擊時(shí):

示意圖

注:onTouch()的執(zhí)行 先于?onClick()

核心方法總結(jié)

2.4 總結(jié)




okhttp網(wǎng)絡(luò)框架

一,get請(qǐng)求的使用方法

使用OKHttp進(jìn)行網(wǎng)絡(luò)請(qǐng)求支持兩種方式毁渗,一種是同步請(qǐng)求践磅,一種是異步請(qǐng)求

private void postDataWithParame() {

? ? OkHttpClient client = new OkHttpClient();//創(chuàng)建OkHttpClient對(duì)象。? ? FormBody.Builder formBody = new FormBody.Builder();//創(chuàng)建表單請(qǐng)求體? ? formBody.add("username","zhangsan");//傳遞鍵值對(duì)參數(shù)? ? Request request = new Request.Builder()//創(chuàng)建Request 對(duì)象灸异。? ? ? ? ? ? .url("http://www.baidu.com")

? ? ? ? ? ? .post(formBody.build())//傳遞請(qǐng)求體? ? ? ? ? ? .build();

? ? client.newCall(request).enqueue(new Callback() {府适。。肺樟。});//回調(diào)方法的使用與get異步請(qǐng)求相同檐春,此時(shí)略。}



retrofit網(wǎng)絡(luò)框架

Retrofit是Square開(kāi)源的一款適用于Android網(wǎng)絡(luò)請(qǐng)求的框架么伯。Retrofit底層是基于OkHttp實(shí)現(xiàn)的疟暖,與其他網(wǎng)絡(luò)框架不同的是,它更多使用運(yùn)行時(shí)注解的方式提供功能。



步驟1:添加Retrofit庫(kù)的依賴?

1. build.gradle? ????????????????????????????????????????????????????????????????????????????????????????????????? dependencies {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?compile 'com.squareup.retrofit2:retrofit:2.0.2' // Retrofit庫(kù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????compile 'com.squareup.okhttp3:okhttp:3.1.2' // Okhttp庫(kù)???????????????????????????????????????????????? }
2. 添加 網(wǎng)絡(luò)權(quán)限?AndroidManifest.xml

步驟2:創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類?

步驟3:創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口?

步驟4:創(chuàng)建 Retrofit 實(shí)例?

步驟5:創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口實(shí)例 并 配置網(wǎng)絡(luò)請(qǐng)求參數(shù)?

步驟6:發(fā)送網(wǎng)絡(luò)請(qǐng)求(異步 / 同步)

封裝了 數(shù)據(jù)轉(zhuǎn)換俐巴、線程切換的操作

步驟7:?處理服務(wù)器返回的數(shù)據(jù)


recyclerview面試詳解

一.recyclerview是Android 5.0推出的骨望,是support-v7包中的新組件。

第一步欣舵,導(dǎo)入support-v7包

第二步:初始化recycleview

第三步:寫adapter擎鸠,這里是填viewholder的,這個(gè)viewholder就是我下面寫的myholder缘圈。

二.recyclerview加載卡頓

主要就是對(duì)onScrollStateChanged方法進(jìn)行監(jiān)聽(tīng)糠亩,然后通知adapter是否加載圖片或復(fù)雜布局。對(duì)于復(fù)雜布局的優(yōu)化效果還是很明顯的准验。



listview優(yōu)化方案

一.convertView的使用赎线,主要優(yōu)化加載布局問(wèn)題

1.listivew每次滾動(dòng)都會(huì)調(diào)用gitview()方法,所以優(yōu)化gitview是重中之重糊饱。

二.內(nèi)部類ViewHolder的使用垂寥。主要優(yōu)化加載控件

主要優(yōu)化getView方法中每次回調(diào)用findviewByID()方法來(lái)獲取一次控件的代碼。

新增加內(nèi)部類ViewHolder,用于對(duì)控件的實(shí)力存儲(chǔ)進(jìn)行緩存另锋。

convertView為空時(shí)滞项,viewHolder會(huì)將空間的實(shí)力存放在ViewHolder里,然后用setTag方法講viewHolder對(duì)象存儲(chǔ)在view里夭坪。

convertView不為空時(shí)文判,用getTag方法獲取viewHolder對(duì)象.

三.有沒(méi)有想過(guò)ListView加載成千上萬(wàn)的數(shù)據(jù)為什么不出OOM錯(cuò)誤?

最主要的是因?yàn)镽ecycleBin機(jī)制室梅。

RecycleBin中有兩個(gè)重要的View數(shù)組戏仓,分別是mActiveViews和mScrapViews。

這兩個(gè)數(shù)組中所存儲(chǔ)的View都是用來(lái)復(fù)用的亡鼠,只不過(guò)mActiveViews中存儲(chǔ)的是OnScreen的View赏殃,這些View很有可能被直接復(fù)用;而mScrapViews中存儲(chǔ)的是OffScreen的View间涵,這些View主要是用來(lái)間接復(fù)用的仁热。


Android常用性能優(yōu)化方案

一.布局優(yōu)化

1)HTTP請(qǐng)求方式

這里指的是客戶端與服務(wù)端交互,拿到數(shù)據(jù)勾哩、解析抗蠢、再到顯示到界面整個(gè)過(guò)程耗費(fèi)的時(shí)間。

這個(gè)部分涉及客戶端的優(yōu)化思劳,也涉及服務(wù)端的優(yōu)化迅矛,這里只討論客戶端。


使用優(yōu)秀的開(kāi)源Http框架是我們比較好的選擇敢艰,它的優(yōu)點(diǎn)是經(jīng)過(guò)市場(chǎng)的驗(yàn)證. 加快響應(yīng)速度(網(wǎng)絡(luò)請(qǐng)求框架)诬乞。


2)數(shù)據(jù)解析

實(shí)際開(kāi)發(fā)當(dāng)中服務(wù)端的返回?cái)?shù)據(jù)格式無(wú)非就兩種:

- JSON

- XML

在Android中均可以使用優(yōu)秀的解析庫(kù)來(lái)加快我們的解析速度,XML中有dom4j,JSON有Jackson震嫉、Gson森瘪,我們通過(guò)這些庫(kù)實(shí)現(xiàn)我們更快的完成數(shù)據(jù)解析,提高我們的開(kāi)發(fā)效率票堵。


3)數(shù)據(jù)存儲(chǔ)

為了提高應(yīng)用程序的響應(yīng)時(shí)間扼睬,數(shù)據(jù)緩存是一個(gè)比較好的方式,我們可以預(yù)處理服務(wù)器返回的數(shù)據(jù)悴势,對(duì)數(shù)據(jù)進(jìn)行緩存刷新窗宇。


-?異步請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)

-?預(yù)處理服務(wù)器返回?cái)?shù)據(jù)

-?異步進(jìn)行數(shù)據(jù)存儲(chǔ)操作

-?數(shù)據(jù)緩存刷新

- Timeout超時(shí)重試

-?在主線程中操作UI

二.界面卡頓

ANR表示”應(yīng)用程序無(wú)響應(yīng)”,這個(gè)是需要我們避免發(fā)生的事情特纤,出現(xiàn)這個(gè)異常的原因:

-?主線程?(“事件處理線程”?/?“UI線程”)?在5秒內(nèi)沒(méi)有響應(yīng)輸入事件

- BroadcastReceiver在10秒內(nèi)沒(méi)有執(zhí)行完畢


導(dǎo)致ANR的原因有很多军俊,一般情況就是在UI線程做了耗時(shí)的操作,例如”網(wǎng)絡(luò)請(qǐng)求”捧存、數(shù)據(jù)庫(kù)操作粪躬。


那么如何避免?

-?UI線程只做界面刷新昔穴,不做任何耗時(shí)操作镰官,耗時(shí)操作放在子線程來(lái)做

-?可以使用Thread+handle或者AsyncTask來(lái)進(jìn)行邏輯處理



三.ListView和Bitmap優(yōu)化

listView優(yōu)化主要分為三個(gè)方面:

(1)使用ViewHolder并避免在getView方法中執(zhí)行耗時(shí)操作?

(2)根據(jù)列表的滑動(dòng)狀態(tài)來(lái)控制任務(wù)的執(zhí)行頻率,比如當(dāng)列表快速滑動(dòng)時(shí)不適合開(kāi)啟大量的異步任務(wù)吗货,?

(3)使用硬件加速來(lái)使listView的滑動(dòng)更加流暢

Bitmap優(yōu)化:

主要是通過(guò)BitmapFactory.Options來(lái)根據(jù)需要對(duì)圖片進(jìn)行采樣泳唠,采樣的過(guò)程主要使用到了BitmapFactory.Options?

來(lái)根據(jù)需要對(duì)圖片進(jìn)行采樣,采樣的過(guò)程主要使用到了BitmapFactory.Options的inSampleSize參數(shù)


四.線程優(yōu)化

線程優(yōu)化的思想是采用線程池宙搬,避免程序中存在大量的Thread笨腥。線程池可以重用內(nèi)部的線程,從而避免了線程的創(chuàng)建和銷毀帶來(lái)的性能開(kāi)銷害淤,同時(shí)線程池可以有效的控制線程的最大并發(fā)數(shù)扇雕,避免了大量線程因互相搶占系統(tǒng)資源而導(dǎo)致阻塞現(xiàn)象的發(fā)生。因此在實(shí)際開(kāi)發(fā)中應(yīng)盡量采用線程池窥摄,而不是每次都要?jiǎng)?chuàng)建一個(gè)Thread對(duì)象。


五.代碼優(yōu)化

?對(duì)常量使用static修飾符

-?使用靜態(tài)方法

-?減少不必要的成員變量

-?盡量不要使用枚舉础淤,少用迭代器

-?對(duì)Cursor崭放、Receiver、Sensor鸽凶、File等對(duì)象币砂,要注意它們的創(chuàng)建、回收與注冊(cè)玻侥、反注冊(cè)

-?避免大量使用注解决摧、反射

-?使用RenderScript、OpenGL來(lái)進(jìn)行復(fù)雜的繪圖操作

-?使用SurfaceView來(lái)替代View進(jìn)行大量、頻繁的繪圖操作

-?盡量使用視圖緩存掌桩,而不是每次都執(zhí)行inflate()方法解析視圖



Android中常見(jiàn)的設(shè)計(jì)模式

設(shè)計(jì)模式有23種 說(shuō)說(shuō)幾種常見(jiàn)的設(shè)計(jì)模式

1.單例模式:

單例模式太多了边锁,在整個(gè)應(yīng)用中只有一個(gè),標(biāo)準(zhǔn)的單例模式寫法:


單例模式的寫法

2.Builder模式

常見(jiàn)的builder模式有創(chuàng)建dialog的過(guò)程波岛。

3.策略方法模式

比如在注冊(cè)一個(gè)用戶信息時(shí)茅坛,可能最終會(huì)注冊(cè)到不同的服務(wù)器上,但是對(duì)于上層代碼并不關(guān)心最終用戶數(shù)據(jù)到哪则拷,只需要有地方存儲(chǔ)就可以贡蓖,所以可以抽象出存儲(chǔ)函數(shù),真正的實(shí)現(xiàn)讓其實(shí)現(xiàn)的子類去做煌茬。

4.工廠方法模式

我們創(chuàng)建的activity或者fragment中斥铺,定義基類的時(shí)候,可以將每個(gè)界面不同的地方抽象出來(lái)坛善,讓真正實(shí)現(xiàn)的子類去實(shí)現(xiàn)該統(tǒng)一的方法仅父。
5.觀察者模式

在安卓中觀察者模式用的比較多的地方在數(shù)據(jù)庫(kù)變化或者listview內(nèi)容有變化時(shí),使用notifyDataSetChanged()方法浑吟。

6.組合模式

這種模式在安卓中最常見(jiàn)笙纤,Android中的view是一種樹(shù)形結(jié)構(gòu),每個(gè)viewGroup包含一些列的view组力,而每個(gè)viewGroup本身又可以當(dāng)做一個(gè)view省容,所以最終手機(jī)上呈現(xiàn)出來(lái)的界面,是由一個(gè)個(gè)view組合而成的燎字。


7.適配模式

其實(shí)適配器模式很容易理解腥椒,我們?cè)贏ndroid開(kāi)發(fā)時(shí)也經(jīng)常用到。比較典型的有ListView和RecyclerView候衍。為什么ListView需要使用適配器呢笼蛛?主要是,ListView只關(guān)心它的每個(gè)ItemView蛉鹿,而不關(guān)心這個(gè)ItemView具體顯示的是什么滨砍。而我們的數(shù)據(jù)源存放的是要顯示的內(nèi)容,它保存了每一個(gè)ItemView要顯示的內(nèi)容妖异。ListView和數(shù)據(jù)源之間沒(méi)有任何關(guān)系惋戏,這時(shí)候,需要通過(guò)適配器他膳,適配器提供getView方法給ListView使用响逢,每次ListView只需提供位置信息給getView函數(shù),然后getView函數(shù)根據(jù)位置信息向數(shù)據(jù)源獲取對(duì)應(yīng)的數(shù)據(jù)棕孙,根據(jù)數(shù)據(jù)返回不同的View舔亭。

8.模板方法模式

這種模式也相當(dāng)常見(jiàn)些膨,比如我們的activity或者fragment,在base中定義了一些列的周期函數(shù)钦铺,基本把整個(gè)activity的框架全部定義好了订雾,所以我們只需要進(jìn)程基類的activity或者fragment方法,然后在定義好的周期函數(shù)中實(shí)現(xiàn)我們需要的內(nèi)容就可以职抡,而不用關(guān)心整個(gè)activity的啟動(dòng)所有過(guò)程葬燎。

9.代理模式

定義:為其他類提供一種代理以控制這個(gè)對(duì)象的訪問(wèn)。

在安卓中進(jìn)程通信是一個(gè)很常見(jiàn)的東西缚甩,如果需要進(jìn)行進(jìn)程通信則可以通過(guò)使用AIDL來(lái)獲取遠(yuǎn)程service的代理谱净,然后我們可以通過(guò)這個(gè)代理來(lái)執(zhí)行響應(yīng)的操作。



java的三大特性

java有大特性:封裝擅威,繼承多態(tài)壕探。

一.封裝

1. 封裝就是將類的信息隱藏在類內(nèi)部,不允許外部程序直接訪問(wèn)郊丛,而是通過(guò)該類的方法實(shí)現(xiàn)對(duì)隱藏信息的操作和訪問(wèn)李请。

2. 封裝是怎么實(shí)現(xiàn)的呢?

? ?a. 需要修改屬性的訪問(wèn)控制符(修改為private)厉熟;

? ?b. 創(chuàng)建getter/setter方法(用于屬性的讀寫)导盅;

? ?c. 在getter/setter方法中加入屬性控制語(yǔ)句(用于判斷屬性值的合法性);

二.繼承

繼承是類與類的一種關(guān)系,在Java中是單繼承的揍瑟,也就是說(shuō)一個(gè)子類只有一個(gè)父類白翻。

三.多態(tài)

多態(tài)指的是對(duì)象的多種形態(tài)。多態(tài)有兩種:引用多態(tài)和方法多態(tài)绢片。繼承是多態(tài)的實(shí)現(xiàn)基礎(chǔ)滤馍。

1.引用多態(tài)

父類的引用可以指向本類的對(duì)象;父類的引用可以指向子類的對(duì)象底循。

2. 方法多態(tài)

創(chuàng)建父類對(duì)象時(shí)巢株,調(diào)用的方法為父類方法;

創(chuàng)建子類對(duì)象時(shí)熙涤,調(diào)用的方法是子類重寫的方法或繼承自父類的方法阁苞;

注意:不允許通過(guò)父類的引用調(diào)用子類獨(dú)有的方法。?


EventBus的基本用法

我需要在一個(gè)Activity里注冊(cè)EventBus事件灭袁,然后定義接收方法猬错,這跟Android里的廣播機(jī)制很像,你需要首先注冊(cè)廣播茸歧,然后需要編寫內(nèi)部類,實(shí)現(xiàn)接收廣播显沈,然后操作UI软瞎。所以逢唤,在EventBus中,你同樣得這么做涤浇。


Android三大圖片加載框架

一.ImageLoader框架

是很早開(kāi)源的圖片緩存鳖藕,在早期被很多應(yīng)用使用

1.多線程下載圖片,圖片可以來(lái)源于網(wǎng)絡(luò)只锭,文件系統(tǒng)著恩,項(xiàng)目文件夾assets中以及drawable中等

2.支持隨意的配置ImageLoader,例如線程池蜻展,圖片下載器喉誊,內(nèi)存緩存策略,硬盤緩存策略纵顾,圖片顯示選項(xiàng)以及其他的一些配置

3.支持圖片的內(nèi)存緩存伍茄,文件系統(tǒng)緩存或者SD卡緩存

4.支持圖片下載過(guò)程的監(jiān)聽(tīng)

5.根據(jù)控件(ImageView)的大小對(duì)Bitmap進(jìn)行裁剪,減少Bitmap占用過(guò)多的內(nèi)存

6.較好的控制圖片的加載過(guò)程施逾,例如暫停圖片加載敷矫,重新開(kāi)始加載圖片,一般使用在ListView,GridView中汉额,滑動(dòng)過(guò)程中暫停加載圖片曹仗,停止滑動(dòng)的時(shí)候去加載圖片

7.提供在較慢的網(wǎng)絡(luò)下對(duì)圖片進(jìn)行加載

8. 默認(rèn)實(shí)現(xiàn)多種內(nèi)存緩存算法這幾個(gè)圖片緩存都可以配置緩存算法,不過(guò) ImageLoader 默認(rèn)實(shí)現(xiàn)了較多緩存算法蠕搜,如 Size 最大先刪除怎茫、使用最少先刪除、最近最少使用讥脐、先進(jìn)先刪除遭居、時(shí)間最長(zhǎng)先刪除等。

設(shè)計(jì)原理

二旬渠、Picasso介紹

?picasso是Square公司開(kāi)源的一個(gè)Android圖形緩存庫(kù),可以實(shí)現(xiàn)圖片下載和緩存功能

? ?Picasso不僅實(shí)現(xiàn)了圖片異步加載的功能俱萍,還解決了android中加載圖片時(shí)需要解決的一些常見(jiàn)問(wèn)題:

? ?1.在adapter中需要取消已經(jīng)不在視野范圍的ImageView圖片資源的加載,否則會(huì)導(dǎo)致圖片錯(cuò)位告丢,Picasso已經(jīng)解決了這個(gè)問(wèn)題枪蘑。

? ?2.使用復(fù)雜的圖片壓縮轉(zhuǎn)換來(lái)盡可能的減少內(nèi)存消耗

? ?3.自帶內(nèi)存和硬盤二級(jí)緩存功能


?三、Glide簡(jiǎn)介

?Glide是一個(gè)高效岖免、開(kāi)源岳颇、Android設(shè)備上的媒體管理框架,Glide具有獲取颅湘、解碼和展示視頻劇照话侧、圖片、動(dòng)畫等功能闯参,它還有靈活的API瞻鹏,這些API使開(kāi)發(fā)者能夠?qū)lide應(yīng)用在幾乎任何網(wǎng)絡(luò)協(xié)議棧里悲立。創(chuàng)建Glide的主要目的有兩個(gè),一個(gè)是實(shí)現(xiàn)平滑的圖片列表滾動(dòng)效果(滾動(dòng)流暢)新博,另一個(gè)是支持遠(yuǎn)程圖片的獲取薪夕、大小調(diào)整和展示



Toolbar面試詳解

今天面試問(wèn)我Toolbar是什么,當(dāng)時(shí)我一臉懵逼,畢竟之前都是自定義導(dǎo)航,后來(lái)網(wǎng)上了解了一下

Toolbar是什么

Toolbar是Google在Android 5.0中推出的一款替代ActionBar的View。ActionBar必須得作為Activity內(nèi)容的一部分赫悄,而Toolbar可以放在任何層次原献。Toolbar比ActionBar支持更多的功能,從開(kāi)始到終點(diǎn)埂淮,Toolbar包含下面可選的元素:?

- 一個(gè)導(dǎo)航按鈕姑隅。 可以是一個(gè)向前的按鈕腥光、導(dǎo)航菜單按鈕三椿,等等构诚。?

- 一個(gè)logo圖片?

- 標(biāo)題和副標(biāo)題?

- 一個(gè)或多個(gè)自定義一View?

- 一個(gè)menu



mvc mvp mvvm區(qū)別

MVC模式:

MVC

    1. MVC的所有通信都是單向的酬土。

    2.?view傳送指令到controller(用戶也可以直接將指令傳到controller)岗仑。

    3.?controller完成業(yè)務(wù)邏輯后要求model改變狀態(tài)阿趁。

    4.?model將新的數(shù)據(jù)發(fā)送到view厢汹,用戶得到反饋灰殴。

MVP模式:

MVP模式將Controller改名為Presenter霹俺,同時(shí)改變了通信方向柔吼。

MVP

    1. 各部分之間的通信都是雙向的。

    2. View與Model不發(fā)生聯(lián)系丙唧,都通過(guò)Presenter傳遞

    3. ?View非常薄愈魏,不部署任何業(yè)務(wù)邏輯,稱為“被動(dòng)視圖”想际,即沒(méi)有任何主動(dòng)性培漏,而Presenter非常厚,所有邏輯都部署在這里胡本。

MVVM模式:

MVVM

MVVM 模式將 Presenter 改名為 ViewModel牌柄,基本上與 MVP 模式完全一致。

唯一的區(qū)別是侧甫,它采用雙向綁定(data-binding):View的變動(dòng)珊佣,自動(dòng)反映在 ViewModel,反之亦然披粟。Angular?和?Ember?都采用這種模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咒锻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子守屉,更是在濱河造成了極大的恐慌惑艇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇泛,死亡現(xiàn)場(chǎng)離奇詭異敦捧,居然都是意外死亡须板,警方通過(guò)查閱死者的電腦和手機(jī)碰镜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門兢卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绪颖,你說(shuō)我怎么就攤上這事秽荤。” “怎么了柠横?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵窃款,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牍氛,道長(zhǎng)晨继,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任搬俊,我火速辦了婚禮紊扬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘餐屎。我一直安慰自己,他們只是感情好玩祟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布盘寡。 她就那樣靜靜地躺著抚吠,像睡著了一般孵户。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天违崇,我揣著相機(jī)與錄音,去河邊找鬼怔蚌。 笑死炼蛤,一個(gè)胖子當(dāng)著我的面吹牛妖爷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲸湃,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赠涮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了暗挑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斜友,失蹤者是張志新(化名)和其女友劉穎炸裆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鲜屏,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烹看,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洛史。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惯殊。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖也殖,靈堂內(nèi)的尸體忽然破棺而出土思,到底是詐尸還是另有隱情,我是刑警寧澤忆嗜,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布己儒,位于F島的核電站,受9級(jí)特大地震影響捆毫,放射性物質(zhì)發(fā)生泄漏闪湾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一绩卤、第九天 我趴在偏房一處隱蔽的房頂上張望途样。 院中可真熱鬧,春花似錦濒憋、人聲如沸何暇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赖晶。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遏插,已是汗流浹背捂贿。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胳嘲,地道東北人厂僧。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像了牛,于是被迫代替她去往敵國(guó)和親颜屠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,499評(píng)論 25 707
  • 【Android Activity】 什么是 Activity? 四大組件之一,通常一個(gè)用戶交互界面對(duì)應(yīng)一個(gè) ac...
    Rtia閱讀 3,796評(píng)論 3 18
  • 時(shí)間過(guò)得飛快鹰祸,今天是游學(xué)的六天中的第四天了甫窟。也就是說(shuō),游學(xué)已經(jīng)過(guò)去了一大半蛙婴。 今天上午我們要去劉氏莊園粗井。該館原名大...
    尹越閱讀 1,354評(píng)論 0 2
  • 第五章 提劍公子(一) 公孫無(wú)的認(rèn)輸,把這場(chǎng)比武帶上了最高潮街图,年輕一輩浇衬,公認(rèn)最強(qiáng)的幾個(gè)人之一的公孫無(wú)也敗在了陸缺手...
    方黑土閱讀 192評(píng)論 0 1