Android經(jīng)典面試題 持續(xù)更新


[TOC]

以后更新的面試題會放在頂部

靜態(tài)內(nèi)部類、內(nèi)部類、匿名內(nèi)部類,為什么內(nèi)部類會持有外部類的引用?持有的引用是this?還是其它?

靜態(tài)內(nèi)部類:使用static修飾的內(nèi)部類
匿名內(nèi)部類:使用new生成的內(nèi)部類
因為內(nèi)部類的產(chǎn)生依賴于外部類,持有的引用是類名.this。

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

對于一個根ViewGroup來說,發(fā)生點擊事件首先調(diào)用dispatchTouchEvent
如果這個ViewGroup的onIterceptTouchEvent返回true就表示它要攔截當(dāng)前事件,接著這個ViewGroup的onTouchEvent就會被調(diào)用.如果onIterceptTouchEvent返回false,那么就會繼續(xù)向下調(diào)用子View的dispatchTouchEvent方法
當(dāng)一個View需要處理事件的時候,如果它沒有設(shè)置onTouchListener,那么直接調(diào)用onTouchEvent.如果設(shè)置了Listenter 那么就要看Listener的onTouch方法返回值.為true就不調(diào),為false就調(diào)onTouchEvent
View的默認(rèn)實現(xiàn)會在onTouchEvent里面把touch事件解析成Click之類的事件
點擊事件傳遞順序 Activity -> Window -> View
一旦一個元素攔截了某事件,那么一個事件序列里面后續(xù)的Move,Down事件都會交給它處理.并且它的onInterceptTouchEvent不會再調(diào)用
View的onTouchEvent默認(rèn)都會消耗事件,除非它的clickable和longClickable都是false(不可點擊),但是enable屬性不會影響

View本身是沒有onInterceptTouchEvent()方法的, 這個方法在ViewGroup中

計算機(jī)網(wǎng)絡(luò)的ISO模型分層

ISO分層

什么是Socket ?

我們知道兩個進(jìn)程如果需要進(jìn)行通訊最基本的一個前提能能夠唯一的標(biāo)示一個進(jìn)程,在本地進(jìn)程通訊中我們可以使用PID來唯一標(biāo)示一個進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個進(jìn)程PID沖突幾率很大,這時候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號可以唯一標(biāo)示主機(jī)的一個進(jìn)程,這樣我們可以利用ip地址+協(xié)議+端口號唯一標(biāo)示網(wǎng)絡(luò)中的一個進(jìn)程。

能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用socket進(jìn)行通信了,什么是socket呢?我們經(jīng)常把socket翻譯為套接字,socket是在應(yīng)用層和傳輸層之間的一個抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用已實現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。

socket起源于UNIX,在Unix一切皆文件哲學(xué)的思想下,socket是一種"打開—讀/寫—關(guān)閉"模式的實現(xiàn),服務(wù)器和客戶端各自維護(hù)一個"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對方讀取或者讀取對方內(nèi)容,通訊結(jié)束時關(guān)閉文件。

TCP協(xié)議的三次握手

三次握手1

第一次握手:客戶端嘗試連接服務(wù)器,向服務(wù)器發(fā)送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進(jìn)入SYN_SEND狀態(tài)等待服務(wù)器確認(rèn)

第二次握手:服務(wù)器接收客戶端syn包并確認(rèn)(ack=j+1),同時向客戶端發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進(jìn)入SYN_RECV狀態(tài)

第三次握手:第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手

定睛一看,服務(wù)器socket與客戶端socket建立連接的部分其實就是大名鼎鼎的三次握手

三次握手2

Android的四大組件是哪些 ?

Activity:Activity是Android程序與用戶交互的窗口,是Android構(gòu)造塊中最基本的一種,它需要為保持各界面的狀態(tài),做很多持久化的事情,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯。

service:后臺服務(wù)于Activity,封裝有一個完整的功能邏輯實現(xiàn). Service可以在很多場合的應(yīng)用中使用,比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在后臺繼續(xù)播放,比如檢測SD卡上文件的變化,再或者在后臺記錄你地理信息位置的改變等等,總之服務(wù)總是藏在后臺的。

Content Provider:是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問方案,可以派生Content Provider類,對外提供數(shù)據(jù),可以像數(shù)據(jù)庫一樣進(jìn)行選擇排序,屏蔽內(nèi)部數(shù)據(jù)的存儲細(xì)節(jié),向外提供統(tǒng)一的接口模型,大大簡化上層應(yīng)用,對數(shù)據(jù)的整合提供了更方便的途徑

BroadCast Receiver:接受一種或者多種Intent作觸發(fā)事件,接受相關(guān)消息,做一些簡單處理,轉(zhuǎn)換成一條Notification,統(tǒng)一了Android的事件廣播模型

請介紹下Android中常用的四種布局

  1. FrameLayout 所有東西依次都放在左上角,會重疊,這個布局比較簡單,也只能放一點比較簡單的東西。
  2. LinerLayout 線性布局,每一個LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。當(dāng)垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。
  3. RelativeLayout 相對布局可以理解為某一個元素為參照物,來定位的布局方式。
  4. TableLayout 表格布局.

android中的動畫有哪幾類,它們的特點和區(qū)別是什么

三種, Tween(補(bǔ)間動畫), Frame(幀動畫)和屬性動畫.

Tween動畫,這種實現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;

Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實現(xiàn),類似電影。

屬性動畫, 通過改變某個控件的屬性值來實現(xiàn)動畫效果

android中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區(qū)別

XML解析主要有三種方式,SAX、DOM、PULL。

常規(guī)在PC上開發(fā)我們使用Dom相對輕松些,但一些性能敏感的數(shù)據(jù)庫或手機(jī)上還是主要采用SAX方式,SAX讀取是單向的,優(yōu)點:不占內(nèi)存空間、解析屬性方便,但缺點就是對于套嵌多個分支來說處理不是很方便。
而DOM方式會把整個XML文件加載到內(nèi)存中去,但是提醒大家該方法在查找方面可以和XPath很好的結(jié)合如果數(shù)據(jù)量不是很大推薦使用。
而PULL常常用在J2ME對于節(jié)點處理比較好,類似SAX方式,同樣很節(jié)省內(nèi)存,在J2ME中我們經(jīng)常使用的KXML庫來解析。

ListView的優(yōu)化方案

  1. 復(fù)用convertView

  2. 給contentView設(shè)置tag(setTag()),傳入一個viewHolder對象,用于緩存要顯示的數(shù)據(jù),可以達(dá)到圖像數(shù)據(jù)異步加載的效果。

  3. 設(shè)置ListView的高度為 確定值或match_parent

  4. 如果listview需要顯示的item很多,就要考慮分頁加載。

請介紹下Android的數(shù)據(jù)存儲方式。

使用SharedPreferences存儲數(shù)據(jù);文件存儲數(shù)據(jù);SQLite數(shù)據(jù)庫存儲數(shù)據(jù);使用ContentProvider存儲數(shù)據(jù);網(wǎng)絡(luò)存儲數(shù)據(jù);

activity的啟動模式有哪些?是什么含義?

在android里,有4種activity的啟動模式,分別為:

“standard” (默認(rèn)): Activity無限壓棧, 不做任何處理

“singleTop” : 如果啟動activity時發(fā)現(xiàn)它當(dāng)前已經(jīng)在棧頂則不會重新創(chuàng)建一個實例, 如果你啟動的那個activity不再棧頂?shù)脑捑蜁匦聞?chuàng)建一個activity實例。

“singleTask” : 當(dāng)你的activity設(shè)置為SingleTask時,每次啟動你的activity的時候 就會去棧里面是否存在這個activity的實例,如果存在則直接使用這個實例,并把這個activity之上的所有其他的activity統(tǒng)統(tǒng)出棧,如果棧里面沒有這個activity的實例的話就創(chuàng)建一個該activity的實例。

“singleInstance” : 是其所在棧的唯一activity,它會每次都被重用。

activity在屏幕旋轉(zhuǎn)時的生命周期

不設(shè)置Activity的android:configChanges時,切屏?xí)匦抡{(diào)用各個生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次;設(shè)置Activity的android:configChanges="orientation"時,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏?xí)r只會執(zhí)行一次;設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法

如何啟用Service,如何停用Service

服務(wù)的開發(fā)比較簡單,如下:

第一步:繼承Service類

public classSMSService extends Service {}

第二步:在AndroidManifest.xml文件中的<application>節(jié)點里對服務(wù)進(jìn)行配置:

<serviceandroid:name=".SMSService" />

服務(wù)不能自己運行,需要通過調(diào)用Context.startService()或Context.bindService()方法啟動服務(wù)。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務(wù),調(diào)用者與服務(wù)之間沒有關(guān)連,即使調(diào)用者退出了,服務(wù)仍然運行。使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止,大有“不求同時生,必須同時死”的特點。

如果打算采用Context.startService()方法啟動服務(wù),在服務(wù)未被創(chuàng)建時,系統(tǒng)會先調(diào)用服務(wù)的onCreate()方法,接著調(diào)用onStart()方法。如果調(diào)用startService()方法前服務(wù)已經(jīng)被創(chuàng)建,多次調(diào)用startService()方法并不會導(dǎo)致多次創(chuàng)建服務(wù),但會導(dǎo)致多次調(diào)用onStart()方法。采用startService()方法啟動的服務(wù),只能調(diào)用Context.stopService()方法結(jié)束服務(wù),服務(wù)結(jié)束時會調(diào)用onDestroy()方法。

如果打算采用Context.bindService()方法啟動服務(wù),在服務(wù)未被創(chuàng)建時,系統(tǒng)會先調(diào)用服務(wù)的onCreate()方法,接著調(diào)用onBind()方法。這個時候調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出了,系統(tǒng)就會先調(diào)用服務(wù)的onUnbind()方法,接著調(diào)用onDestroy()方法。如果調(diào)用bindService()方法前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService()方法并不會導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說onCreate()和onBind()方法并不會被多次調(diào)用)。如果調(diào)用者希望與正在綁定的服務(wù)解除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。

服務(wù)常用生命周期回調(diào)方法如下:

onCreate() 該方法在服務(wù)被創(chuàng)建時調(diào)用,該方法只會被調(diào)用一次,無論調(diào)用多少次startService()或bindService()方法,服務(wù)也只被創(chuàng)建一次。

onDestroy()該方法在服務(wù)被終止時調(diào)用。

與采用Context.startService()方法啟動服務(wù)有關(guān)的生命周期方法

onStart() 只有采用Context.startService()方法啟動服務(wù)時才會回調(diào)該方法。該方法在服務(wù)開始運行時被調(diào)用。多次調(diào)用startService()方法盡管不會多次創(chuàng)建服務(wù),但onStart() 方法會被多次調(diào)用。

與采用Context.bindService()方法啟動服務(wù)有關(guān)的生命周期方法

onBind()只有采用Context.bindService()方法啟動服務(wù)時才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時被調(diào)用,當(dāng)調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用Context.bindService()方法并不會導(dǎo)致該方法被多次調(diào)用。

onUnbind()只有采用Context.bindService()方法啟動服務(wù)時才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)解除綁定時被調(diào)用

注冊廣播有幾種方式,這些方式有何優(yōu)缺點?請談?wù)凙ndroid引入廣播機(jī)制的用意。

答:首先寫一個類要繼承BroadcastReceiver

第一種:在清單文件中聲明,添加

 <!--表示該receiver有效, 并且可以在外部訪問-->
    <receiver
        android:name=".MyReceiver1"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.lulu.action.MY_BROADCAST"/>

        </intent-filter>
    </receiver>

第二種使用代碼進(jìn)行注冊如:


//完成廣播注冊
@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("com.lulu.action.MY_BROADCAST");
    registerReceiver(receiver2, filter);
}

//完成解除注冊
@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(receiver2);
}

兩種注冊類型的區(qū)別是:

1)第一種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會被系統(tǒng)調(diào)用自動運行。

2)第二種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。

Looper MessageQueue Message Handler的關(guān)系

Looper內(nèi)部有l(wèi)oop方法, 里面取的是Looper內(nèi)部的MessageQueue
MessageQueue內(nèi)部有Message
Handler內(nèi)部獲取當(dāng)前線程的Looper對象, 找到MessageQueue, Handler向其發(fā)送消息

loop一直在輪詢遍歷MessageQueue, 找到發(fā)來的handler對象并執(zhí)行dispatchMessage, 處理消息

mvc模式的原理

mvc是model,view,controller的縮寫,mvc包含三個部分:

模型(model)對象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層。

視圖(view)對象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。

控制器(control)對象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件,交給m層處理。

android鼓勵弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:

1)視圖層(view):一般采用xml文件進(jìn)行界面的描述,使用的時候可以非常方便的引入,當(dāng)然,如果你對android了解的比較的多了話,就一定可以想到在android中也可以使用JavaScript+html等的方式作為view層,當(dāng)然這里需要進(jìn)行java和javascript之間的通信,幸運的是,android提供了它們之間非常方便的通信實現(xiàn)。

2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業(yè)務(wù)邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應(yīng)時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。

3)模型層(model):對數(shù)據(jù)庫的操作、對網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對業(yè)務(wù)計算等操作也是必須放在的該層的。

什么是ANR 如何避免它?

ANR:Application Not Responding。在 Android 上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作應(yīng)
用程序無響應(yīng)(ANR:Application Not Responding)對話框.

避免方法:Activity應(yīng)該在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡可能少的去做創(chuàng)建操作和潛在的耗時操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作,或者高耗時的計算如改變位圖尺寸,應(yīng)該在子線程里(或者異步方式)來完成。主線程應(yīng)該為子線程提供一個Handler,以便完成時能夠提交給主線程。

什么情況會導(dǎo)致Force Close ?如何避免?能否捕獲導(dǎo)致其的異常?

拋出運行時異常時就會導(dǎo)致Force Close,比如空指針、數(shù)組越界、類型轉(zhuǎn)換異常等等。

捕獲:可以通過logcat查看拋出異常的代碼出現(xiàn)的位置,然后到程序?qū)?yīng)代碼中進(jìn)行修改。

避免:編寫程序時,要思維縝密,在可能出現(xiàn)異常的地方都作相應(yīng)的處理,增強(qiáng)程序的健壯性。

描述一下android的系統(tǒng)架構(gòu)

Android 架構(gòu):Linux Kernel(Linux內(nèi)核)、Hardware Abstraction Layer(硬件抽象層)、Libraries(系統(tǒng)運行庫或者是c/c++ 核心庫)、Application Framework(開發(fā)框架包 )、Applications(核心應(yīng)用程序)

原來所說是四層: app、Framework、lib、kernel

來自牛客網(wǎng)

請介紹下ContentProvider是如何實現(xiàn)數(shù)據(jù)共享的。

一個程序可以通過實現(xiàn)一個Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且Contentproviders是以類似數(shù)據(jù)庫中表達(dá)方式將數(shù)據(jù)暴露。Content providers存儲和檢索數(shù)據(jù),通過它可以讓所有的應(yīng)用程序訪問到,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法。

要想使應(yīng)用程序的數(shù)據(jù)公開化,可通過2種方法:創(chuàng)建一個屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個已經(jīng)存在的Content provider中,前提是有相同數(shù)據(jù)類型并且有寫入Contentprovider的權(quán)限。

如何通過一套標(biāo)準(zhǔn)及統(tǒng)一的接口獲取其他應(yīng)用程序暴露的數(shù)據(jù)?

Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數(shù)據(jù)。

Service和Thread的區(qū)別

答:servie是系統(tǒng)的組件,它由系統(tǒng)進(jìn)程托管(servicemanager);它們之間的通信類似于client和server,是一種輕量級的進(jìn)程間通訊(IPC (Inter-process communication))通信,這種通信的載體是binder,它是在linux層交換信息的一種ipc。而thread是由本應(yīng)用程序托管。

1). Thread:Thread是程序執(zhí)行的最小單元,它是分配CPU的基本單位??梢杂肨hread 來執(zhí)行一些異步的操作。

2). Service:Service是android的一種機(jī)制,當(dāng)它運行的時候如果是LocalService,那么對應(yīng)的Service 是運行在主進(jìn)程的main 線程上的。如:onCreate,onStart這些函數(shù)在被系統(tǒng)調(diào)用的時候都是在主進(jìn)程的 main 線程上運行的。如果是Remote Service,那么對應(yīng)的Service 則是運行在獨立進(jìn)程的main 線程上。

既然這樣,那么我們?yōu)槭裁匆肧ervice 呢?其實這跟android 的系統(tǒng)機(jī)制有關(guān),我們先拿Thread 來說。Thread的運行是獨立于 Activity 的,也就是說當(dāng)一個Activity 被 finish 之后,如果你沒有主動停止Thread 或者Thread 里的 run方法沒有執(zhí)行完畢的話,Thread 也會一直執(zhí)行。因此這里會出現(xiàn)一個問題:當(dāng)Activity 被 finish 之后,你不再持有該Thread 的引用。另一方面,你沒有辦法在不同的Activity 中對同一Thread 進(jìn)行控制。

舉個例子:如果你的Thread 需要不停地隔一段時間就要連接服務(wù)器做某種同步的話,該Thread 需要在Activity 沒有start的時候也在運行。這個時候當(dāng)你start 一個Activity 就沒有辦法在該Activity 里面控制之前創(chuàng)建的Thread。因此你便需要創(chuàng)建并啟動一個Service ,在Service 里面創(chuàng)建、運行并控制該Thread,這樣便解決了該問題(因為任何Activity 都可以控制同一Service,而系統(tǒng)也只會創(chuàng)建一個對應(yīng)Service 的實例)。

因此你可以把Service 想象成一種消息服務(wù),而你可以在任何有Context 的地方調(diào)用Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也可以在Service 里注冊BroadcastReceiver,在其他地方通過發(fā)送broadcast 來控制它,當(dāng)然這些都是Thread 做不到的。

Android本身的api并未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導(dǎo)致什么問題?如何解決?

答:會,比如nullpointerException。我遇到過,比如textview.setText()時,textview沒有初始化。會導(dǎo)致程序無法正常運行出現(xiàn)forceclose。打開控制臺查看logcat信息找出異常信息并修改程序。

IntentService有何優(yōu)點?

Acitivity的進(jìn)程當(dāng)處理Intent的時候,會產(chǎn)生一個對應(yīng)的Service; Android的進(jìn)程處理器現(xiàn)在會盡可能的不kill掉你;非常容易使用

如果后臺的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?

答:重寫onSaveInstanceState()方法,在此方法中保存需要保存的數(shù)據(jù),該方法將會在activity被回收之前調(diào)用。通過重寫onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)

如何將一個Activity設(shè)置成窗口的樣式。

<activity>中配置:android :theme="@android:style/Theme.Dialog" 

AIDL的全稱是什么?如何工作?能處理哪些類型的數(shù)據(jù)?

全稱是:Android Interface Define Language

AIDL(AndRoid接口描述語言)是一種接口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預(yù)先定義的接口達(dá)到兩個進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個參數(shù)),然后使用AIDL來傳遞這些參數(shù), 在消息的接收端, 使用這些參數(shù)組裝成自己需要的對象.

AIDL的IPC的機(jī)制是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現(xiàn)層間傳遞值. 如果要使用AIDL, 需要完成2件事情:

1. 引入AIDL的相關(guān)類.; 
2.調(diào)用aidl產(chǎn)生的class.

AIDL的創(chuàng)建方法:

AIDL語法很簡單,可以用來聲明一個帶一個或多個方法的接口,也可以傳遞參數(shù)和返回值。 由于遠(yuǎn)程調(diào)用的需要, 這些參數(shù)和返回值并不是任何類型.下面是些AIDL支持的數(shù)據(jù)類型:

  1. 不需要import聲明的簡單Java編程語言類型(int,boolean等)

  2. String, CharSequence不需要特殊聲明

  3. List, Map和Parcelables類型, 這些類型內(nèi)所包含的數(shù)據(jù)成員也只能是簡單數(shù)據(jù)類型, String等其他比支持的類型.

解釋下Android程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。

運行時權(quán)限D(zhuǎn)alvik(android授權(quán))

文件系統(tǒng) linux 內(nèi)核授權(quán)

系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。

通過直接發(fā)送Uri把參數(shù)帶過去,或者通過manifest里的intentfilter里的data屬性

android系統(tǒng)的優(yōu)勢和不足

5大優(yōu)勢

  1. 開放性
  2. 掙脫運營商的束縛
  3. 豐富的硬件選擇
  4. 不受限制的開發(fā)商
  5. 無縫結(jié)合的Google應(yīng)用

5大不足

  1. 安全和隱私
  2. 首先開賣Android的不是最大的運營商
  3. 運營商仍然能夠影響到Android手機(jī)
  4. 同類機(jī)型用戶減少
  5. 過分依賴開發(fā)商 缺少標(biāo)準(zhǔn)配置

Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念

DVM指Dalvik的虛擬機(jī)。每一個Android應(yīng)用程序都在它自己的進(jìn)程中運行,都擁有一個獨立的Dalvik虛擬機(jī)實例。而每一個DVM都是在Linux 中的一個進(jìn)程,所以說可以認(rèn)為是同一個概念。

一條最長的短信息約占多少byte?

文70(包括標(biāo)點),英文160,160個字節(jié)。

有一個一維整型數(shù)組int[]data保存的是一張寬為width,高為height的圖片像素值信息。請寫一個算法,將該圖片所有的白色不透明(0xffffffff)像素點的透明度調(diào)整為50%


final int size = data.length;

for(int i = 0; i< size; i++){

     if(data[i] == 0xffffffff)

            data[i] = 0x80ffffff;

}

如何將SQLite數(shù)據(jù)庫(dictionary.db文件)與apk文件一起發(fā)布

解答:可以將dictionary.db文件復(fù)制到 Android工程中的res/raw目錄中。所有在res/raw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。

復(fù)制的基本方法是使用getResources().openRawResource方法獲得res/raw目錄中資源的 InputStream對象,然后將該InputStream對象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫文件。

談?wù)凙ndroid的IPC(進(jìn)程間通信)機(jī)制

IPC是內(nèi)部進(jìn)程通信的簡稱. Android中的IPC機(jī)制是為了讓Activity和Service之間可以隨時的進(jìn)行交互,故在Android中該機(jī)制,只適用于Activity和Service之間的通信,類似于遠(yuǎn)程方法調(diào)用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實現(xiàn)IPC接口,Client端調(diào)用IPC接口本地代理。

DDMS和TraceView的區(qū)別?

DDMS是一個程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器.

Picasso和Glide的區(qū)別

  1. Picasso加載了全尺寸的圖片到內(nèi)存,然后讓GPU來實時重繪大小。而Glide加載的大小和ImageView的大小是一致的,因此更小。當(dāng)然,Picasso也可以指定加載的圖片大小的:
  2. Picasso和Glide在磁盤緩存策略上有很大的不同。Picasso緩存的是全尺寸的,而Glide緩存的是跟ImageView尺寸相同的。

IMEI的獲取

權(quán)限:

 <uses-permission android:name="android.permission.READ_PHONE_STATE" />

核心代碼:

Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getDeviceId();

Android的性能優(yōu)化

  1. 內(nèi)存
    1). 減少占用
    2). 復(fù)用: 視圖的復(fù)用, 對象的復(fù)用

  2. 速度
    1). 網(wǎng)絡(luò)
    2). 多線程

  3. 響應(yīng)時間
    1). 緩存: 增加內(nèi)存, 提升訪問速度;
    2). 顯示加載進(jìn)度
    3). 啟動頁預(yù)加載一部分內(nèi)容

Android項目工程的assets目錄和raw目錄的作用

共同點:
它們會被原封不動的拷貝到APK中,而不會像其它資源文件那樣被編譯成二進(jìn)制的形式。

由 于raw是Resources (res)的子目錄,Android會自動的為這目錄中的所有資源文件生成一個ID,這個ID會被存儲在R類當(dāng)中,作為一個文件的引用。這意味著這個資源 文件可以很容易的被Android的類和方法訪問到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是訪問一個文件最快捷的方式。MP3和Ogg文件放在這個目錄下是比較合適 的。
assets目錄更像一個附錄類型的目錄,Android不會為這個目錄中的文件生成ID并保存在R類當(dāng)中,因此它與 Android中的一些類和方法兼容度更低。同時,由于你需要一個字符串路徑來獲取這個目錄下的文件描述符,訪問的速度會更慢。但是把一些文件放在這個目 錄下會使一些操作更加方便,比方說拷貝一個數(shù)據(jù)庫文件到系統(tǒng)內(nèi)存中。要注意的是,你無法在Android XML文件中引用到assets目錄下的文件,只能通過AssetManager來訪問這些文件。數(shù)據(jù)庫文件和游戲數(shù)據(jù)等放在這個目錄下是比較合適的。

接口和抽象類的區(qū)別

一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),但是可以實現(xiàn)多個接口(吃飯接口、走路接口)。
第一點. 接口是抽象類的變體,接口中所有的方法都是抽象的。而抽象類是聲明方法的存在而不去實現(xiàn)它的類。
第二點. 接口可以多實現(xiàn),抽象類不行
第三點. 接口定義方法,不能實現(xiàn),而抽象類可以實現(xiàn)部分方法。
第四點. 接口中基本數(shù)據(jù)類型為static 而抽類象不是的。

一個線程安全的Singleton, 雙重加鎖

public class Singleton{  
   private static Singleton instance = null;//是否是final的不重要,因為最多只可能實例化一次。  
   private Singleton(){}  
   public static Singleton getInstance(){  
       if(instance == null){  
           //雙重檢查加鎖,只有在第一次實例化時,才啟用同步機(jī)制,提高了性能。  
           synchronized(Singleton.Class){  
               if(instance == null){  
                   instance = new Singleton();  
               }  
           }  
       }  
       return instance;  
   }  
}  

怎樣寫一個可以更新UI的Handler


private class MyThread extends Thread{
    public void run() {
       // 可以更新UI的handler
       Handler handler = new Hanlder(Looper.getMainLooper());

    } 
}


RecyclerView和ListView的區(qū)別

內(nèi)容稍多, 請大家移步到: http://www.tuicool.com/articles/aeeaQ3J

參考文章:

http://www.cnblogs.com/colife/p/5480068.html
http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html
http://www.cnblogs.com/dolphinX/p/3460545.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容