Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android面試題及答案

android面試題及答案

編輯:關於Android編程

JAVA 1.GC是什麼? 為什麼要有GC? GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。   2.XML包括哪些解釋技術,區別是什麼? DOM和SAX DOM將文檔解析成一顆文檔樹,可在節點上進行遍歷、增加、修改和刪除。一次性讀入內存,對內存消耗大。 SAX至上而下解析文檔,以事件進行驅動。不會一次性讀入內存,對內存消耗小,不能任意讀取節點,並且不能對節點進行增加、修改和刪除。   3.switch語句能否作用在byte上,能否作用在long上,能否作用在String上? switch能作用在byte、char、short和int上,JDK1.7後可以作用在String上。   4."=="和equals方法究竟有什麼區別? ==和equals都可以比較地址。==是運算符,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字符串內容。   5.構造方法能否被重寫和重載? 構造方法不能被重寫但是能被重載。   6.面向對象的特征有哪些? 封裝、繼承、多態和抽象。 7.抽象類和接口的區別? 1).抽象類是abstract class修飾,接口是interface修飾。 2).抽象類可以有任意類型的屬性,接口只能有靜態常量修飾的屬性。 3).抽象類可以有普通方法和抽象法方法,接口的方法都是抽象方法。 4).抽象類和接口都不能實例化,但是抽象類有構造方法,接口沒有構造方法。 5).抽象類只能單根繼承,接口可以多重實現。   8.內部類可以引用它的包含類的成員嗎?有沒有什麼限制?  可以引用。如果需要指定當前類時要用外部類.this來引用。如果引用局部變量,需要將局部變量指定為final。   9.String s = new String("xyz");創建了幾個String Object? 二者之間有什麼區別? 2個對象。"xyz"創建在字符串常量池中,new String()創建在堆中。   10.try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?  會在return前執行。   11.Integer與int的區別 Integer為包裝類,int是基本數據類型。包裝類擁有方法和屬性,基本數據類型不具備。包裝類可以通過intValue來轉換成基本數據類型,也可以通過new Integer()將基本數據類型轉換為包裝類。在JDK1.5後,包裝類和基本數據類型可以實現自動轉換。   12.sleep()和wait()有什麼區別? sleep是Thread類的方法,wait是Object類的方法。 sleep是自動喚醒,wait需要其他線程來喚醒。 sleep不會釋放同步鎖,wait會釋放同步鎖。 sleep可以用在任意方法中,wait只能用在同步方法或同步塊中。   13.Sleep() 不會釋放對象鎖 到時自動恢復 wait()會釋放對象鎖 進入等待此對象的等待鎖定池 發出notify()方法後 才進入等待鎖定池准備對象鎖的獲取進入運行狀態   14.同步和異步有何異同,在什麼情況下分別使用他們? 同步指同一時間只能一個線程執行該方法,其他線程需要等待。異步指多個線程可以同時執行某個方法,並共享同一資源。 同步可以讓訪問的資源具有安全性,因為同一時間只能一個線程對其進行訪問。但是效率不高。 異步對訪問的資源會造成不穩定性,比如多個線程同時訪問一個資源,一個在修改、一個在刪除、一個在讀取,這樣可能會造成資源的混亂。但是由於同時運行,執行效率得到提高。   15.啟動一個線程是用run()還是start()?  start()方法啟動線程,run方法是線程執行的主方法。   16.java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? java中有三種流,分別是字節流(InputStream、OutputStream)、字符流(Reader、Writer)、對象流(ObjectInputStream、ObjectOutputStream)。   17.字節流與字符流的區別? 字節流用於讀取或寫出二進制數據,比如圖片、影像等數據。 字符流用於讀取或寫出字符數據,比如傳輸字符串。 所有的數據都可以通過字節流來進行處理,不過如果是字符數據,用字節流還需要進行轉換後傳輸,如果使用字符流可以方便數據的轉換。   18.error和exception有什麼區別? error是系統錯誤,代碼不能處理的錯誤,比如內存溢出、堆棧溢出等。 exception是程序異常,可以通過代碼try-catch進行處理,比如空指針異常,數組越界等。   19.談談final,finally,finalize的區別? final是修飾符,可以修飾類(不能被繼承)、屬性(常量)、和方法(不能被重寫)。 finally是異常處理塊中的代碼塊,表示無論如何都會執行的代碼塊。 finalize是Object類的方法,該方法在對象被垃圾回收之前執行的方法。   20.當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法? 如果其他方法沒有加synchronized的話是可以進入的。   21.當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞? java中只有值傳遞,如果傳遞的對象,實際也是傳遞該對象的地址。   22.作用域public,private,protected,以及不寫時的區別 public公共修飾符,表示任意類都可以訪問。 protected為受保護的修飾符,表示同類、同包以及不同包但是父子關系的是可以訪問。 不寫表示默認修飾符,或者稱為package修飾符,該修飾符表示只有同類或同包下的類可以訪問,出了這個包就不能訪問了。 private為私有修飾符,表示只有同類中可以訪問,出了這個類就不能訪問了。   23.用最有效率的方法算出2乘以8等於幾 2《 3 將2的二進制向左移3位。java中用<<來移位。   24.heap和stack有什麼區別。 heap表示堆,stack表示棧。堆中放對象,棧中放引用變量。 堆空間是一個無序的空間,棧是先進後出的結構。   25.運行時異常與一般異常有何異 運行時異常是指繼承於RuntimeException的異常,這些異常在編譯時可以不進行處理,當運行時如果出現問題才會拋出。如NullPointException、ArrayIndexOutOfBoundsException 一般異常也稱為編譯時異常,這些異常是繼承Exception但又不屬於RuntimeException的子類,如果程序中出現這些異常,在編譯時必須進行捕獲或拋出,否則編譯無法通過。如IOException、FileNotFoundException   26.垃圾回收的優點和原理。並考慮2種回收機制 Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。垃圾回收可以有效的防止內存洩露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。   27.描述一下JVM加載class文件的原理機制? JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。   28.是否可以從一個static方法內部發出對非static方法的調用? 不能,除非先創建非static方法所在類的對象。   29.什麼是java序列化,如何實現java序列化?   30.使用serializable關鍵字 使用一個輸出流構造一個對象流流對象 然後使用對象流對象的writeObject()就可以將參數為obj的對象寫出   31.Anonymous Inner Class(匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)? 匿名內部類可以繼承類或實現接口,但不是顯示的使用extends或implements來繼承或實現。   32.ArrayList和Vector的區別,HashMap和Hashtable的區別? ArrayList是JDK1.2的集合類並且線程不安全,Vector是1.0的集合類並且線程安全,二者用法類似。 HashMap線程不安全且能放空鍵或空值,Hashtable線程安全且不能放空鍵或空值。   33.String 和StringBuffer有什麼差別?在什麼情況下使用它們? String字符串的基本類,該字符串是不可變的。StringBuffer是利用堆來存儲字符串,並且可以對字符串的內容進行改變。   34.new一個類對象和使用類名創建一個對象有什麼區別?二者使用時應該注意什麼? new對象是最常見的創建對象的方式,利用類模板是通過反射來創建對象。雖然new對象時在底層也會通過類模板來創建對象,但是new對象的效率要比直接通過類模板創建對象的方式要高。 但是使用類模板的方式可以讓程序的靈活性提高。   35.LinkedList和ArrayList的區別? 1)LinkedList是鏈表結構的集合,ArrayList數組結構的集合。 2)LinkedList在中間或前面增加或刪除數據時效率比ArrayList高。 3)LinkedList在最後添加或刪除數據時效率比ArrayList低。 4)遍歷數據時ArrayList效率高於LinkedList。   36.介紹JAVA開發中常用的Collection FrameWork(集合框架)? Java中集合框架分為Collection和Map接口,Collection接口下的集合每個元素都由一個值組成,Map接口下的集合類每個元素都是由鍵值對組成。 Collection接口下面有List和Set接口,List接口下常見的類有ArrayList、LinkedList、Vector。它們中的元素可以重復,並且是有序的。Set接口下常見的類有HashSet、TreeSet。它們中的元素不能重復,並且是無序的。   37.在異常當中 throw和throws 有什麼區別和聯系? throw是在代碼中拋出一個異常,後面跟的是異常對象,虛擬機運行到這裡時會立即引發一個異常。 throws是寫在方法聲明上的,表示聲明該方法可能會拋出異常,後面跟的是異常類型。調用該方法的時候可以選擇處理它或繼續往外拋。   38.重載和重寫的區別 重載是指在一個類中,兩個或兩個以上的方法具有相同方法名和不同參數列表,則表示這些方法為重載方法。 重寫是指在父類和子類中,子類的方法和父類的方法具有相同方法名、相同參數列表、相同返回類型、子類的訪問修飾符范圍不小於父類的訪問修飾符范圍,異常的類型和個數不大於或多於父類的異常類型和個數,則表示該方法為重寫方法。換句話說重載方法是區分同一個類中相同方法名的方法,重寫方法是找到父類相同方法名的方法並重新改變方法的行為。   Android   39.activity、Service、BroadcastReceiver的作用(android) Activity:Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的一種,它需要為保持各界面的狀態,做很多持久化的事情,妥善管理生命周期以及一些跳轉邏輯 service:後台服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的指令,定義好需要接受的Intent提供同步和異步的接口 BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型   40.描述一個完整的Android activity lifecycle activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();   41.顯式intent和隱式intent的區別是什麼(android) Intent定義:Intent是一種在不同組件之間傳遞的請求消息,是應用程序發出的請求和意圖。作為一個完整的消息傳遞機制,Intent不僅需要發送端,還需要接收端。 顯式Intent定義:對於明確指出了目標組件名稱的Intent,我們稱之為顯式Intent。 隱式Intent定義:對於沒有明確指出目標組件名稱的Intent,則稱之為隱式Intent。 說明:Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。   42.Android中線程同步的方法 線程同步的方法可以采用同步方法和同步塊。   43.怎麼將一個Activity封裝成對話框的樣子? 怎樣將Activity封裝成長按Menu菜單的樣子? 簡單你只需要設置 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的地方一句話:  Xml代碼  android :theme="@android:style/Theme.Dialog"  android:theme="@android:style/Theme.Dialog"  這就使你的應用程序變成對話框的形式彈出來了,或者  Xml代碼  android:theme="@android:style/Theme.Translucent"  android:theme="@android:style/Theme.Translucent"  就變成半透明的。 重寫OnCreateOptionMenu方法來處理按下menu後的行為,然後再該方法中彈出對話框形式的Activity。 也可以利用事件監聽來監聽menu按鍵,並在該按鈕按下後彈出對話框形式的Activity。   44.介紹一下Android系統的體系結構 應用層:android的應用程序通常涉及用戶界面和交互。 應用框架層:UI組件、各種管理器等。 函數庫層:系統C庫、媒體庫、webkit、SQLite等。 linux核心庫:linux系統運行的組件。   *45.描述下橫豎屏切換時候 activity 的生命周期 不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次.  設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次.  設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法.   46.android 中的動畫有哪幾種,它們的特點和區別是什麼 ? 兩種,一種是補間動畫(Tween)動畫、還有一種是幀動畫(Frame)動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。   47.一條最長的短信息約占多少 byte? 140byte,70個漢字。   48.描述handler 機制的原理 andriod提供了 Handler 和 Looper 來滿足線程間的通信。 Handler 先進先出原則。 Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。  1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的Message Queue(消息隊列)。  2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的消息。  3) Message Queue(消息隊列):用來存放線程放入的消息。  4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。   49.如何將 SQLite 數據庫 (dictionary.db 文件 ) 與 apk 文件一起發布 ? 可以將dictionary.db文件復制到Eclipse Android工程中的res\raw目錄中。所有在res\raw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。  使用openDatabase方法來打開數據庫文件,如果該文件不存在,系統會自動創建/sdcard/dictionary目錄,並將res\raw目錄中的 dictionary.db文件復制到/sdcard/dictionary目錄中   50.說說 android 中 mvc 的具體體現 mvc是model,view,controller的縮寫,mvc包含三個部分: 模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。 視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。 控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。 android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下: 1)視圖(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入。 2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫過多的代碼,要通過activity交割model業務邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裡,程序就很容易被回收掉。 3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。   51.請介紹下 Android 中常用的五種布局 幀布局(FrameLayout) 線性布局(LinearLayout) 表格布局(TableLayout) 相對布局(RelativeLayout) 絕對布局(AbsoluteLayout)   52.如何啟用 Service ,如何停用 Service 1)startService用於啟動Service、stopService停止Service。 2)bindService綁定Service,unbindService解除Service的綁定。   53.如何優化ListView 1、如果自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView並返回,如果不為null則直接使用。在這個方法中盡可能少創建view。 2、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,可以達到圖像數據異步加載的效果。 3、如果listview需要顯示的item很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。   54.描述4 種 activity 的啟動模式 1)standard :系統的默認模式,一次跳轉即會生成一個新的實例。假設有一個activity命名為MainActivity,執行語句: startActivity(new Intent(MainActivity.this, MainActivity.class))後,MainActivity將跳轉到另外一個MainActivity,也就是現在的Task棧裡面有MainActivity的兩個實例。按返回鍵後你會發現仍然是在MainActivity(第一個)裡面。 2)singleTop:singleTop 跟standard 模式比較類似。如果已經有一個實例位於Activity棧的頂部時,就不產生新的實例,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的實例。例:當MainActivity為 singleTop 模式時,執行跳轉後棧裡面依舊只有一個實例,如果現在按返回鍵程序將直接退出。 3)singleTask: singleTask模式和後面的singleInstance模式都是只創建一個實例的。在這種模式下,無論跳轉的對象是不是位於棧頂的activity,程序都不會生成一個新的實例(當然前提是棧裡面已經有這個實例)。這種模式相當有用,在以後的多activity開發中,經常會因為跳轉的關系導致同個頁面生成多個實例,這個在用戶體驗上始終有點不好,而如果你將對應的activity聲明為 singleTask 模式,這種問題將不復存在。 4)singleInstance: 設置為 singleInstance 模式的 activity 將獨占一個task(感覺task可以理解為進程),獨占一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其他activity是獨立的,它有自己的上下文activity。   55.什麼是Intent,如何使用? Android基本的設計理念是鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統,它允許在你的應用程序與其它的應用程序間傳遞Intent來執行動作和產生事件。使用Intent可以激活Android應用的三個核心組件:活動、服務和廣播接收器。 通過startActivity() orstartActivityForResult()啟動一個Activity; 過 startService() 啟動一個服務,或者通過bindService() 和後台服務交互; 通過廣播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())發給broadcast receivers   56.Android用的數據庫是什麼樣的?它和sql有什麼區別?為什麼要用ContentProvide?它和sql的實現上有什麼差別? Adnroid用的是SQLite數據庫。它和其他網絡數據庫類似,也是通過SQL對數據進行管理。SQLite的操作非常簡單,包括數據類型在建表時也可以不指定。 使用ContentProvider 可以將數據共享給其他應用,讓除本應用之外的應用也可以訪問本應用的數據。它的底層是用SQLite 數據庫實現的,所以其對數據做的各種操作都是以Sql實現,只是在上層提供的是Uri。   57.通過Intent傳遞一些二進制數據的方法有哪些? 1)使用Serializable接口實現序列化,這是Java常用的方法。 2)實現Parcelable接口,這裡Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換數據也很常見的。    58.對一些資源以及狀態的操作保存,最好是保存在生命周期的哪個函數中進行? onResume()恢復數據、onPause()保存數據。   59.如何一次性退出所有打開的Activity 編寫一個Activity作為入口,當需要關閉程序時,可以利用Activity的SingleTop模式跳轉該Activity,它上面的所有Activity都會被銷毀掉。然後再將該Activity關閉。 或者再跳轉時,設置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這樣也能將上面的Activity銷毀掉。   60.說說Service的生命周期? 啟動Service的方式有兩種,各自的生命周期也有所不同。 一、通過startService啟動Service:onCreate、onStartCommand、onDestory。 二、通過bindService綁定Service:onCreate、onBind、onUnbind、onDestory。   61.什麼是AIDL?AIDL是如何工作的? AIDL(Android接口描述語言)是一種接口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預先定義的接口達到兩個進程內部通信進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象。AIDL是基於接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值.。   62.Android如何把文件存放在SDCard上? 在AndroidManifest.xml中加入訪問SDCard的權限如下: <!– 在SDCard中創建與刪除文件權限 –> <uses-permission android:name=”android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/> <!– 往SDCard寫入數據權限 –> <uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/> 要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,並且可以進行讀寫。 注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權限。 Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。 Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄。   63.注冊廣播有幾種方式,這些方式有何優缺點? 兩種。一種是通過代碼注冊,這種方式注冊的廣播會跟隨程序的生命周期。二種是在AndroidManifest.xml中配置廣播,這種常駐型廣播當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。   64.什麼是ANR 如何避免它?  在Android上,如果你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程序無響應(ANR:Application Not Responding)對話框。用戶可以選擇讓程序繼續運行,但是,他們在使用你的應用程序時,並不希望每次都要處理這個對話框。因此,在程序裡對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。要避免它,應該盡量少在主線程做耗時太長的操作,應該將這些操作放在線程當中去做。   65.Android本身的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決?  有可能,比如空指針異常、數組下表越界等異常,這些異常拋出後可能會導致程序FC。在編寫代碼時應該做好檢測,多考慮可能會發生錯誤的情況,從代碼層次解決這些問題。   66.為什麼要用 ContentProvider?它和 sql 的實現上有什麼差別? 使用ContentProvider 可以將數據共享給其他應用,讓除本應用之外的應用也可以訪問本應用的數據。它的底層是用SQLite 數據庫實現的,所以其對數據做的各種操作都是以Sql實現,只是在上層提供的是Uri。   67.談談 UI 中, Padding 和 Margin 有什麼區別? padding指內邊距,表示組件內部元素距離組件邊框的距離。 marin指外邊距,表示組件與組件之間的距離。   68.請介紹下 Android 的數據存儲方式。 Android 提供了5種方式存儲數據: 1)使用SharedPreferences存儲數據; 2)文件存儲數據; 3)SQLite數據庫存儲數據; 4)使用ContentProvider存儲數據; 5)網絡存儲數據;   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved