Android+Java知識點

轉載:http://blog.csdn.net/woshizisezise/article/details/52403692php

知識點1
從activityA打開跳轉到activityB,生命週期先執行的是activityA的onPause()方法,而後才走的activityB的onCreate()、onStart()、onResume()方法,最後才走的activityA的onStop()、onDestroy()方法;java

知識點2. 
若是爲一個activity設置了launchMode爲SingleTask模式的話,重複啓動它並不會每次執行onCreate()方法(第一次除外),可是會每次執行onPause()、onNewIntent()、onResume()方法;mysql

知識點3 
線程和進程的區別是什麼? 
線程:CPU調度的最小單元,是一種有限的系統資源; 
進程:通常指一個執行單元,在PC和移動設備上指一個程序或一個應用;android

進程和線程是包含與被包含的關係,一個進程中能夠有一個線程(主線程)也能夠有多個線程(多線程);程序員

知識點4 
Android中開啓多進程只有一種方法,那就是給四大組件(Activity、Service、Receiver、ContentProvider)在AndroidManifest.xml中指定android:process屬性;web

知識點5 
使用多進程可能會形成如下問題: 
1.靜態成員和單例模式徹底失效; 
2.線程同步徹底失效; 
3.SharedPreferences可靠性降低; 
4.Application會屢次建立;算法

知識點6 
Serializable和Parcelable的區別: 
Serializable:是Java中的序列化接口,使用簡單可是開銷大; 
Parcelable:是Android中的序列化方式,雖然使用起來麻煩一點,可是效率很高;sql

所以咱們首選Parcelable方式實現序列化;docker

知識點7 
RelativeLayout和LinearLayout繪製問題: 
RelativeLayout繪製時間比LinearLayout繪製時間稍長,由於RelativeLayout會進行兩次的繪製工做,一次橫向,一次縱向,而LinearLayout在沒有設置weight屬性的狀況下只進行一次繪製,只有當設置了weight屬性的狀況下才會進行兩次繪製,因此在繪製時間上,LinearLayout稍快。數據庫

知識點8 
static只能用來修飾成員變量,不能修飾局部變量,編譯時會報錯,例以下列代碼會報錯:

public class Student{ public void study(){ static int num = 10; } }

知識點9 
java中四種訪問控制級別: 
1.private(類訪問級別):若是類的成員被private訪問控制符修飾,則這個成員只能被該類的其它成員訪問,其餘類沒法直接訪問。類的良好封裝性就是經過private關鍵字來實現的。 
2.default(包訪問級別):若是一個類或者類的成員不使用任何訪問控制修飾符,則稱它爲默認訪問控制級別,這個類或者類的成員只能被本包中的其餘類訪問。 
3.protected(子類訪問級別):若是一個類的成員被protected訪問控制符修飾,那麼這個成員既能被同一包下的其餘類訪問,也能被不一樣包下該類的子類訪問。 
4.public(公共訪問級別):這是一個最寬鬆的訪問控制級別,若是一個類或者類的成員被public訪問控制符修飾,那麼這個類或者類的成員能被全部的類訪問,無論訪問類與被訪問類是否在同一個包中。

訪問範圍 private default protected public
同一類中 ☑️ ☑️ ☑️ ☑️
同一包中   ☑️ ☑️ ☑️
子類中     ☑️ ☑️
全局範圍       ☑️

知識點10 
Collection有兩個重要的子接口,分別是List和Set,其中List的特色是元素有序,元素可重複。Set的特色是元素無序且不可重複。List接口的主要實現類有ArrayList和LinkedList,Set接口的主要實現類有HashSet和TreeSet。

知識點11 
因爲ArrayList集合的底層是使用一個數組來保存元素,在增長或刪除指定位置的元素時,會致使建立新的數組,效率比較低,所以不適合作大量的增刪操做。可是這種數組的結構容許程序經過索引的方式來訪問元素,所以使用ArrayList集合查找元素和便捷。

知識點12 
LinkedList集合內部維護了一個雙向循環列表,鏈表中的每個元素都使用引用的方式來記住它的前一個元素和後一個元素,從而能夠將全部的元素彼此連接起來。當插入一個新元素時,只須要修改元素之間的這種引用關係便可,刪除一個節點也是如此。正由於這樣的存儲結構,因此LinkedList集合對於元素的增刪操做具備很高的效率。

知識點13 
常見的內存泄漏 : 
1.查詢數據庫沒有關閉Cursor。 
2.使用BaseAdapter做爲適配器時沒有複用convertView。 
3.bitmap沒有回收。 
4.註冊對象後沒有反註冊,好比Broadcast Receiver等。 
5.handler問題,若是handler是非靜態的,會致使Activity或者Service不被回收,因此應當註冊爲靜態內部類,同時在onDestroy時中止線程:mThread.getLooper().quit()。 
6.Activity被靜態引用,特別是緩存bitmap時,解決方法能夠考慮使用Application的context代替Activity的context。 
7.View在callback中被引用,可能回調尚未結束,可是view處於引用狀態,沒法回收。 
8.WebView的泄露問題:在魅族上面發現webView打開再關閉就會內存泄露。目前使用的解決方法是在webview外面嵌套一層layout做爲Container.在Activity的onDestroy中調用container.removeAllViews()方法。 
9.Dialog致使Window泄露,若是須要在dialog依附的Activity銷燬前沒有調用dialog.dismiss()會致使Activity泄露 。 
10.若是還有其餘的,歡迎補充!

知識點14 
安卓xml繪製虛線:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> <!-- 顯示一條虛線,破折線的寬度爲dashWith,破折線之間的空隙的寬度爲dashGap,當dashGap=0dp時,爲實線 --> <stroke android:width="1dp" android:color="#D5D5D5" android:dashWidth="2dp" android:dashGap="3dp" /> <!-- 虛線的高度 --> <size android:height="2dp" /> </shape> 

知識點15 
ExpandableListView 的子列表不能點擊(禁用)要把 Adapter 的 isChildSelectable 方法返回 true。

知識點16 
什麼叫垃圾回收機制? 
垃圾回收是一種動態存儲管理技術,它自動地釋放再也不被程序引用的對象,按照特定的垃圾收集算法來實現資源自動回收的功能。當一個對象再也不被引用的時候,內存回收它佔領的空間,以便空間被後來的新對象使用,以避免形成內存泄露。

知識點17 
java的垃圾回收有什麼特色? 
JAVA語言不容許程序員直接控制內存空間的使用。內存空間的分配和回收都是由JRE負責在後臺自動進行的,尤爲是無用內存空間的回收操做(garbagecollection,也稱垃圾回收),只能由運行環境提供的一個超級線程進行監測和控制。

知識點18 
垃圾回收器何時會運行? 
通常是在CPU空閒或空間不足時自動進行垃圾回收,而程序員沒法精確控制垃圾回收的時機和順序等。

知識點19 
垃圾回收器是怎樣工做的? 
垃圾回收器如發現一個對象不能被任何活線程訪問時,他將認爲該對象符合刪除條件,就將其加入回收隊列,但不是當即銷燬對象,什麼時候銷燬並釋放內存是沒法預知的。垃圾回收不能強制執行,然而Java提供了一些方法(如:System.gc()方法),容許你請求JVM執行垃圾回收,而不是要求,虛擬機會盡其所能知足請求,可是不能保證JVM從內存中刪除全部不用的對象。

知識點20 
如何顯示的使對象符合垃圾回收條件? 
1.空引用:當對象沒有對他可到達引用時,他就符合垃圾回收的條件。也就是說若是沒有對他的引用,刪除對象的引用就能夠達到目的,所以咱們能夠把引用變量設置爲null,來符合垃圾回收的條件。

StringBuffer sb = new StringBuffer("hello"); System.out.println(sb); sb=null;

2.從新爲引用變量賦值:能夠經過設置引用變量引用另外一個對象來解除該引用變量與一個對象間的引用關係。

StringBuffer sb1 = new StringBuffer("hello"); StringBuffer sb2 = new StringBuffer("goodbye"); System.out.println(sb1); sb1=sb2;//此時"hello"符合回收條件 

3.方法內建立的對象:所建立的局部變量僅在該方法的做用期間內存在。一旦該方法返回,在這個方法內建立的對象就符合垃圾收集條件。有一種明顯的例外狀況,就是方法的返回對象。

public static void main(String[] args) { Date d = getDate(); System.out.println("d = " + d); } private static Date getDate() { Date d2 = new Date(); StringBuffer now = new StringBuffer(d2.toString()); System.out.println(now); return d2; }

4.隔離引用:這種狀況中,被回收的對象仍具備引用,這種狀況稱做隔離島。若存在這兩個實例,他們互相引用,而且這兩個對象的全部其餘引用都刪除,其餘任何線程沒法訪問這兩個對象中的任意一個。也能夠符合垃圾回收條件。

public class Island { Island i; public static void main(String[] args) { Island i2 = new Island(); Island i3 = new Island(); Island i4 = new Island(); i2.i=i3; i3.i=i4; i4.i=i2; i2=null; i3=null; i4=null; } }

知識點21 
垃圾收集前進行清理——finalize()方法 java提供了一種機制,使你可以在對象剛要被垃圾回收以前運行一些代碼。這段代碼位於名爲finalize()的方法內,全部類從Object類繼承這個方法。因爲不能保證垃圾回收器會刪除某個對象。所以放在finalize()中的代碼沒法保證運行。所以建議不要重寫finalize()。

知識點22 
定義字符串應該儘可能使用 String str=」hello」; 的形式 ,避免使用String str = new String(「hello」); 的形式。由於要使用內容相同的字符串,沒必要每次都new一個String。 
後者每次都會調用構造器,生成新對象,性能低下且內存開銷大,而且沒有意義,由於String對象不可改變,因此對於內容相同的字符串,只要一個String對象來表示就能夠了。也就說,屢次調用上面的構造器建立多個對象,他們的String類型屬性s都指向同一個對象。

知識點23 
儘可能避免在類的構造函數裏建立、初始化大量的對象 ,防止在調用其自身類的構造器時形成沒必要要的內存資源浪費,尤爲是大對象,JVM會忽然須要大量內存,這時必然會觸發GC優化系統內存環境;顯示的聲明數組空間,並且申請數量還極大。

知識點24 
碰到一個需求,EditText默認的hint文字大小爲12sp,當有文字填寫時,文字大小變爲18sp,在xml文件中沒法實現,只能經過下列java代碼實現:

etPhone = (EditText) findViewById(R.id.msg_phone);
SpannableString ss = new SpannableString("請填寫已經註冊的手機號碼");//定義hint的值 AbsoluteSizeSpan ass = new AbsoluteSizeSpan(12, true);//設置字體大小 true表示單位是sp ss.setSpan(ass, 0, ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); etPhone.setHint(new SpannedString(ss));

知識點25 
關於Toast的優化: 
若是每次都使用Toast.makeText(context,content,Toast.LENGTH_SHORT).show();來給出吐司提示的話,當你在短期內不斷點擊,中止點擊後會發現吐司會停留很長的一段時間,這是由於每次點擊都是從新建立了一個Toast,因此這種作法會給用戶形成較差的用戶體驗,那麼正確的作法應該以下:

public class ToastUtils { private static Toast toast; public static void toast(Context cxt, String str) { if (toast == null) { toast = Toast.makeText(cxt, str, Toast.LENGTH_SHORT); } else { toast.setText(str); } toast.show(); } }

知識點26 
OkHttp和Volley的有什麼區別?

  • OkHttp

1.佔用儲存空間

使用OkHttp須要 okio.jar (80k), okhttp.jar(330k)這2個jar包,總大小差很少400k,加上本身的封裝,差很少得410k。

2.功能介紹

Square 公司開源的 OkHttp 是一個專一於鏈接效率的 HTTP 客戶端。OkHttp 提供了對 HTTP/2 和 SPDY 的支持,並提供了鏈接池,GZIP 壓縮和 HTTP 響應緩存功能。

3.優勢

支持http請求,https請求。

支持文件下載。

使用的是HttpURLConnection,不要擔憂android版本的變換。(至少目前是都支持的)。

支持get,post請求。

基於Http的文件上傳。

加載圖片。

4.缺點

好比callback回來是在線程裏面, 不能刷新UI,須要咱們手動處理。封裝比較麻煩。

  • Volley

1.佔用儲存空間

使用Volley 須要Volley.jar(120k),加上本身的封裝最多140k。

2.功能介紹

Volley是Goole在2013年Google I/O大會上推出了一個新的網絡通訊框架,它是開源的。Volley 的特色:特別適合數據量小,通訊頻繁的網絡操做。

3.優勢

很是適合進行數據量不大,但通訊頻繁的網絡操做。

內部分裝了異步線程。

支持get,post網絡請求。

圖片下載。

可直接在主線程調用服務端並處理返回結果。

能夠取消請求,容易擴展,面向接口編程。

4.缺點

對大文件下載 Volley的表現很是糟糕。

只支持http請求。

在BasicNetwork中判斷了statusCode(statusCode < 200 || statusCode > 
299),若是符合條件直

接圖片加載,性能通常。

使用的是httpclient,HttpURLConnection。不過在android 
6.0不支持httpclient了,若是想支持得添加org.apache.http.legacy.jar。

  • 總結

在咱們平時的項目使用volley就能夠了,相對okhttp,volley很是穩定。Okhttp通常混合來用,可以勝任相對複雜的需求。現在,在AndroidStudio中,網絡請求仍是推薦使用Retrofit2+okhttp。

知識點27 
Toast能夠經過如下方法改變顯示的位置:

Toast toast = Toast.makeText(MainActivity.this,"Bottom Right",Toast.LENGTH_SHORT); toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0); toast.show();

知識點28 
在Android中提供了三種解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推薦的Pull解析方式。

SAX: 是事件驅動型XML解析的一個標準接口,簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數作相應動做,而後繼續一樣的掃描,直至文檔結束。

DOM:即對象文檔模型,它是將整個XML文檔載入內存(因此效率較低,不推薦使用),使用DOM API遍歷XML樹、檢索所需的數據,每個節點當作一個對象。

Pull:運行方式與 SAX 解析器類似。它提供了相似的事件,SAX解析器的工做方式是自動將事件推入事件處理器進行處理,所以你不能控制事件的處理主動結束;而Pull解析器的工做方式爲容許你的應用程序代碼主動從解析器中獲取事件,正由於是主動獲取事件,所以能夠在知足了須要的條件後再也不獲取事件,結束解析。pull是一個while循環,隨時能夠跳出,而sax是隻要解析了,就必須解析完成。

知識點29 
try catch finally,try裏有return,finally還執行麼?

Condition 1: 若是try中沒有異常且try中有return (執行順序)

try —- finally — return

Condition 2: 若是try中有異常而且try中有return

try—-catch—finally— return

總之 finally 永遠執行!

Condition 3: try中有異常,try-catch-finally裏都沒有return ,finally 以後有個return

try—-catch—finally

try中有異常之後,根據java的異常機制先執行catch後執行finally,此時錯誤異常已經拋出,程序因異常而終止,因此你的return是不會執行的

Condition 4: 當 try和finally中都有return時,finally中的return會覆蓋掉其它位置的return(多個return會報unreachable code,編譯不會經過)。

Condition 5: 當finally中不存在return,而catch中存在return,但finally中要修改catch中return 的變量值時

int ret = 0; try{ throw new Exception(); } catch(Exception e) { ret = 1; return ret; } finally{ ret = 2; } 

最後返回值是1,由於return的值在執行finally以前已經肯定下來了

相關文章
相關標籤/搜索