多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android面試題大全

Android面試題大全

來源:程序員人生   發布時間:2015-02-13 08:54:02 閱讀次數:3979次

1、 Android的4大組件是哪些,它們的作用?

答:Activity:Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的1種,它需要為保持各界面的狀態,做很多持久化的事情,妥善管理生命周期和1些跳轉邏輯

service:后臺服務于Activity,封裝有1個完全的功能邏輯實現,接受上層指令,完成相干的食品,定義好需要接受的Intent提供同步和異步的接口

Content Provider:是Android提供的第3方利用數據的訪問方案,可以派生Content Provider類,對外提供數據,可以像數據庫1樣進行選擇排序,屏蔽內部數據的存儲細節,向外提供統1的借口模型,大大簡化上層利用,對數據的整合提供了更方便的途徑

BroadCast Receiver:接受1種或多種Intent作觸發事件,接受相干消息,做1些簡單處理,轉換成1條Notification,統1了Android的事件廣播模型

2、 請介紹下Android中經常使用的5種布局

經常使用5種布局方式,分別是:FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。

1、FrameLayout:所有東西順次都放在左上角,會堆疊,這個布局比較簡單,也只能放1點比較簡單的東西。2、LinearLayout:線性布局,每個LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。當垂直布局時,每行就只有1個元素,多個元素順次垂直往下;水平布局時,只有1行,每個元素順次向右排列。3、AbsoluteLayout:絕對布局用X,Y坐標來指定元素的位置,這類布局方式也比較簡單,但是在屏幕旋轉時,常常會出問題,而且多個元素的時候,計算比較麻煩。4、RelativeLayout:相對布局可以理解為某1個元素為參照物,來定位的布局方式。主要屬性有:相對某1個元素android:layout_below、      android:layout_toLeftOf相對父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;5、TableLayout:表格布局,每個TableLayout里面有表格行TableRow,TableRow里面可以具體定義每個元素。每個布局都有自己合適的方式,這5個布局元素可以相互嵌套利用,做出美觀的界面。

3、 android中的動畫有哪幾類,它們的特點和區分是甚么 

答:兩種,1種是Tween動畫、還有1種是Frame動畫。Tween動畫,這類實現方式可使視圖組件移動、放大、縮小和產生透明度的變化;另外一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

4、 android 中有哪幾種解析xml的類?官方推薦哪一種?和它們的原理和區分。

答:XML解析主要有3種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕松些,但1些性能敏感的數據庫或手機上還是主要采取SAX方式,SAX讀取是單向的,優點:不占內存空間、解析屬性方便,但缺點就是對套嵌多個分支來講處理不是很方便。而DOM方式會把全部XML文件加載到內存中去,這里Android開發網提示大家該方法在查找方面可以和XPath很好的結合如果數據量不是很大推薦使用,而PULL常經常使用在J2ME對節點處理比較好,類似SAX方式,一樣很節省內存,在J2ME中我們常常使用的KXML庫來解析。

5、 ListView的優化方案

答:1、如果自定義適配器,那末在getView方法中要斟酌方法傳進來的參數contentView是不是為null,如果為null就創建contentView并返回,如果不為null則直接使用。在這個方法中盡量少創建view。

2、給contentView設置tag(setTag()),傳入1個viewHolder對象,用于緩存要顯示的數據,可以到達圖象數據異步加載的效果。

3、如果listview需要顯示的item很多,就要斟酌分頁加載。比如1共要顯示100條或更多的時候,我們可以斟酌先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。

6、 請介紹下Android的數據存儲方式。

答:使用SharedPreferences存儲數據;文件存儲數據;SQLite數據庫存儲數據;使用ContentProvider存儲數據;網絡存儲數據;

Preference,File, DataBase這3種方式分別對應的目錄是/data/data/PackageName/Shared_Pref, /data/data/Package Name/files, /data/data/PackageName/database 。

1:使用SharedPreferences存儲數據

首先說明SharedPreferences存儲方式,它是 Android提供的用來存儲1些簡單配置信息的1種機制,例如:登錄用戶的用戶名與密碼。其采取了Map數據結構來存儲數據,以鍵值的方式存儲,可以簡單的讀取與寫入,具體實例以下:

voidReadSharedPreferences(){

StringstrName,strPassword;

SharedPreferences   user = getSharedPreferences(“user_info”,0);

strName =user.getString(“NAME”,””);

strPassword =user getString(“PASSWORD”,””);

}

voidWriteSharedPreferences(String strName,String strPassword){

SharedPreferences   user = getSharedPreferences(“user_info”,0);

uer.edit();

user.putString(“NAME”,strName);

user.putString(“PASSWORD”,strPassword);

user.commit();

}

數據讀取與寫入的方法都非常簡單,只是在寫入的時候有些區分:先調用edit()使其處于編輯狀態,然后才能修改數據,最后使用commit()提交修改的數據。實際上SharedPreferences是采取了XML格式將數據存儲到裝備中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。使用SharedPreferences是有些限制的:只能在同1個包內使用,不能在不同的包之間使用。

2:文件存儲數據

文件存儲方式是1種較經常使用的方法,在Android中讀取/寫入文件的方法,與Java中實現I/O的程序是完全1樣的,提供了openFileInput()和openFileOutput()方法來讀取裝備上的文件。具體實例以下:

String fn =“moandroid.log”;

FileInputStreamfis = openFileInput(fn);

FileOutputStreamfos = openFileOutput(fn,Context.MODE_PRIVATE);

3:網絡存儲數據

網絡存儲方式,需要與Android網絡數據包打交道,關于Android 網絡數據包的詳細說明,請瀏覽Android SDK援用了Java SDK的哪些package?。

4:ContentProvider

1、ContentProvider簡介

當利用繼承ContentProvider類,并重寫該類用于提供數據和存儲數據的方法,就能夠向其他利用同享其數據。雖然使用其他方法也能夠對外同享數據,但數據訪問方式會因數據存儲的方式而不同,如:采取文件方式對外同享數據,需要進行文件操作讀寫數據;采取sharedpreferences同享數據,需要使用sharedpreferencesAPI讀寫數據。而使用ContentProvider同享數據的好處是統1了數據訪問方式。

2、Uri類簡介

Uri代表了要操作的數據,Uri主要包括了兩部份信息:1.需要操作的ContentProvider ,2.對ContentProvider中的甚么數據進行操作,1個Uri由以下幾部份組成:

1.scheme:ContentProvider(內容提供者)的scheme已由Android所規定為:content://…

2.主機名(或Authority):用于唯1標識這個ContentProvider,外部調用者可以根據這個標識來找到它。

3.路徑(path):可以用來表示我們要操作的數據,路徑的構建應根據業務而定,以下:

要操作contact表中id為10的記錄,可以構建這樣的路徑:/contact/10

要操作contact表中id為10的記錄的name字段, contact/10/name

要操作contact表中的所有記錄,可以構建這樣的路徑:/contact?

要操作的數據不1定來自數據庫,也能夠是文件等他存儲方式,以下:

要操作xml文件中contact節點下的name節點,可以構建這樣的路徑:/contact/name

如果要把1個字符串轉換成Uri,可使用Uri類中的parse()方法,以下:

Uri uri =Uri.parse("content://com.changcheng.provider.contactprovider/contact")

3、UriMatcher、ContentUrist和ContentResolver簡介

由于Uri代表了要操作的數據,所以我們很常常需要解析Uri,并從 Uri中獲得數據。Android系統提供了兩個用于操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便于我們的開發工作。

UriMatcher:用于匹配Uri,它的用法以下:

 

1.首先把你需要匹配Uri路徑全部給注冊上,以下:

//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(⑴)。

UriMatcheruriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路徑,返回匹配碼為1

uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就會返回匹配碼

//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼為2

uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”,2);//#號為通配符

2.注冊完需要匹配的Uri后,就能夠使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調用 addURI()方法傳入的第3個參數,假定匹配content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼為1。

ContentUris:用于獲得Uri路徑后面的ID部份,它有兩個比較實用的方法:

withAppendedId(uri,id)用于為路徑加上ID部份

parseId(uri)方法用于從路徑中獲得ID部份

ContentResolver:當外部利用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可使用 ContentResolver 類來完成,要獲得ContentResolver 對象,可使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,來操作數據。

7、 activity的啟動模式有哪些?是甚么含義?

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

“standard” (默許)

“singleTop”

“singleTask”

“singleInstance”

 

它們主要有以下不同:

1. 如何決定所屬task

“standard”和”singleTop”的activity的目標task,和收到的Intent的發送者在同1個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。

如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task里。

“singleTask”和”singleInstance”總是把activity作為1個task的根元素,他們不會被啟動到1個其他task里。

2. 是不是允許多個實例

“standard”和”singleTop”可以被實例化屢次,并且存在于不同的task中,且1個task可以包括1個activity的多個實例;

“singleTask”和”singleInstance”則限制只生成1個實例,并且是task的根元素。 singleTop要求如果創建intent的時候棧頂已有要創建 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。

3. 是不是允許其它activity存在于本task內

“singleInstance”獨占1個task,其它activity不能存在那個task里;如果它啟動了1個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行(猶如加了FLAG_ACTIVITY_NEW_TASK參數)。

而另外3種模式,則可以和其它activity共存。

4. 是不是每次都生成新實例

“standard”對沒1個啟動Intent都會生成1個activity的新實例;

“singleTop”的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。

比如現在task棧元素為A-B-C-D(D在棧頂),這時候候給D發1個啟動intent,如果D是 “standard”的,則生成D的1個新實例,棧變成A-B-C-D-D。

如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D

如果這時候候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會生成B的新實例,棧狀態變成A-B-C-D-B。

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

“singleTask”如果在棧頂,則接受intent,否則,該intent會被拋棄,但是該task仍會回到前臺。

當已存在的activity實例處理新的intent時候,會調用onNewIntent()方法 如果收到intent生成1個activity實例,那末用戶可以通過back鍵回到上1個狀態;如果是已存在的1個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。

8、  跟activity和Task 有關的 Intent啟動方式有哪些?其含義?

核心的Intent Flag有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NEW_TASK

  如果設置,這個Activity會成為歷史stack中1個新Task的開始。1個Task(從啟動它的Activity到下1個Task中的 Activity)定義了用戶可以遷移的Activity原子組。Task可以移動到前臺和后臺;在某個特定Task中的所有Activity總是保持相同的次序。

 這個標志1般用于顯現“啟動”類型的行動:它們提供用戶1系列可以單獨完成的事情,與啟動它們的Activity完全無關。

 使用這個標志,如果正在啟動的Activity的Task已在運行的話,那末,新的Activity將不會啟動;代替的,當前Task會簡單的移入前臺。參考FLAG_ACTIVITY_MULTIPLE_TASK標志,可以禁用這1行動。

 這個標志不能用于調用方對已啟動的Activity要求結果。

FLAG_ACTIVITY_CLEAR_TOP
  如果設置,并且這個Activity已在當前的Task中運行,因此,不再是重新啟動1個這個Activity的實例,而是在這個Activity上方的所有Activity都將關閉,然后這個Intent會作為1個新的Intent投遞到老的Activity(現在位于頂端)中。
  例如,假定1個Task中包括這些Activity:A,B,C,D。如果D調用了startActivity(),并且包括1個指向Activity B的Intent,那末,C和D都將結束,然后B接收到這個Intent,因此,目前stack的狀態是:A,B。
  上例中正在運行的Activity B既可以在onNewIntent()中接收到這個新的Intent,也能夠把自己關閉然后重新啟動來接收這個Intent。如果它的啟動模式聲明為 “multiple”(默許值),并且你沒有在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標志,那末它將關閉然后重新創建;對其它的啟動模式,或在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標志,都將把這個Intent投遞到當前這個實例的onNewIntent()中。
  這個啟動模式還可以與FLAG_ACTIVITY_NEW_TASK結合起來使用:用于啟動1個Task中的根Activity,它會把那個Task中任何運行的實例帶入前臺,然后清除它直到根Activity。這非常有用,例如,當從Notification Manager處啟動1個Activity。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

    如果設置這個標志,這個activity不論是從1個新的棧啟動還是從已有棧推到棧頂,它都將以the front door of the task的方式啟動。這就講致使任何與利用相干的棧都講重置到正常狀態(不論是正在講activity移入還是移除),如果需要,或直接重置該棧為初始狀態。

FLAG_ACTIVITY_SINGLE_TOP
  如果設置,當這個Activity位于歷史stack的頂端運行時,不再啟動1個新的

FLAG_ACTIVITY_BROUGHT_TO_FRONT
  這個標志1般不是由程序代碼設置的,如在launchMode中設置singleTask模式時系統幫你設定。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
  如果設置,這將在Task的Activitystack中設置1個還原點,當Task恢復時,需要清算Activity。也就是說,下1次Task帶著 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標記進入前臺時(典型的操作是用戶在主畫面重啟它),這個Activity和它之上的都將關閉,以致于用戶不能再返回到它們,但是可以回到之前的Activity。
  這在你的程序有分割點的時候很有用。例如,1個e-mail利用程序可能有1個操作是查看1個附件,需要啟動圖片閱讀Activity來顯示。這個 Activity應當作為e-mail利用程序Task的1部份,由于這是用戶在這個Task中觸發的操作。但是,當用戶離開這個Task,然后從主畫面選擇e-mail app,我們可能希望回到查看的會話中,但不是查看圖片附件,由于這讓人困惑。通過在啟動圖片閱讀時設定這個標志,閱讀及其它啟動的Activity在下次用戶返回到mail程序時都將全部清除。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
  如果設置,新的Activity不會在最近啟動的Activity的列表中保存。

FLAG_ACTIVITY_FORWARD_RESULT
  如果設置,并且這個Intent用于從1個存在的Activity啟動1個新的Activity,那末,這個作為答復目標的Activity將會傳到這個新的Activity中。這類方式下,新的Activity可以調用setResult(int),并且這個結果值將發送給那個作為答復目標的 Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
  這個標志1般不由利用程序代碼設置,如果這個Activity是從歷史記錄里啟動的(常按HOME鍵),那末,系統會幫你設定。

FLAG_ACTIVITY_MULTIPLE_TASK
  不要使用這個標志,除非你自己實現了利用程序啟動器。與FLAG_ACTIVITY_NEW_TASK結合起來使用,可以禁用把已存的Task送入前臺的行動。當設置時,新的Task總是會啟動來處理Intent,而不管這是是不是已有1個Task可以處理相同的事情。
  由于默許的系統不包括圖形Task管理功能,因此,你不應當使用這個標志,除非你提供給用戶1種方式可以返回到已啟動的Task。
  如果FLAG_ACTIVITY_NEW_TASK標志沒有設置,這個標志被疏忽。

 

FLAG_ACTIVITY_NO_ANIMATION
  如果在Intent中設置,并傳遞給Context.startActivity()的話,這個標志將禁止系統進入下1個Activity時利用 Acitivity遷移動畫。這其實不意味著動畫將永不運行――如果另外一個Activity在啟動顯示之前,沒有指定這個標志,那末,動畫將被利用。這個標志可以很好的用于履行1連串的操作,而動畫被看做是更高1級的事件的驅動。

FLAG_ACTIVITY_NO_HISTORY
  如果設置,新的Activity將不再歷史stack中保存。用戶1離開它,這個Activity就關閉了。這也能夠通過設置noHistory特性。

FLAG_ACTIVITY_NO_USER_ACTION
  如果設置,作為新啟動的Activity進入前臺時,這個標志將在Activity暫停之前禁止從最前方的Activity回調的onUserLeaveHint()。
  典型的,1個Activity可以依賴這個回調指明顯式的用戶動作引發的Activity移出后臺。這個回調在Activity的生命周期中標記1個適合的點,并關閉1些Notification。
  如果1個Activity通過非用戶驅動的事件,如來電或鬧鐘,啟動的,這個標志也應當傳遞給Context.startActivity,保證暫停的Activity不認為用戶已知曉其Notification。

FLAG_ACTIVITY_PREVIOUS_IS_TOP
  If set and this intent is being used to launch a new activity froman existing one, the current activity will not be counted as the top activityfor deciding whether the new intent should be delivered to the top instead ofstarting a new one. The previous activity will be used as the top, with theassumption being that the current activity will finish itself immediately.

FLAG_ACTIVITY_REORDER_TO_FRONT
  如果在Intent中設置,并傳遞給Context.startActivity(),這個標志將引發已運行的Activity移動到歷史stack的頂端。
  例如,假定1個Task由4個Activity組成:A,B,C,D。如果D調用startActivity()來啟動Activity B,那末,B會移動到歷史stack的頂端,現在的次序變成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP標志也設置的話,那末這個標志將被疏忽。

9、 請描寫下Activity的生命周期。

答:activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

可見生命周期:從onStart()直到系統調用onStop()

前臺生命周期:從onResume()直到系統調用onPause()

10、    activity在屏幕旋轉時的生命周期

答:

1)  不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會履行1次,切豎屏時會履行兩次;

2)  設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會履行1次;

3)  設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會履行onConfigurationChanged方法

11、    如何啟用Service,如何停用Service。

服務的開發比較簡單,以下:

第1步:繼承Service類

public class SMSServiceextends Service {}

第2步:在AndroidManifest.xml文件中的<application>節點里對服務進行配置:<serviceandroid:name=".SMSService" />

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

如果打算采取Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已被創建,屢次調用startService()方法其實不會致使屢次創建服務,但會致使屢次調用onStart()方法。采取startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

如果打算采取Context.bindService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調用者和服務綁定在1起,調用者退出了,系統就會先調用服務的onUnbind()方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已被綁定,屢次調用bindService()方法其實不會致使屢次創建服務及綁定(也就是說onCreate()和onBind()方法其實不會被屢次調用)。如果調用者希望與正在綁定的服務消除綁定,可以調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-->onDestroy()方法。

 

服務經常使用生命周期回調方法以下:

onCreate() 該方法在服務被創建時調用,該方法只會被調用1次,不管調用多少次startService()或bindService()方法,服務也只被創建1次。

onDestroy()該方法在服務被終止時調用。

與采取Context.startService()方法啟動服務有關的生命周期方法

onStart() 只有采取Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。屢次調用startService()方法雖然不會屢次創建服務,但onStart() 方法會被屢次調用。

與采取Context.bindService()方法啟動服務有關的生命周期方法

onBind()只有采取Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已綁定,屢次調用Context.bindService()方法其實不會致使該方法被屢次調用。

onUnbind()只有采取Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務消除綁定時被調用

 

12、    注冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的意圖。

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

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

<receiveandroid:name=".IncomingSMSReceiver " >

<intent-filter>

   <actionandroid:name="android.provider.Telephony.SMS_RECEIVED")

<intent-filter>

<receiver>

第2種使用代碼進行注冊如:

IntentFilterfilter =  newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiverreceiver = new IncomgSMSReceiver();

registerReceiver(receiver.filter);

兩種注冊類型的區分是:

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

2)第2種是常駐型,也就是說當利用程序關閉后,如果有信息廣播來,程序也會被系統調用自動運行。

 

13、    請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系。

答:簡單的說,looper用來MessageQueue中取出Message,再有Handler進行Message的分發和處理.

Message Queue(消息隊列):用來寄存通過Handler發布的消息,通常附屬于某1個創建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列

Handler:可以發布或處理1個消息或操作1個Runnable,通過Handler發布消息,消息將只會發送到與它關聯的消息隊列,然也只能處理該消息隊列中的消息

Looper:是Handler和消息隊列之間通訊橋梁,程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列里的消息廣播給所有的

Handler:Handler接遭到消息后調用handleMessage進行處理

Message:消息的類型,在Handler類中的handleMessage方法中得到單個的消息進行處理

在單線程模型下,為了線程通訊問題,Android設計了1個Message Queue(消息隊列), 線程間可以通過該Message Queue并結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹:

1. Message

    Message消息,理解為線程間交換的信息,處理數據后臺線程需要更新UI,則發送Message內含1些數據給UI線程。

2. Handler

    Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的履行處理。后臺線程就是通過傳進來的 Handler對象援用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。

3. Message Queue

    Message Queue消息隊列,用來寄存通過Handler發布的消息,依照先進先出履行。

    每一個message queue都會有1個對應的Handler。Handler會向messagequeue通過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾并按先進先出履行。但通過這兩種方法發送的消息履行的方式略有不同:通過sendMessage發送的是1個message對象,會被 Handler的handleMessage()函數處理;而通過post方法發送的是1個runnable對象,則會自己履行。

4. Looper

    Looper是每條線程里的Message Queue的管家。Android沒有Global的MessageQueue,而Android會自動替主線程(UI線程)建立Message Queue,但在子線程里并沒有建立Message Queue。所以調用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調用Looper.myLooper()得到當前線程的Looper就有可能為NULL。對子線程使用Looper,API Doc提供了正確的使用方法:這個Message機制的大概流程:

    1. 在Looper.loop()方法運行開始后,循環地依照接收順序取出Message Queue里面的非NULL的Message。

    2. 1開始Message Queue里面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函數里面設置了那個Message對象的target屬性是當前的Handler對象。隨后Looper取出了那個Message,則調用 該Message的target指向的Hander的dispatchMessage函數對Message進行處理。在dispatchMessage方法里,如何處理Message則由用戶指定,3個判斷,優先級從高到低:

    1) Message里面的Callback,1個實現了Runnable接口的對象,其中run函數做處理工作;

    2) Handler里面的mCallback指向的1個實現了Callback接口的對象,由其handleMessage進行處理;

    3) 處理消息Handler對象對應的類繼承并實現了其中handleMessage函數,通過這個實現的handleMessage函數處理消息。

    因而可知,我們實現的handleMessage方法是優先級最低的!

    3. Handler處理完該Message (updateUI) 后,Looper則設置該Message為NULL,以便回收!

    在網上有很多文章講述主線程和其他子線程如何交互,傳送信息,終究誰來履行處理信息之類的,個人理解是最簡單的方法――判斷Handler對象里面的Looper對象是屬于哪條線程的,則由該線程來履行!

    1. 當Handler對象的構造函數的參數為空,則為當前所在線程的Looper;

2. Looper.getMainLooper()得到的是主線程的Looper對象,Looper.myLooper()得到的是當前線程的Looper對象。

14、    扼要解釋1下activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver

答:1個activity顯現了1個用戶可以操作的可視化用戶界面;1個service不包括可見的用戶界面,而是在后臺運行,可以與1個activity綁定,通過綁定暴露出來接口并與其進行通訊;1個broadcast receiver是1個接收廣播消息并做出回應的component,broadcast receiver沒有界面;1個intent是1個Intent對象,它保存了消息的內容。對activity和service來講,它指定了要求的操作名稱和待操作數據的URI,Intent對象可以顯式的指定1個目標component。如果這樣的話,android會找到這個component(基于manifest文件中的聲明)并激活它。但如果1個目標不是顯式指定的,android必須找到響應intent的最好component。它是通過將Intent對象和目標的intent filter相比較來完成這1工作的;1個component的intent filter告知android該component能處理的intent。intentfilter也是在manifest文件中聲明的。

15、    說說mvc模式的原理,它在android中的應用,android的官方建議利用程序的開發采取mvc模式。何謂mvc?

mvc是model,view,controller的縮寫,mvc包括3個部份:

  模型(model)對象:是利用程序的主體部份,所有的業務邏輯都應當寫在該層。

  視圖(view)對象:是利用程序中負責生成用戶界面的部份。也是在全部mvc架構中用戶唯1可以看到的1層,接收用戶的輸入,顯示處理結果。

  控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部份,控制器更重要的1種導航功能,響利用戶動身的相干事件,交給m層處理。

  android鼓勵弱耦合和組件的重用,在android中mvc的具體體現以下:

  1)視圖層(view):1般采取xml文件進行界面的描寫,使用的時候可以非常方便的引入,固然,如果你對android了解的比較的多了話,就1定可以想到在android中也能夠使用javascript+html等的方式作為view層,固然這里需要進行java和javascript之間的通訊,榮幸的是,android提供了它們之間非常方便的通訊實現。

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

  3)模型層(model):對數據庫的操作、對網絡等的操作都應當在model里面處理,固然對業務計算等操作也是必須放在的該層的。

16、    甚么是ANR 如何避免它?

答:ANR:Application Not Responding。在Android中,活動管理器和窗口管理器這兩個系統服務負責監視利用程序的響應,當用戶操作的在5s內利用程序沒能做出反應,BroadcastReceiver在10秒內沒有履行終了,就會出現利用程序無響應對話框,這既是ANR。

避免方法:Activity應當在它的關鍵生命周期方法(如onCreate()和onResume())里盡量少的去做創建操作。潛伏的耗時操作,例如網絡或數據庫操作,或高耗時的計算如改變位圖尺寸,應當在子線程里(或異步方式)來完成。主線程應當為子線程提供1個Handler,以便完成時能夠提交給主線程。

17、    甚么情況會致使Force Close ?如何避免?能否捕獲致使其的異常?

答:程序出現異常,比如nullpointer。

避免:編寫程序時邏輯聯貫,思惟周密。能捕獲異常,在logcat中能看到異常信息

18、    描寫1下android的系統架構

android系統架構分從下往上為linux 內核層、運行庫、利用程序框架層、和利用程序層。

linuxkernel:負責硬件的驅動程序、網絡、電源、系統安全和內存管理等功能。

libraries和 android runtime:libraries:即c/c++函數庫部份,大多數都是開放源代碼的函數庫,例如webkit(引擎),該函數庫負責 android網頁閱讀器的運行,例如標準的c函數庫libc、openssl、sqlite等,固然也包括支持游戲開發2dsgl和 3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文件的播放與顯示,例如mpeg4、h.264、mp3、 aac、amr、jpg和png等眾多的多媒體文件格式。android的runtime負責解釋和履行生成的dalvik格式的字節碼。

  applicationframework(利用軟件架構),java利用程序開發人員主要是使用該層封裝好的api進行快速開發。

  applications:該層是java的利用程序層,android內置的googlemaps、e-mail、即時通訊工具、閱讀器、mp3播放器等處于該層,java開發人員開發的程序也處于該層,而且和內置的利用程序具有同等的位置,可以調用內置的利用程序,也能夠替換內置的利用程序。

  上面的4個層次,下層為上層服務,上層需要下層的支持,調用下層的服務,這類嚴格分層的方式帶來的極大的穩定性、靈活性和可擴大性,使得不同層的開發人員可以依照規范專心特定層的開發。

android利用程序使用框架的api并在框架下運行,這就帶來了程序開發的高度1致性,另外一方面也告知我們,要想寫出優良高效的程序就必須對全部 applicationframework進行非常深入的理解。精通applicationframework,你就能夠真實的理解android的設計和運行機制,也就更能夠駕馭全部利用層的開發。

19、    請介紹下ContentProvider是如何實現數據同享的。

1個程序可以通過實現1個Content provider的抽象接口將自己的數據完全暴露出去,而且Contentproviders是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可讓所有的利用程序訪問到,這也是利用程序之間唯1同享數據的方法。

要想使利用程序的數據公然化,可通過2種方法:創建1個屬于你自己的Content provider或將你的數據添加到1個已存在的Content provider中,條件是有相同數據類型并且有寫入Contentprovider的權限。

如何通過1套標準及統1的接口獲得其他利用程序暴露的數據?

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

20、    Service和Thread的區分?

答:servie是系統的組件,它由系統進程托管(servicemanager);它們之間的通訊類似于clientserver,是1種輕量級的ipc通訊,這類通訊的載體是binder,它是在linux層交換信息的1種ipc。而thread是由本利用程序托管。

1). ThreadThread是程序履行的最小單元,它是分配CPU的基本單位。可以用Thread 來履行1些異步的操作。

2). ServiceServiceandroid的1種機制,當它運行的時候如果是LocalService,那末對應的Service 是運行在主進程的main 線程上的。如:onCreateonStart這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那末對應的Service 則是運行在獨立進程的main 線程上。

既然這樣,那末我們為何要用Service 呢?其實這跟android 的系統機制有關,我們先拿Thread 來講。Thread的運行是獨立于 Activity 的,也就是說當1個Activity finish 以后,如果你沒有主動停止Thread Thread 里的 run方法沒有履行終了的話,Thread 也會1直履行。因此這里會出現1個問題:當Activity finish 以后,你不再持有該Thread 的援用。另外一方面,你沒有辦法在不同的Activity 中對同1Thread 進行控制。  

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

因此你可以把Service 想象成1種消息服務,而你可以在任何有Context 的地方調用Context.startServiceContext.stopServiceContext.bindServiceContext.unbindService,來控制它,你也能夠在Service 里注冊BroadcastReceiver,在其他地方通過發送broadcast 來控制它,固然這些都是Thread 做不到的。

21、    Android本身的api并未聲明會拋出異常,則其在運行時有沒有可能拋出runtime異常,你遇到過嗎?諾有的話會致使甚么問題?如何解決?

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

22、    IntentService有何優點?

答:Acitivity的進程,當處理Intent的時候,會產生1個對應的Service; Android的進程處理器現在會盡量的不kill掉你;非常容易使用

23、    如果后臺的Activity由于某緣由被系統回收了,如何在被系統回收之前保存當前狀態?

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

24、    如何將1個Activity設置成窗口的樣式。

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

另外android:theme="@android:style/Theme.Translucent" 是設置透明

25、    如何退出Activity?如何安全退出已調用多個Activity的Application?

答:對單1Activity的利用來講,退出很簡單,直接finish()便可。固然,也能夠用killProcess()和System.exit()這樣的方法。

對多個activity,1、記錄打開的Activity:每打開1個Activity,就記錄下來。在需要退出時,關閉每個Activity便可。2、發送特定廣播:在需要結束利用時,發送1個特定的廣播,每一個Activity收到廣播后,關閉便可。3、遞歸退出:在打開新的Activity時使用startActivityForResult,然后自己加標志,在onActivityResult中處理,遞歸關閉。為了編程方便,最好定義1個Activity基類,處理這些共通問題。

 

在2.1之前,可使用ActivityManager的restartPackage方法。

它可以直接結束全部利用。在使用時需要權限android.permission.RESTART_PACKAGES。

注意不要被它的名字迷惑。

可是,在2.2,這個方法失效了。在2.2添加了1個新的方法,killBackground Processes(),需要權限android.permission.KILL_BACKGROUND_PROCESSES。惋惜的是,它和2.2的restartPackage1樣,根本起不到應有的效果。

另外還有1個方法,就是系統自帶的利用程序管理里,強迫結束程序的方法,forceStopPackage()。它需要權限android.permission.FORCE_STOP_PACKAGES。并且需要添加android:sharedUserId="android.uid.system"屬性。一樣惋惜的是,該方法是非公然的,他只能運行在系統進程,第3方程序沒法調用。

由于需要在Android.mk中添加LOCAL_CERTIFICATE := platform。

而Android.mk是用于在Android源碼下編譯程序用的。

從以上可以看出,在2.2,沒有辦法直接結束1個利用,而只能用自己的辦法間接辦到。

現提供幾個方法,供參考:

1、拋異常強迫退出:

該方法通過拋異常,使程序Force Close。

驗證可以,但是,需要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。

2、記錄打開的Activity:

每打開1個Activity,就記錄下來。在需要退出時,關閉每個Activity便可。

3、發送特定廣播:

在需要結束利用時,發送1個特定的廣播,每一個Activity收到廣播后,關閉便可。

4、遞歸退出

在打開新的Activity時使用startActivityForResult,然后自己加標志,在onActivityResult中處理,遞歸關閉。

除第1個,都是想辦法把每個Activity都結束掉,間接到達目的。但是這樣做一樣不完善。你會發現,如果自己的利用程序對每個Activity都設置了nosensor,在兩個Activity結束的間隙,sensor可能有效了。但最少,我們的目的到達了,而且沒有影響用戶使用。為了編程方便,最好定義1個Activity基類,處理這些共通問題。

 

26、    AIDL的全稱是甚么?如何工作?能處理哪些類型的數據?

答:全稱是:AndroidInterface Define Language

在Android中, 每一個利用程序都可以有自己的進程. 在寫UI利用的時候, 常常要用到Service. 在不同的進程中, 怎樣傳遞對象呢?明顯, Java中不允許跨進程內存同享.因此傳遞對象, 只能把對象拆分成操作系統能理解的簡單情勢, 以到達跨界對象訪問的目的. 在J2EE中,采取RMI的方式, 可以通過序列化傳遞對象.在Android中, 則采取AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩。

AIDL(AndRoid接口描寫語言)是1種借口描寫語言; 編譯器可以通過aidl文件生成1段代碼,通過預先定義的接口到達兩個進程內部通訊進程的目的. 如果需要在1個Activity中, 訪問另外一個Service中的某個對象, 需要先將對象轉化成AIDL可辨認的參數(多是多個參數),然后使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象.

AIDL的IPC的機制和COM或CORBA類似, 是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相干類.; 2.調用aidl產生的class.

AIDL的創建方法:

AIDL語法很簡單,可以用來聲明1個帶1個或多個方法的接口,也能夠傳遞參數和返回值。 由于遠程調用的需要, 這些參數和返回值其實不是任何類型.下面是些AIDL支持的數據類型:

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

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

3. List, Map和Parcelables類型, 這些類型內所包括的數據成員也只能是簡單數據類型, String等其他比支持的類型.

(另外: 我沒嘗試Parcelables, 在Eclipse+ADT下編譯不過, 也許以后會有所支持)

27、    請解釋下Android程序運行時權限與文件系統權限的區分。

答:運行時權限Dalvik(android授權)

文件系統 linux 內核授權

28、    系統上安裝了多種閱讀器,能否指定某閱讀器訪問指定頁面?請說明緣由。

通過直接發送Uri把參數帶過去,或通過manifest里的intentfilter里的data屬性

 

29、    android系統的優勢和不足

答:Android平臺手機 5大優勢:

1、開放性

在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android同盟中來。顯著的開放性可使其具有更多的開發者,隨著用戶和利用的日趨豐富,1個嶄新的平臺也將很快走向成熟。開放性對Android的發展而言,有益于積累人氣,這里的人氣包括消費者和廠商,而對消費者來說,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此1來,消費者將可以用更低的價位購得心儀的手機。

2、掙脫運營商的束縛

在過去很長的1段時間,特別是在歐美地區,手機利用常常遭到運營商制約,使用甚么功能接入甚么網絡,幾近都遭到運營商的控制。從去年iPhone 上市 ,用戶可以更加方便地連接網絡,運營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動網絡的逐漸過渡和提升,手機隨便接入網絡已不是運營商口中的笑談,當你可以通過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是否是像噩夢1樣?互聯網巨頭Google推動的Android終端天生就有網絡特點,將讓用戶離互聯網更近。

3、豐富的硬件選擇

這1點還是與Android平臺的開放性相干,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特點各具的多種產品。功能上的差異和特點,卻不會影響到數據同步、乃至軟件的兼容,好比你從諾基亞 Symbian風格手機 1下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟件帶到iPhone上使用、聯系人等資料更是可以方便地轉移,是否是非常方便呢?

4、不受任何限制的開發商

Android平臺提供給第3方開發商1個10分寬泛、自由的環境,不會遭到各種條條框框的阻擾,可想而知,會有多少新穎新穎的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android困難之1。

5、無縫結合的Google利用

如今叱詫互聯網的Google已走過10年度歷史,從搜索偉人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已成為連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。

再說Android的5大不足:

1、安全和隱私

由于手機 與互聯網的緊密聯系,個人隱私很難得到守舊。除上網進程中經意或不經意留下的個人足跡,Google這個偉人也時時站在你的身后,洞穿1切,因此,互聯網的深入將會帶來新1輪的隱私危機。

2、首先開賣Android手機的不是最大運營商

盡人皆知,T-Mobile在23日,于美國紐約發布 了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知獲得Android手機銷售權的唯一 T-Mobile和Sprint,其中T-Mobile的3G網絡相對其他3家也要遜色很多,因此,用戶可以買賬購買G1,能否體驗到最好的3G網絡服務則要另當別論了!

3、運營商依然能夠影響到Android手機

在國內市場,很多用戶對購得移動定制機不滿,感覺所購的手機被人涂畫了廣告1般。這樣的情況在國外市場一樣出現。Android手機的另外一發售運營商Sprint就將在其機型中內置其手機商店程序。

4、同類機型用戶減少

在很多手機論壇都會有針對某1型號的子論壇,對1款手機的使用心得交換,并分享軟件資源。而對Android平臺手機,由于廠商豐富,產品類型多樣,這樣使用同1款機型的用戶愈來愈少,缺少統1機型的程序強化。舉個稍顯不當的例子,現在山寨機泛濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除哪些功能異常搶眼、頗受追捧的機型之外。

5、過分依賴開發商缺少標準配置

在使用PC真個Windows Xp系統的時候,都會內置微軟Windows Media Player這樣1個閱讀器程序,用戶可以選擇更多樣的播放器,如Realplay或狂風影音等。但入手開始使用默許的程序一樣可以應付多樣的需要。在Android平臺中,由于其開放性,軟件更多依賴第3方廠商,比如Android系統的SDK中就沒有內置音樂 播放器,全部依賴第3方開發,缺少了產品的統1性。

30、    Android dvm的進程和Linux的進程, 利用程序的進程是不是為同1個概念

答:DVM指dalivk的虛擬機。每個Android利用程序都在它自己的進程中運行,都具有1個獨立的Dalvik虛擬機實例。而每個DVM都是在Linux 中的1個進程,所以說可以認為是同1個概念。

31、    sim卡的EF文件是甚么?有何作用

答:sim卡的文件系統有自己規范,主要是為了和手機通訊,sim本 身可以有自己的操作系統,EF就是作存儲并和手機通訊用的

32、    嵌入式操作系統內存管理有哪幾種, 各有何特性

  頁式,段式,段頁,用到了MMU,虛擬空間等技術

33、    甚么是嵌入式實時操作系統, Android 操作系統屬于實時操作系統嗎?

嵌入式實時操作系統是指當外界事件或數據產生時,能夠接受并以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產進程或對處理系統作出快速響應,并控制所有實時任務調和1致運行的嵌入式操作系統。主要用于工業控制、軍事裝備、 航空航天等領域對系統的響應時間有刻薄的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基于linux內核的,因此屬于軟實時。

34、    1條最長的短信息約占多少byte?

  中文70(包括標點),英文160,160個字節。  

36、    如何將SQLite數據庫(dictionary.db文件)與apk文件1起發布

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

37、    如何將打開res raw目錄中的數據庫文件?

解答:在Android中不能直接打開res raw目錄中的數據庫文件,而需要在程序第1次啟動時將該文件復制得手機內存或SD卡的某個目錄中,然后再打開該數據庫文件。

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

38、    DDMS和TraceView的區分?

DDMS是1個程序履行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器 。

39、    java中如何援用本地語言

可以用JNI(java native interface  java 本地接口)接口 。

40、    談談Android的IPC(進程間通訊)機制

IPC是內部進程通訊的簡稱,是同享"命名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中該機制,只適用于Activity和Service之間的通訊,類似于遠程方法調用,類似于C/S模式的訪問。通過定義AIDL接口文件來定義IPC接口。Servier端實現IPC接口,Client端調用IPC接口本地代理。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品久久久久久久久久妇女 | 波多野结衣50连精喷在线 | tube hdxxxxmovies右手影院 | 琪琪在线观看 | 成人动漫中文字幕 | 久久久久久岛国免费网站 | xh98hx国产免费 | 日本综合欧美一区二区三区 | 精品久久成人免费第三区 | 国产精品国产午夜免费福利看 | 91精品国产美女福到在线不卡 | 色一情一乱一乱91av | 国产精品福利视频一区二区三区 | 亚洲图片校园另激情类小说 | 亚洲一区影院 | 91九色偷拍 | 亚洲欧美日韩国产色另类 | 欧美另类成人 | 亚洲区欧美区 | 欧美区一区二区三 | 国产成人精品本亚洲 | 狂野欧美性猛交xxxx巴西 | 日本www高清视频 | 九色91精品国产网站 | 欧美乱人伦中文在线观看不卡 | 日本一二三四区免费视频 | 久久婷婷五月综合色丁香 | a级片在线免费看 | 亚洲综合精品一区二区三区中文 | 逼逼综合网 | xxxx中国hdxxxx| 视频一区二区精品的福利 | 伊人网网 | 国产精品嫩草影院免费看 | 日韩视频在线观看一区二区 | 国产精品毛片在线更新 | 欧美精品v欧洲高清 | 伊人精品网 | 视频一区二区三区欧美日韩 | 麻豆影视免费观看 | 欧美人与性动交α欧美精品 |