編輯:關於Android編程
1.Android屏幕適配
圖片適配:不同的文件夾下存放分辨率不同的圖片
布局適配:單獨為某一個分辨率創建一個布局文件夾,layout-800x480
尺寸適配:(常用)dp=px/設備密度
240x320(0.75)
320x480(1)
480x800(1.5)
1280x720(2.0)
代碼適配:在代碼中通過屏幕的寬和高設置控件所占的比例
權重適配:layout_weight
2.點擊事件的四種寫法
內部類
匿名內部類
布局文件中的onClick屬性
繼承OnClickListener接口,重寫onClick方法
3.android5.0新特性
用戶界面
材料設計語言
優化了通知欄系統,可以在鎖屏界面直接訪問通知消息
系統底層,使用art代替dalvik
針對電池進行了軟件優化
4.安卓數據緩存
好處:減少服務器的壓力
提高客戶端的響應速度
支持離線浏覽
常見的緩存管理方法是數據庫和文件
數據庫:下載完文件以後,把文件的相關信息存放到數據庫,建議把url作為唯一的標識信息,
下次下載的時候根據url先查數據庫
需要創建表,緩存的文件存放在手機內部存儲空間,容易浪費內存,需要及時清理
文件緩存:使用File.lastModified得到文件最後修改的時間,與當前的事件進行比較,來達到緩存的效果
5.activity提供的actionbar在3.0以上才可以使用,actionbarActivity是兼容2.x版本的,當當前的activity
繼承actionbarActivity時,使用theme.noTitle.FullScreen時會報錯
6.什麼是ANR,如何避免?
答:在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當用戶的操作在5s內
應用程序沒有做出響應,BroadReceiver在10s內沒有執行完畢,就會出現應用程序無響應對話框。
避免方法:Activity應該在它的關鍵生命周期方法盡可能的少去做創建操作。耗時操作,例如網絡或者數據庫
操作,應該在子線程裡進行,主線程應該給子線程提供一個Handler,以便完成是能交給主線程。
7.進程優先級:
前台進程:當前activity正在與用戶交互
可見進程:用戶仍然可以看到這個進程,某個activity的界面,但是不能操作。
服務進程:一個應用程序,一個後台服務在運行
後台進程:沒有任何服務的進程,打開一個activity,按home鍵最小化
空進程:沒有任何活動組件的進程
8.布局套的層級多了,會不會有性能上的問題?
會,在DDMS的層級視圖裡面能夠看到布局的層級關系,以及響應的measure,layout,draw的時間,可以通過
時間來判斷性能,如果使用線性布局,會發現時間是最長的,尤其使用layout-weight屬性,會發現measure的時間
變為兩倍,盡量減少內嵌的層級,考慮使用更平級的組建,盡量使用FrameLayout,然後是RelativeLayout,最後
是LinearLayout
9.在listview的優化中,為何使用convertview,為何使用viewholder,那個更能解決問題?
答:使用convertview可以實現對view的復用,減少了內存的消耗,這樣大大節省了每次創建對象的時間,提升了listview的顯示
效率,使用viewholder可以將view的子控件封裝在viewholder中,通過view.setTag(ViewHolder)可以將view
和viewHolder進行綁定,這樣就不用每次都調用view.findViewById方法查找控件。
使用convertview更能解決問題,使用viewholder解決了控件換時間的問題,因為給view對象設置一個tag本身就
是占用內存的,因此viewholder的使用還是要區分不同的應用場景的。如果內存足夠需要高效就使用viewholder,否則
不建議使用。
10.VIew.inflate和view.findViewById哪個更耗時?
答:當然是view.inflate,這個方法完成的功能是把xml布局文件通過pullParser的形式解析到內存中,需要io,
需要遞歸子節點
11..ArrayList是不是線程安全的,如果不是,如何變成線程安全的?
答:不安全,可以使用Collections.synchronizedList(list)將ArrayList變為安全的
Collections是針對集合的一個工具類,提供了一系列的靜態方法對集合進行搜索。排序,線程安全化等操作
12.多態時成員的訪問特點?
成員變量:編譯運行都看左邊
成員函數:編譯看左邊,運行看右邊
靜態函數:編譯運行都看左邊,靜態方法不能算方法的重寫
13.堆和棧有什麼區別?
棧中存放對象的引用,堆中存放對象的實體,堆中的對象由jvm的垃圾回收器負責回收。
14.jvm加載class文件的原理機制?
jvm加載class文件是動態性的,也就是當需要的時候才加載,這也是為節約jvm的內存來考慮的。同時jvm的加載是
父委托機制,這個機制簡單來說,就是類裝載器有載入類的需求的時候,會先請示parent使用其搜索路徑
幫忙載入,如果parent找不到,那麼才自己依照自己的搜索路徑搜索類。
15.Linux常用的命令?
cd 進入某個路徑
ls 顯示文件和目錄結構
mkdir 創建目錄
touch 生成一個空文件 touch hello.txt
echo 生成一個帶內容的文件 echo “hello” > hello.txt
cp 復制文件或目錄
cat 顯示文件內容
rm 刪除文件
16.使用Bundle類傳遞數據包時,可以放入一個可序列化的字段,這樣,當要傳遞的數據字段比較多時,采用該方法
比較方便
使當前的類繼承java.io.serializable
Bundle bundle = new Bundle();
bundle,putSerializable(name,value);
17.Handler機制的原理?
答;Android中的handler用於實現子線程和主線程之間的通信,例如子線程是不允許修改UI的,這時候可以
在子線程使用handler向主線程發送消息,讓主線程修改UI。handler機制的實現,還依賴於Looper,Message這
兩個類,當我們通過handler發送消息的時候,該消息就會被添加到消息隊列中,Looper會不斷的從消息隊列中
取出消息。android默認為主線程創建了一個Looper對象和MessageQueue.去消息的過程是線程阻塞的,這樣不至於
在沒有消息的時候耗費過多的CPU資源。
線程阻塞:指一個線程在執行過程中暫停,等待某個條件觸發它。
18.Thraed和AsyncTask的區別?
答:AsyncTask是封裝好的線程池,是Handler和Thread的封裝。AyncTask在操作UI線程上更為方便,因為
onPreExcute(),onProgressUpdate(),onPostExcute()方法均運行在主線程,這樣就不用Handler發消息了。
但是AsyncTask存在缺陷,我看過它的源碼,AsyncTask全局只有5個工作線程,也就是如果一個應用使用
AsyncTask來執行線程,那麼同一時間只能有5個線程在工作,其他線程將被阻塞,(當我們使用Thread類創建線程的時候不存在
這個限制),所以AsyncTask不要用於多線程獲取網絡數據,這樣容易產生阻塞,從而降低效率。總的來說,如果
需要簡單的操作UI,AsyncTask更好一些,數據量多並且
復雜的情況下建議使用handler+thread
注意事項:Task的實例必須在主線程中創建
excute方法必須在主線程中調用
不要手動的調用onPreExcute等方法
task只能被執行一次,多次執行會發生異常
19.說說MVC模式在android中的應用?
答:MVC是Model,View,Controller三部分組成,其中view主要由xml布局文件,或者用代碼編寫動態布局
來體現,Model是數據模型,其實類似javabean,不過這些javabean封裝了對數據庫,網絡的操作,Controller
一般由Activity負責,它根據用戶的輸入,控制用戶界面數據的顯示及更新model對象的狀態,它通過控制
view和model和用戶進行交互。
20.什麼情況下會出現內存洩漏?如何避免這種情況?
答:內存洩漏:如果在一個應用程序中,不再使用某個對象,但是還說有引用指向這個對象,那麼垃圾回收器
就無法回收這個對象,這個對象所占的內存控件就無法被使用,這就造成了內存洩漏,android為不同類型的
進程分配了不同的內存上限,如果程序在運行過程中出現了內存洩漏而造成應用程序的內存超出上限,就會被
系統殺死。
可能出現內存洩漏的情況:1)引用沒有釋放:注冊的監聽器,廣播沒有取消,集合中的對象沒有清理2)資源沒有釋放:網絡,數據庫的游標,
io流沒有關閉
如何避免:使用資源記得關閉,保證資源能夠釋放,對於圖片的操作要記得使用緩存,同時要及時回收圖片,
使用listview的時候,盡量復用convertview
21.android中數據的存儲方式?
答:數據庫,網絡,文件,SharedPreference存儲,ContentProvider存儲
22.AIDL的全稱是什麼,如何工作,能處理那些類型的數據?
答:Android Interface Definition Language,安卓接口定義語言
AIDL一般用於遠程服務,也就是進程間通信,我們可以分為服務器端和客戶端,服務器端聲明aidl文件,
文件命名為xxx.aidl,adt會自動生成aidl的代碼文件,代碼文件提供了aidl接口的實現類Stub,客戶端如果
要使用服務端提供的服務,需要將xxx.aidl文件拷貝到自己的目錄下,然後生成java類,然後在ServiceConnection
對象的onServiceConnected方法裡面通過Stub.asInterface方法得到aidl的實現類,然後我們就可以調用
這個類的方法了
基本類型數據都可以,復雜數據也可以,不過要實現parcelable接口
23.java如何調用C,C++語言?
答:Java通過JNI調用,使用的時候先通過System.loadLibrary(“xxx”)將xxx.so文件加載到jvm中,同時
在類中必須對so文件中的方法進行聲明:public native void test();
24.activity和fragment之間是如何進行數據傳遞的?
答:activity向fragment傳遞數據:在fragment中通過getActivity拿到當前fragment所關聯的activity,
通過activity對象拿到fragmentManager對象,通過fragmentManager的findFragmentById或者findFramgnetByTag拿到
指定的fragment對象,調用fragment對象的方法
fragment向activity傳遞:通過getActivity拿到當前fragment關聯的activity,必要時進行強轉,調用activity中的方法。
25.ListView中下拉刷新,在下拉刷新的過程中,突然立刻點擊條目,怎麼屏蔽ListView條目的點擊事件?
答:重新BaseAdapter的兩個方法:
areAllItemsEnabled(){//所有條目是否可以點擊
return false;
}
public bolean isEnabled(int position){//某個位置的條目是否可以點擊
return false;
}
26.convertview的個數為在listview滑動過程中當前屏幕上能看到的最多條目的個數。
27.當前的item點擊之後裡面的textview變為紅色,item被重新拉回來顯示的時候,會默認回復原來的樣子?
為什麼?如何解決?
答:因為每次getView獲取當前item的時候,都會重新new一個viewholder與當前item的布局文件綁定,也就是說,
每次會產生一個新布局給convertview顯示。
解決辦法:對converview進行復用,當convertivew為空的時候,將生成的布局利用setTag保存在convertview
裡面,當converview利用回收機制回收回來的時候,通過getTag將保存的布局取出來,重新將布局文件裡的控件
賦值即可。
28.當item繼續往上滑的時候,可能出現下面的item樣式也改變了,為什麼,如何解決?
答:因為下面的item利用的是上面item的convertview
使用ArrayList保存控件改變的item的位置,然後在繪制當前item的時候,根據這個position是否在集合中
來判斷是否要改變控件的樣式。
29.android中的設計模式?
答:裝飾者設計模式:對已有的對象的功能進行增強,可以自定類,將已有的對象傳入,基於已有的功能,並提供加強功能,
那麼自定義的類就成為裝飾類,裝飾類通常會提供構造方法,接受被裝飾的對象,基於被裝飾的對象的功能,提供更強的方法
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
在讀取單個字節的基礎上進行裝飾,可以讀一行
單例設計模式:,節省內存空間,節省時間,數據庫的訪問
工廠設計模式:定義一個用於創建對象的接口,讓子類決定實例化哪一了類,工廠方法使一個類的實例化延遲到子類
20.asynctask:異步任務,就是在主線程運行的時候,我們可以完成一些異步操作,可以將耗時的操作放在asynctask中,通過asynctask
可以解決多線程之間的通信問題。
21.去掉數組中重復元素?
定義一個list集合,遍歷當前數組,如果集合中不包含數組中的元素,添加到集合中
2.找出兩個數組中相同的元素?
答:
8.fragment的生命周期?
答:oncreate: fragment被創建
oncreateview:初始化fragment的布局
onactivitycreated: fragment所依賴的activity創建完成
9.shareSDK:當我們需要進行分享的時候,,把所有的平台集中在一起,省去了跟好多平台打交道的麻煩
先要去下載sdk,下載的時候可以選擇我們需要的平台
登錄網站,添加app,獲得appkey
解壓下載的sdk.雙擊quickintegrate.jar生成文件,覆蓋當前的項目,會在當前項目下生成對應的文件
添加權限,還有activity,
在assect目錄下的shareSDK文件下將appkey替換成我們申請的appkey
把分享的代碼添加到我們需要調用的地方
Android 繪制太極圖繪制一個太極圖實現代碼:package com.jackie.taijicircle; import android.content.Cont
單元測試TestCaseAndroid的sdk提供了對項目進行單元測試的功能,開發包的android.test下面便是專門用來單元測試的類。單元測試的作用是通過模擬文本輸
在寫博客園客戶端的時候,突然想到,弄個知乎日報風格的簡單清爽多好!不需要那麼多繁雜的信息干擾視野。先貼上效果圖,左邊是知乎日報的,右邊是本方案的 本文所使用的ide是an
今天接到一個任務,需要解決同事在美國測試Voicemail功能時,出現的下載失敗問題。目前,國內的運營商似乎沒有支持Voicemail功能,因此資料相對較少。自己以前對這