2023年Android面試整里大全_第1頁
2023年Android面試整里大全_第2頁
2023年Android面試整里大全_第3頁
2023年Android面試整里大全_第4頁
2023年Android面試整里大全_第5頁
已閱讀5頁,還剩87頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Android的四大組件是哪些,它們的作用?答:Activity:Activity是Android程序與用戶交互的窗口,是Android構(gòu)造塊中最基本的一種,它需要為保持各界面的狀態(tài),做很多持久化的事情,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯service:后臺服務(wù)于Activity,封裝有一個完整的功能邏輯實現(xiàn),接受上層指令,完畢相關(guān)的事物,定義好需要接受的Intent提供同步和異步的接口ContentProvider:是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問方案,可以派生ContentProvider類,對外提供數(shù)據(jù),可以像數(shù)據(jù)庫同樣進行選擇排序,屏蔽內(nèi)部數(shù)據(jù)的存儲細節(jié),向外提供統(tǒng)一的接口模型,大大簡化上層應(yīng)用,對數(shù)據(jù)的整合提供了更方便的途徑BroadCastReceiver:接受一種或者多種Intent作觸發(fā)事件,接受相關(guān)消息,做一些簡樸解決,轉(zhuǎn)換成一條Notificat(yī)ion,統(tǒng)一了Android的事件廣播模型請介紹下Android中常用的五種布局。常用五種布局方式,分別是:FrameLayout(框架布局),LinearLayout(線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。一、FrameLayout:所有東西依次都放在左上角,會重疊,這個布局比較簡樸,也只能放一點比較簡樸的東西。二、LinearLayout:線性布局,每一個LinearLayout里面又可分為垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal")。當垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。三、AbsoluteLayout:絕對布局用X,Y坐標來指定元素的位置,這種布局方式也比較簡樸,但是在屏幕旋轉(zhuǎn)時,往往會出問題,并且多個元素的時候,計算比較麻煩。四、Relat(yī)iveLayout:相對布局可以理解為某一個元素為參照物,來定位的布局方式。重要屬性有:相對于某一個元素android:layout_below、android:layout_toLeftOf相對于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局,每一個TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個元素。每一個布局都有自己適合的方式,這五個布局元素可以互相嵌套應(yīng)用,做出美觀的界面。android中的動畫有哪幾類,它們的特點和區(qū)別是什么答:兩種,一種是Tween動畫、尚有一種是Frame動畫。Tween動畫,這種實現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;另一種Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實現(xiàn),類似電影。android中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區(qū)別。答:XML解析重要有三種方式,SAX、DOM、PULL。常規(guī)在PC上開發(fā)我們使用Dom相對輕松些,但一些性能敏感的數(shù)據(jù)庫或手機上還是重要采用SAX方式,SAX讀取是單向的,優(yōu)點:不占內(nèi)存空間、解析屬性方便,但缺陷就是對于套嵌多個分支來說解決不是很方便。而DOM方式會把整個XML文獻加載到內(nèi)存中去,該方法在查找方面可以和XPath很好的結(jié)合假如數(shù)據(jù)量不是很大推薦使用,而PULL經(jīng)常用在J2ME對于節(jié)點解決比較好,類似SAX方式,同樣很節(jié)省內(nèi)存,在J2ME中我們經(jīng)常使用的KXML庫來解析。ListView的優(yōu)化方案答:1、假如自定義適配器,那么在getView方法中要考慮方法傳進來的參數(shù)contentView是否為null,假如為null就創(chuàng)建contentView并返回,假如不為null則直接使用。在這個方法中盡也許少創(chuàng)建view。2、給contentView設(shè)立tag(setTag()),傳入一個viewHolder對象,用于緩存要顯示的數(shù)據(jù),可以達成圖像數(shù)據(jù)異步加載的效果。3、假如listview需要顯示的item很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。請介紹下Android的數(shù)據(jù)存儲方式。答:使用SharedPreferences存儲數(shù)據(jù);文獻存儲數(shù)據(jù);SQLite數(shù)據(jù)庫存儲數(shù)據(jù);使用ContentProvider存儲數(shù)據(jù);網(wǎng)絡(luò)存儲數(shù)據(jù);Preference,File,DataBase這三種方式分別相應(yīng)的目錄是/data/data/PackageName/Shared_Pref,/data/data/PackageName/files,/data/data/PackageName/database。一:使用SharedPreferences存儲數(shù)據(jù)一方面說明SharedPreferences存儲方式,它是Android提供的用來存儲一些簡樸配置信息的一種機制,例如:登錄用戶的用戶名與密碼。其采用了Map數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),以鍵值的方式存儲,可以簡樸的讀取與寫入,具體實例如下:voidReadSharedPreferences(){StringstrName,strPassword;SharedPreferencesuser=getSharedPreferences(“user_info”,0);strName=user.getString(“NAME”,””);strPassword=usergetString(“PASSWORD”,””);}voidWriteSharedPreferences(StringstrName,StringstrPassword){SharedPreferencesuser=getSharedPreferences(“user_info”,0);uer.edit();user.putString(“NAME”,strName);user.putString(“PASSWORD”,strPassword);user.commit();}數(shù)據(jù)讀取與寫入的方法都非常簡樸,只是在寫入的時候有些區(qū)別:先調(diào)用edit()使其處在編輯狀態(tài),然后才干修改數(shù)據(jù),最后使用commit()提交修改的數(shù)據(jù)。事實上SharedPreferences是采用了XML格式將數(shù)據(jù)存儲到設(shè)備中,在DDMS中的FileExplorer中的/data/dat(yī)a/<packagename>/shares_prefs下。使用SharedPreferences是有些限制的:只能在同一個包內(nèi)使用,不能在不同的包之間使用。二:文獻存儲數(shù)據(jù)文獻存儲方式是一種較常用的方法,在Android中讀取/寫入文獻的方法,與Java中實現(xiàn)I/O的程序是完全同樣的,提供了openFileInput()和openFileOutput()方法來讀取設(shè)備上的文獻。具體實例如下:Stringfn=“moandroid.log”;FileInputStreamfis=openFileInput(fn);FileOutputStreamfos=openFileOutput(fn,Context.MODE_PRIVATE);三:網(wǎng)絡(luò)存儲數(shù)據(jù)網(wǎng)絡(luò)存儲方式,需要與Android網(wǎng)絡(luò)數(shù)據(jù)包打交道,關(guān)于Android網(wǎng)絡(luò)數(shù)據(jù)包的具體說明,請閱讀AndroidSDK引用了JavaSDK的哪些package?。四:ContentProvider1、ContentProvider簡介當應(yīng)用繼承ContentProvider類,并重寫該類用于提供數(shù)據(jù)和存儲數(shù)據(jù)的方法,就可以向其他應(yīng)用共享其數(shù)據(jù)。雖然使用其他方法也可以對外共享數(shù)據(jù),但數(shù)據(jù)訪問方式會因數(shù)據(jù)存儲的方式而不同,如:采用文獻方式對外共享數(shù)據(jù),需要進行文獻操作讀寫數(shù)據(jù);采用sharedpreferences共享數(shù)據(jù),需要使用sharedpreferencesAPI讀寫數(shù)據(jù)。而使用ContentProvider共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)訪問方式。2、Uri類簡介Uri代表了要操作的數(shù)據(jù),Uri重要包含了兩部分信息:1.需要操作的ContentProvider,2.對ContentProvider中的什么數(shù)據(jù)進行操作,一個Uri由以下幾部分組成:1.scheme:ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定為:content://…2.主機名(或Authority):用于唯一標記這個ContentProvider,外部調(diào)用者可以根據(jù)這個標記來找到它。3.途徑(path):可以用來表達我們要操作的數(shù)據(jù),途徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定,如下:要操作contact表中id為10的記錄,可以構(gòu)建這樣的途徑:/contact/10要操作contact表中id為10的記錄的name字段,contact/10/name要操作contact表中的所有記錄,可以構(gòu)建這樣的途徑:/contact?要操作的數(shù)據(jù)不一定來自數(shù)據(jù)庫,也可以是文獻等他存儲方式,如下:要操作xml文獻中contact節(jié)點下的name節(jié)點,可以構(gòu)建這樣的途徑:/contact/name假如要把一個字符串轉(zhuǎn)換成Uri,可以使用Uri類中的parse()方法,如下:Uriuri=Uri.parse("content://com.changcheng.provider.contactprovider/contact")3、UriMatcher、ContentUrist和ContentResolver簡介由于Uri代表了要操作的數(shù)據(jù),所以我們很經(jīng)常需要解析Uri,并從Uri中獲取數(shù)據(jù)。Android系統(tǒng)提供了兩個用于操作Uri的工具類,分別為UriMat(yī)cher和ContentUris。掌握它們的使用,會便于我們的開發(fā)工作。UriMatcher:用于匹配Uri,它的用法如下:1.一方面把你需要匹配Uri途徑所有給注冊上,如下://常量UriMatcher.NO_MATCH表達不匹配任何途徑的返回碼(-1)。UriMatcheruriMatcher=newUriMat(yī)cher(UriMatcher.NO_MATCH);//假如match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact途徑,返回匹配碼為1uriMat(yī)cher.addURI(“com.changcheng.sqlite.provider.contactprovider”,“contact”,1);//添加需要匹配uri,假如匹配就會返回匹配碼//假如match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact/230途徑,返回匹配碼為2uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”,“contact/#”,2);//#號為通配符2.注冊完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,假如匹配就返回匹配碼,匹配碼是調(diào)用addURI()方法傳入的第三個參數(shù),假設(shè)匹配content://com.changcheng.sqlite.provider.contactprovider/contact途徑,返回的匹配碼為1。ContentUris:用于獲?。誶i途徑后面的ID部分,它有兩個比較實用的方法:withAppendedId(uri,id)用于為途徑加上ID部分parseId(uri)方法用于從途徑中獲取ID部分ContentResolver:當外部應(yīng)用需要對ContentProvider中的數(shù)據(jù)進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完畢,要獲取ContentResolver對象,可以使用Activity提供的getContentResolver()方法。ContentResolver使用insert、delete、update、query方法,來操作數(shù)據(jù)。activity的啟動模式有哪些?是什么含義?答:在android里,有4種activity的啟動模式,分別為:“standard”(默認)“singleTop”“singleTask”“singleInstance”它們重要有如下不同:1.如何決定所屬task“standard”和”singleTop”的activity的目的task,和收到的Intent的發(fā)送者在同一個task內(nèi),除非intent涉及參數(shù)FLAG_ACTIVITY_NEW_TASK。假如提供了FLAG_ACTIVITY_NEW_TASK參數(shù),會啟動到別的task里?!皊ingleTask”和”singleInstance”總是把activity作為一個task的根元素,他們不會被啟動到一個其他task里。2.是否允許多個實例“standard”和”singleTop”可以被實例化多次,并且存在于不同的task中,且一個task可以涉及一個activity的多個實例;“singleTask”和”singleInstance”則限制只生成一個實例,并且是task的根元素。singleTop規(guī)定假如創(chuàng)建intent的時候棧頂已有要創(chuàng)建的Activity的實例,則將intent發(fā)送給該實例,而不發(fā)送給新的實例。3.是否允許其它activity存在于本task內(nèi)“singleInstance”獨占一個task,其它activity不能存在那個task里;假如它啟動了一個新的activity,不管新的activity的launchmode如何,新的activity都將會到別的task里運營(如同加了FLAG_ACTIVITY_NEW_TASK參數(shù))。而此外三種模式,則可以和其它activity共存。4.是否每次都生成新實例“standard”對于沒一個啟動Intent都會生成一個activity的新實例;“singleTop”的activity假如在task的棧頂?shù)脑?,則不生成新的該activity的實例,直接使用棧頂?shù)膶嵗?,否則,生成該activity的實例。比如現(xiàn)在task棧元素為A-B-C-D(D在棧頂),這時候給D發(fā)一個啟動intent,假如D是“standard”的,則生成D的一個新實例,棧變?yōu)锳-B-C-D-D。假如D是singleTop的話,則不會生產(chǎn)D的新實例,棧狀態(tài)仍為A-B-C-D假如這時候給B發(fā)Intent的話,不管B的launchmode是”standard”還是“singleTop”,都會生成B的新實例,棧狀態(tài)變?yōu)锳-B-C-D-B?!皊ingleInstance”是其所在棧的唯一activity,它會每次都被重用?!皊ingleTask”假如在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前臺。當已經(jīng)存在的activity實例解決新的intent時候,會調(diào)用onNewIntent()方法假如收到intent生成一個activity實例,那么用戶可以通過back鍵回到上一個狀態(tài);假如是已經(jīng)存在的一個activity來解決這個intent的話,用戶不能通過按back鍵返回到這之前的狀態(tài)。跟activity和Task有關(guān)的Intent啟動方式有哪些?其含義?核心的IntentFlag有:FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_RESET_TASK_IF_NEEDEDFLAG_ACTIVITY_SINGLE_TOPFLAG_ACTIVITY_NEW_TASK假如設(shè)立,這個Activity會成為歷史stack中一個新Task的開始。一個Task(從啟動它的Activity到下一個Task中的Activity)定義了用戶可以遷移的Activity原子組。Task可以移動到前臺和后臺;在某個特定Task中的所有Activity總是保持相同的順序。這個標志一般用于呈現(xiàn)“啟動”類型的行為:它們提供用戶一系列可以單獨完畢的事情,與啟動它們的Activity完全無關(guān)。使用這個標志,假如正在啟動的Activity的Task已經(jīng)在運營的話,那么,新的Activity將不會啟動;代替的,當前Task會簡樸的移入前臺。參考FLAG_ACTIVITY_MULTIPLE_TASK標志,可以禁用這一行為。這個標志不能用于調(diào)用方對已經(jīng)啟動的Activity請求結(jié)果。FLAG_ACTIVITY_CLEAR_TOP?

假如設(shè)立,并且這個Activity已經(jīng)在當前的Task中運營,因此,不再是重新啟動一個這個Activity的實例,而是在這個Activity上方的所有Activity都將關(guān)閉,然后這個Intent會作為一個新的Intent投遞到老的Activity(現(xiàn)在位于頂端)中。

例如,假設(shè)一個Task中包含這些Activity:A,B,C,D。假如D調(diào)用了startActivity(),并且包含一個指向ActivityB的Intent,那么,C和D都將結(jié)束,然后B接受到這個Intent,因此,目前stack的狀況是:A,B。

上例中正在運營的ActivityB既可以在onNewIntent()中接受到這個新的Intent,也可以把自己關(guān)閉然后重新啟動來接受這個Intent。假如它的啟動模式聲明為“multiple”(默認值),并且你沒有在這個Intent中設(shè)立FLAG_ACTIVITY_SINGLE_TOP標志,那么它將關(guān)閉然后重新創(chuàng)建;對于其它的啟動模式,或者在這個Intent中設(shè)立FLAG_ACTIVITY_SINGLE_TO(shè)P標志,都將把這個Intent投遞到當前這個實例的onNewIntent()中。?

這個啟動模式還可以與FLAG_ACTIVITY_NEW_TASK結(jié)合起來使用:用于啟動一個Task中的根Activity,它會把那個Task中任何運營的實例帶入前臺,然后清除它直到根Activity。這非常有用,例如,當從NotificationManager處啟動一個Activity。FLAG_ACTIVITY_RESET_TASK_IF_NEEDED假如設(shè)立這個標志,這個activity不管是從一個新的棧啟動還是從已有棧推到棧頂,它都將以thefrontdoorofthetask的方式啟動。這就講導(dǎo)致任何與應(yīng)用相關(guān)的棧都講重置到正常狀態(tài)(不管是正在講activity移入還是移除),假如需要,或者直接重置該棧為初始狀態(tài)。FLAG_ACTIVITY_SINGLE_TOP

假如設(shè)立,當這個Activity位于歷史stack的頂端運營時,不再啟動一個新的FLAG_ACTIVITY_BROUGHT_TO_FRONT?

這個標志一般不是由程序代碼設(shè)立的,如在launchMode中設(shè)立singleTask模式時系統(tǒng)幫你設(shè)定。FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

假如設(shè)立,這將在Task的Activitystack中設(shè)立一個還原點,當Task恢復(fù)時,需要清理Activity。也就是說,下一次Task帶著FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標記進入前臺時(典型的操作是用戶在主畫面重啟它),這個Activity和它之上的都將關(guān)閉,以至于用戶不能再返回到它們,但是可以回到之前的Activity。?

這在你的程序有分割點的時候很有用。例如,一個e-mail應(yīng)用程序也許有一個操作是查看一個附件,需要啟動圖片瀏覽Activity來顯示。這個Activity應(yīng)當作為e-mail應(yīng)用程序Task的一部分,由于這是用戶在這個Task中觸發(fā)的操作。然而,當用戶離開這個Task,然后從主畫面選擇e-mailapp,我們也許希望回到查看的會話中,但不是查看圖片附件,由于這讓人困惑。通過在啟動圖片瀏覽時設(shè)定這個標志,瀏覽及其它啟動的Activity在下次用戶返回到mail程序時都將所有清除。FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS?

假如設(shè)立,新的Activity不會在最近啟動的Activity的列表中保存。FLAG_ACTIVITY_FORWARD_RESULT

假如設(shè)立,并且這個Intent用于從一個存在的Activity啟動一個新的Activity,那么,這個作為答復(fù)目的的Activity將會傳到這個新的Activity中。這種方式下,新的Activity可以調(diào)用setResult(int),并且這個結(jié)果值將發(fā)送給那個作為答復(fù)目的的Activity。FLAG_ACTIVITY_LAUNCHED_FROM_HISTO(shè)RY?

這個標志一般不由應(yīng)用程序代碼設(shè)立,假如這個Activity是從歷史記錄里啟動的(常按HOME鍵),那么,系統(tǒng)會幫你設(shè)定。FLAG_ACTIVITY_MULTIPLE_TASK

不要使用這個標志,除非你自己實現(xiàn)了應(yīng)用程序啟動器。與FLAG_ACTIVITY_NEW_TASK結(jié)合起來使用,可以禁用把已存的Task送入前臺的行為。當設(shè)立時,新的Task總是會啟動來解決Intent,而不管這是是否已有一個Task可以解決相同的事情。?

由于默認的系統(tǒng)不包含圖形Task管理功能,因此,你不應(yīng)當使用這個標志,除非你提供應(yīng)用戶一種方式可以返回到已經(jīng)啟動的Task。?

假如FLAG_ACTIVITY_NEW_TASK標志沒有設(shè)立,這個標志被忽略。FLAG_ACTIVITY_NO_ANIMATION?

假如在Intent中設(shè)立,并傳遞給Context.startActivity()的話,這個標志將阻止系統(tǒng)進入下一個Activity時應(yīng)用Acitivity遷移動畫。這并不意味著動畫將永不運營——假如另一個Activity在啟動顯示之前,沒有指定這個標志,那么,動畫將被應(yīng)用。這個標志可以很好的用于執(zhí)行一連串的操作,而動畫被看作是更高一級的事件的驅(qū)動。FLAG_ACTIVITY_NO_HISTORY?

假如設(shè)立,新的Activity將不再歷史stack中保存。用戶一離開它,這個Activity就關(guān)閉了。這也可以通過設(shè)立noHistory特性。FLAG_ACTIVITY_NO_USER_ACTION?

假如設(shè)立,作為新啟動的Activity進入前臺時,這個標志將在Activity暫停之前阻止從最前方的Activity回調(diào)的onUserLeaveHint()。?

典型的,一個Activity可以依賴這個回調(diào)指明顯式的用戶動作引起的Activity移出后臺。這個回調(diào)在Activity的生命周期中標記一個合適的點,并關(guān)閉一些Notification。?

假如一個Activity通過非用戶驅(qū)動的事件,如來電或鬧鐘,啟動的,這個標志也應(yīng)當傳遞給Context.startActivity,保證暫停的Activity不認為用戶已經(jīng)知曉其Notification。FLAG_ACTIVITY_PREVIOUS_IS_TOP

Ifsetandthisintentisbeingusedtolaunchanewactivityfromanexistingone,thecurrentactivitywillnotbecountedasthetopactivityfordecidingwhetherthenewintentshouldbedeliveredtothetopinsteadofstartinganewone.Thepreviousactivitywillbeusedasthetop,withtheassumptionbeingthat(yī)thecurrentactivitywillfinishitselfimmediately.FLAG_ACTIVITY_REORDER_TO_FRONT

假如在Intent中設(shè)立,并傳遞給Context.startActivity(),這個標志將引發(fā)已經(jīng)運營的Activity移動到歷史stack的頂端。?

例如,假設(shè)一個Task由四個Activity組成:A,B,C,D。假如D調(diào)用startActivity()來啟動ActivityB,那么,B會移動到歷史stack的頂端,現(xiàn)在的順序變成A,C,D,B。假如FLAG_ACTIVITY_CLEAR_TO(shè)P標志也設(shè)立的話,那么這個標志將被忽略。請描述下Activity的生命周期。答:activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();可見生命周期:從onStart()直到系統(tǒng)調(diào)用onStop()前臺生命周期:從onResume()直到系統(tǒng)調(diào)用onPause()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類publicclassSMSServiceextendsService{}第二步:在AndroidManifest.xml文獻中的<application>節(jié)點里對服務(wù)進行配置:<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ù)的onCreat(yī)e()方法,接著調(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ù)及綁定(也就是說onCreat(yī)e()和onBind()方法并不會被多次調(diào)用)。假如調(diào)用者希望與正在綁定的服務(wù)解除綁定,可以調(diào)用unbindService()方法,調(diào)用該方法也會導(dǎo)致系統(tǒng)調(diào)用服務(wù)的onUnbind()-->onDestroy()方法。服務(wù)常用生命周期回調(diào)方法如下:onCreat(yī)e()該方法在服務(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)用,當調(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引入廣播機制的用意。答:一方面寫一個類要繼承BroadcastReceiver第一種:在清單文獻中聲明,添加<receiveandroid:name=".IncomingSMSReceiver"><intent-filter><actionandroid:name="androvider.Telephony.SMS_RECEIVED")<intent-filter><receiver>第二種使用代碼進行注冊如:IntentFilterfilter=newIntentFilter("android.provider.Telephony.SMS_RECEIVED");IncomingSMSReceiverreceiver=newIncomgSMSReceiver();registerReceiver(receiver.filter);兩種注冊類型的區(qū)別是:1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。2)第二種是常駐型,也就是說當應(yīng)用程序關(guān)閉后,假如有信息廣播來,程序也會被系統(tǒng)調(diào)用自動運營。請解釋下在單線程模型中Message、Handler、MessageQueue、Looper之間的關(guān)系。答:簡樸的說,Handler獲取當前線程中的looper對象,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發(fā)和解決.MessageQueue(消息隊列):用來存放通過Handler發(fā)布的消息,通常附屬于某一個創(chuàng)建它的線程,可以通過Looper.myQueue()得到當前線程的消息隊列Handler:可以發(fā)布或者解決一個消息或者操作一個Runnable,通過Handler發(fā)布消息,消息將只會發(fā)送到與它關(guān)聯(lián)的消息隊列,然也只能解決該消息隊列中的消息Looper:是Handler和消息隊列之間通訊橋梁,程序組件一方面通過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列里的消息廣播給所有的Handler:Handler接受到消息后調(diào)用handleMessage進行解決Message:消息的類型,在Handler類中的handleMessage方法中得到單個的消息進行解決在單線程模型下,為了線程通信問題,Android設(shè)計了一個MessageQueue(消息隊列),線程間可以通過該MessageQueue并結(jié)合Handler和Looper組件進行信息互換。下面將對它們進行分別介紹:1.MessageMessage消息,理解為線程間交流的信息,解決數(shù)據(jù)后臺線程需要更新UI,則發(fā)送Message內(nèi)含一些數(shù)據(jù)給UI線程。2.HandlerHandler解決者,是Message的重要解決者,負責Message的發(fā)送,Message內(nèi)容的執(zhí)行解決。后臺線程就是通過傳進來的Handler對象引用來sendMessage(Message)。而使用Handler,需要implement該類的handleMessage(Message)方法,它是解決這些Message的操作內(nèi)容,例如Updat(yī)eUI。通常需要子類化Handler來實現(xiàn)handleMessage方法。3.MessageQueueMessageQueue消息隊列,用來存放通過Handler發(fā)布的消息,按照先進先出執(zhí)行。每個messagequeue都會有一個相應(yīng)的Handler。Handler會向messagequeue通過兩種方法發(fā)送消息:sendMessage或post。這兩種消息都會插在messagequeue隊尾并按先進先出執(zhí)行。但通過這兩種方法發(fā)送的消息執(zhí)行的方式略有不同:通過sendMessage發(fā)送的是一個message對象,會被Handler的handleMessage()函數(shù)解決;而通過post方法發(fā)送的是一個runnable對象,則會自己執(zhí)行。4.LooperLooper是每條線程里的MessageQueue的管家。Android沒有Global的MessageQueue,而Android會自動替主線程(UI線程)建立MessageQueue,但在子線程里并沒有建立MessageQueue。所以調(diào)用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調(diào)用Looper.myLooper()得到當前線程的Looper就有也許為NULL。對于子線程使用Looper,APIDoc提供了對的的使用方法:這個Message機制的大約流程:1.在Looper.loop()方法運營開始后,循環(huán)地按照接受順序取出MessageQueue里面的非NULL的Message。2.一開始MessageQueue里面的Message都是NULL的。當Handler.sendMessage(Message)到MessageQueue,該函數(shù)里面設(shè)立了那個Message對象的target屬性是當前的Handler?qū)ο蟆kS后Looper取出了那個Message,則調(diào)用該Message的target指向的Hander的dispatchMessage函數(shù)對Message進行解決。在dispatchMessage方法里,如何解決Message則由用戶指定,三個判斷,優(yōu)先級從高到低:1)Message里面的Callback,一個實現(xiàn)了Runnable接口的對象,其中run函數(shù)做解決工作;2)Handler里面的mCallback指向的一個實現(xiàn)了Callback接口的對象,由其handleMessage進行解決;3)解決消息Handler對象相應(yīng)的類繼承并實現(xiàn)了其中handleMessage函數(shù),通過這個實現(xiàn)的handleMessage函數(shù)解決消息。由此可見,我們實現(xiàn)的handleMessage方法是優(yōu)先級最低的!3.Handler解決完該Message(updateUI)后,Looper則設(shè)立該Message為NULL,以便回收!在網(wǎng)上有很多文章講述主線程和其他子線程如何交互,傳送信息,最終誰來執(zhí)行解決信息之類的,個人理解是最簡樸的方法——判斷Handler對象里面的Looper對象是屬于哪條線程的,則由該線程來執(zhí)行!1.當Handler對象的構(gòu)造函數(shù)的參數(shù)為空,則為當前所在線程的Looper;2.Looper.getMainLooper()得到的是主線程的Looper對象,Looper.myLooper()得到的是當前線程的Looper對象。簡要解釋一下activity、intent、intentfilter、service、Broadcase、BroadcaseReceiver答:一個activity呈現(xiàn)了一個用戶可以操作的可視化用戶界面;一個service不包含可見的用戶界面,而是在后臺運營,可以與一個activity綁定,通過綁定暴露出來接口并與其進行通信;一個broadcastreceiver是一個接受廣播消息并做出回應(yīng)的component,broadcastreceiver沒有界面;一個intent是一個Intent對象,它保存了消息的內(nèi)容。對于activity和service來說,它指定了請求的操作名稱和待操作數(shù)據(jù)的URI,Intent對象可以顯式的指定一個目的component。假如這樣的話,android會找到這個component(基于manifest文獻中的聲明)并激活它。但假如一個目的不是顯式指定的,android必須找到響應(yīng)intent的最佳component。它是通過將Intent對象和目的的intentfilter相比較來完畢這一工作的;一個component的intentfilter告訴android該component能解決的intent。intentfilter也是在manifest文獻中聲明的。說說mvc模式的原理,它在android中的運用,android的官方建議應(yīng)用程序的開發(fā)采用mvc模式。何謂mvc?mvc是model,view,controller的縮寫,mvc包含三個部分:模型(model)對象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)當寫在該層。視圖(view)對象:是應(yīng)用程序中負責生成用戶界面的部分。也是在整個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文獻進行界面的描述,使用的時候可以非常方便的引入,當然,假如你對android了解的比較的多了話,就一定可以想到在android中也可以使用javascript+html等的方式作為view層,當然這里需要進行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里面解決,當然對業(yè)務(wù)計算等操作也是必須放在的該層的。什么是ANR如何避免它?答:ANR:ApplicationNotResponding。在Android中,活動管理器和窗口管理器這兩個系統(tǒng)服務(wù)負責監(jiān)視應(yīng)用程序的響應(yīng),當用戶操作的在5s內(nèi)應(yīng)用程序沒能做出反映,BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢,就會出現(xiàn)應(yīng)用程序無響應(yīng)對話框,這既是ANR。避免方法:Activity應(yīng)當在它的關(guān)鍵生命周期方法(如onCreate()和onResume())里盡也許少的去做創(chuàng)建操作。潛在的耗時操作,例如網(wǎng)絡(luò)或數(shù)據(jù)庫操作,或者高耗時的計算如改變位圖尺寸,應(yīng)當在子線程里(或者異步方式)來完畢。主線程應(yīng)當為子線程提供一個Handler,以便完畢時可以提交給主線程。什么情況會導(dǎo)致ForceClose?如何避免?能否捕獲導(dǎo)致其的異常?答:程序出現(xiàn)異常,比如nullpointer。避免:編寫程序時邏輯連貫,思維縝密。能捕獲異常,在logcat(yī)中能看到異常信息描述一下android的系統(tǒng)架構(gòu)android系統(tǒng)架構(gòu)分從下往上為linux內(nèi)核層、運營庫、應(yīng)用程序框架層、和應(yīng)用程序?qū)?。linuxkernel:負責硬件的驅(qū)動程序、網(wǎng)絡(luò)、電源、系統(tǒng)安全以及內(nèi)存管理等功能。libraries和androidruntime:libraries:即c/c++函數(shù)庫部分,大多數(shù)都是開放源代碼的函數(shù)庫,例如webkit(引擎),該函數(shù)庫負責android網(wǎng)頁瀏覽器的運營,例如標準的c函數(shù)庫libc、openssl、sqlite等,當然也涉及支持游戲開發(fā)2dsgl和3dopengles,在多媒體方面有mediaframework框架來支持各種影音和圖形文獻的播放與顯示,例如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體文獻格式。android的runtime負責解釋和執(zhí)行生成的dalvik格式的字節(jié)碼。applicationframework(應(yīng)用軟件架構(gòu)),java應(yīng)用程序開發(fā)人員重要是使用該層封裝好的api進行快速開發(fā)。applications:該層是java的應(yīng)用程序?qū)?android內(nèi)置的googlemaps、e-mail、即時通信工具、瀏覽器、mp3播放器等處在該層,java開發(fā)人員開發(fā)的程序也處在該層,并且和內(nèi)置的應(yīng)用程序具有平等的位置,可以調(diào)用內(nèi)置的應(yīng)用程序,也可以替換內(nèi)置的應(yīng)用程序。上面的四個層次,下層為上層服務(wù),上層需要下層的支持,調(diào)用下層的服務(wù),這種嚴格分層的方式帶來的極大的穩(wěn)定性、靈活性和可擴展性,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)。android應(yīng)用程序使用框架的api并在框架下運營,這就帶來了程序開發(fā)的高度一致性,另一方面也告訴我們,要想寫出優(yōu)質(zhì)高效的程序就必須對整個applicat(yī)ionframework進行非常進一步的理解。精通applicationframework,你就可以真正的理解android的設(shè)計和運營機制,也就更可以駕馭整個應(yīng)用層的開發(fā)。請介紹下ContentProvider是如何實現(xiàn)數(shù)據(jù)共享的。一個程序可以通過實現(xiàn)一個Contentprovider的抽象接口將自己的數(shù)據(jù)完全暴露出去,并且Contentproviders是以類似數(shù)據(jù)庫中表的方式將數(shù)據(jù)暴露。Contentproviders存儲和檢索數(shù)據(jù),通過它可以讓所有的應(yīng)用程序訪問到,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法。要想使應(yīng)用程序的數(shù)據(jù)公開化,可通過2種方法:創(chuàng)建一個屬于你自己的Contentprovider或者將你的數(shù)據(jù)添加到一個已經(jīng)存在的Contentprovider中,前提是有相同數(shù)據(jù)類型并且有寫入Contentprovider的權(quán)限。如何通過一套標準及統(tǒng)一的接口獲取其他應(yīng)用程序暴露的數(shù)據(jù)? Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數(shù)據(jù)。Service和Thread的區(qū)別?答:servie是系統(tǒng)的組件,它由系統(tǒng)進程托管(servicemanager);它們之間的通信類似于client和server,是一種輕量級的ipc通信,這種通信的載體是binder,它是在linux層互換信息的一種ipc。而thread是由本應(yīng)用程序托管。

1).Thread:Thread是程序執(zhí)行的最小單元,它是分派CPU的基本單位??梢杂肨hread來執(zhí)行一些異步的操作。2).Service:Service是android的一種機制,當它運營的時候假如是LocalService,那么相應(yīng)的Service是運營在主進程的main線程上的。如:onCreat(yī)e,onStart這些函數(shù)在被系統(tǒng)調(diào)用的時候都是在主進程的main線程上運營的。假如是Remote

Service,那么相應(yīng)的Service則是運營在獨立進程的main線程上。既然這樣,那么我們?yōu)槭裁匆肧ervice呢?其實這跟android的系統(tǒng)機制有關(guān),我們先拿Thread來說。Thread的運營是獨立于Activity的,也就是說當一個Activity被finish之后,假如你沒有積極停止Thread

或者Thread里的

run方法沒有執(zhí)行完畢的話,Thread

也會一直執(zhí)行。因此這里會出現(xiàn)一個問題:當Activity被finish之后,你不再持有該Thread的引用。另一方面,你沒有辦法在不同的Activity中對同一Thread進行控制。

舉個例子:假如你的Thread需要不斷地隔一段時間就要連接服務(wù)器做某種同步的話,該Thread

需要在Activity沒有start的時候也在運營。這個時候當你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來控制它,當然這些都是Thread做不到的。Android自身的api并未聲明會拋出異常,則其在運營時有無也許拋出runtime異常,你碰到過嗎?諾有的話會導(dǎo)致什么問題?如何解決?答:會,比如nullpointerException。我碰到過,比如textview.setText()時,textview沒有初始化。會導(dǎo)致程序無法正常運營出現(xiàn)forceclose。打開控制臺查看logcat信息找出異常信息并修改程序。IntentService有何優(yōu)點?答:Acitivity的進程,當解決Intent的時候,會產(chǎn)生一個相應(yīng)的Service;Android的進程解決器現(xiàn)在會盡也許的不kill掉你;非常容易使用假如后臺的Activity由于某因素被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當前狀態(tài)?答:重寫onSaveInstanceState()方法,在此方法中保存需要保存的數(shù)據(jù),該方法將會在activity被回收之前調(diào)用。通過重寫onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)如何將一個Activity設(shè)立成窗口的樣式。答:<activity>中配置:android

:theme="@android:style/Theme.Dialog"

此外android:theme="@android:style/Theme.Translucent"

是設(shè)立透明如何退出Activity?如何安全退出已調(diào)用多個Activity的Application?答:對于單一Activity的應(yīng)用來說,退出很簡樸,直接finish()即可。當然,也可以用killProcess()和System.exit()這樣的方法。對于多個activity,1、記錄打開的Activity:每打開一個Activity,就記錄下來。在需要退出時,關(guān)閉每一個Activity即可。2、發(fā)送特定廣播:在需要結(jié)束應(yīng)用時,發(fā)送一個特定的廣播,每個Activity收到廣播后,關(guān)閉即可。3、遞歸退出:在打開新的Activity時使用startActivityForResult,然后自己加標志,在onActivityResult中解決,遞歸關(guān)閉。為了編程方便,最佳定義一個Activity基類,解決這些共通問題。在2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接結(jié)束整個應(yīng)用。在使用時需要權(quán)限android.permission.RESTART_PACKAGES。注意不要被它的名字迷惑??墒?在2.2,這個方法失效了。在2.2添加了一個新的方法,killBackgroundProcesses(),需要權(quán)限android.permission.KILL_BACKGROUND_PROCESSES??上У氖?,它和2.2的restartPackage同樣,主線起不到應(yīng)有的效果。此外尚有一個方法,就是系統(tǒng)自帶的應(yīng)用程序管理里,強制結(jié)束程序的方法,forceStopPackage()。它需要權(quán)限android.permission.FORCE_STO(shè)P_PACKAGES。并且需要添加android:sharedUserId="android.uid.system"屬性。同樣可惜的是,該方法是非公開的,他只能運營在系統(tǒng)進程,第三方程序無法調(diào)用。由于需要在Android.mk中添加LOCAL_CERTIFICATE:=plat(yī)form。而Android.mk是用于在Android源碼下編譯程序用的。從以上可以看出,在2.2,沒有辦法直接結(jié)束一個應(yīng)用,而只能用自己的辦法間接辦到?,F(xiàn)提供幾個方法,供參考:1、拋異常強制退出:該方法通過拋異常,使程序ForceClose。驗證可以,但是,需要解決的問題是,如何使程序結(jié)束掉,而不彈出ForceClose的窗口。2、記錄打開的Activity:每打開一個Activity,就記錄下來。在需要退出時,關(guān)閉每一個Activity即可。3、發(fā)送特定廣播:在需要結(jié)束應(yīng)用時,發(fā)送一個特定的廣播,每個Activity收到廣播后,關(guān)閉即可。4、遞歸退出在打開新的Activity時使用startActivityForResult,然后自己加標志,在onA(yù)ctivityResult中解決,遞歸關(guān)閉。除了第一個,都是想辦法把每一個Activity都結(jié)束掉,間接達成目的。但是這樣做同樣不完美。你會發(fā)現(xiàn),假如自己的應(yīng)用程序?qū)γ恳粋€Activity都設(shè)立了nosensor,在兩個Activity結(jié)束的間隙,sensor也許有效了。但至少,我們的目的達成了,并且沒有影響用戶使用。為了編程方便,最佳定義一個Activity基類,解決這些共通問題。AIDL的全稱是什么?如何工作?能解決哪些類型的數(shù)據(jù)?答:全稱是:AndroidInterfaceDefineLanguage在Android中,每個應(yīng)用程序都可以有自己的進程.在寫UI應(yīng)用的時候,經(jīng)常要用到Service.在不同的進程中,如何傳遞對象呢?顯然,Java中不允許跨進程內(nèi)存共享.因此傳遞對象,只能把對象拆提成操作系統(tǒng)能理解的簡樸形式,以達成跨界對象訪問的目的.在J2EE中,采用RMI的方式,可以通過序列化傳遞對象.在Android中,則采用AIDL的方式.理論上AIDL可以傳遞Bundle,事實上做起來卻比較麻煩。AIDL(AndRoid接口描述語言)是一種借口描述語言;編譯器可以通過aidl文獻生成一段代碼,通過預(yù)先定義的接口達成兩個進程內(nèi)部通信進程的目的.假如需要在一個Activity中,訪問另一個Service中的某個對象,需要先將對象轉(zhuǎn)化成AIDL可辨認的參數(shù)(也許是多個參數(shù)),然后使用AIDL來傳遞這些參數(shù),在消息的接受端,使用這些參數(shù)組裝成自己需要的對象.AIDL的IPC的機制和COM或CORBA類似,是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現(xiàn)層間傳遞值.假如要使用AIDL,需要完畢2件事情:1.引入AIDL的相關(guān)類.;2.調(diào)用aidl產(chǎn)生的class.AIDL的創(chuàng)建方法:AIDL語法很簡樸,可以用來聲明一個帶一個或多個方法的接口,也可以傳遞參數(shù)和返回值。由于遠程調(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等其他比支持的類型.(此外:我沒嘗試Parcelables,在Eclipse+ADT下編譯但是,或許以后會有所支持)請解釋下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里的dat(yī)a屬性android系統(tǒng)的優(yōu)勢和局限性答:Android平臺手機5大優(yōu)勢:一、開放性在優(yōu)勢方面,Android平臺一方面就是其開發(fā)性,開發(fā)的平臺允許任何移動終端廠商加入到Android聯(lián)盟中來。顯著的開放性可以使其擁有更多的開發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個嶄新的平臺也將不久走向成熟。開放性對于Android的發(fā)展而言,有助于積累人氣,這里的人氣涉及消費者和廠商,而對于消費者來講,隨大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。二、掙脫運營商的束縛在過去很長的一段時間,特別是在歐美地區(qū),手機應(yīng)用往往受到運營商制約,使用什么功能接入什么網(wǎng)絡(luò),幾乎都受到運營商的控制。從去年iPhone上市,用戶可以更加方便地連接網(wǎng)絡(luò),運營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動網(wǎng)絡(luò)的逐步過渡和提高,手機隨意接入網(wǎng)絡(luò)已不是運營商口中的笑談,當你可以通過手機IM軟件方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業(yè)務(wù),是不是像惡夢同樣?互聯(lián)網(wǎng)巨頭Google推動的Android終端天生就有網(wǎng)絡(luò)特色,將讓用戶離互聯(lián)網(wǎng)更近。三、豐富的硬件選擇這一點還是與Android平臺的開放性相關(guān),由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產(chǎn)品。功能上的差異和特色,卻不會影響到數(shù)據(jù)同步、甚至軟件的兼容,好比你從諾基亞Symbian風(fēng)格手機一下改用蘋果iPhone,同時還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移,是不是非常方便呢?四、不受任何限制的開發(fā)商Android平臺提供應(yīng)第三方開發(fā)商一個十分寬泛、自由的環(huán)境,不會受到各種條條框框的阻擾,可想而知,會有多少新奇別致的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如可控制正是留給Android難題之一。五、無縫結(jié)合的Google應(yīng)用如今叱詫互聯(lián)網(wǎng)的Google已經(jīng)走過2023度歷史,從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺手機將無縫結(jié)合這些優(yōu)秀的Google服務(wù)。再說Android的5大局限性:一、安全和隱私由于手機與互聯(lián)網(wǎng)的緊密聯(lián)系,個人隱私很難得到保守。除了上網(wǎng)過程中經(jīng)意或不經(jīng)意留下的個人足跡,Google這個巨人也時時站在你的身后,洞穿一切,因此,互聯(lián)網(wǎng)的進一步將會帶來新一輪的隱私危機。二、一方面開賣Android手機的不是最大運營商眾所周知,T-Mobile在23日,于美國紐約發(fā)布了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知取得Android手機銷售權(quán)的僅有T-Mobile和Sprint,其中T-Mobile的3G網(wǎng)絡(luò)相對于其他三家也要遜色不少,因此,用戶可以買賬購買G1,能否體驗到最佳的3G網(wǎng)絡(luò)服務(wù)則要另當別論了!三、運營商仍然可以影響到Android手機在國內(nèi)市場,不少用戶對購得移動定制機不滿,感覺所購的手機被人涂畫了廣告一般。這樣的情況在國外市場同樣出現(xiàn)。Android手機的另一發(fā)售運營商Sprint就將在其機型中內(nèi)置其手機商店程序。四、同類機型用戶減少在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使專心得交流,并分享軟件資源。而對于Android平臺手機,由于廠商豐富,產(chǎn)品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統(tǒng)一機型的程序強化。舉個稍顯不妥的例子,現(xiàn)在山寨機泛濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除了哪些功能異常搶眼、頗受追捧的機型以外。五、過度依賴開發(fā)商缺少標準配置在使用PC端的WindowsXp系統(tǒng)的時候,都會內(nèi)置微軟WindowsMediaPlayer這樣一個瀏覽器程序,用戶可以選擇更多樣的播放器,如Realplay或暴風(fēng)影音等。但入手開始使用默認的程序同樣可以應(yīng)付多樣的需要。在Android平臺中,由于其開放性,軟件更多依賴第三方廠商,比如Android系統(tǒng)的SDK中就沒有內(nèi)置音樂播放器,所有依賴第三方開發(fā),缺少了產(chǎn)品的統(tǒng)一性。Androiddvm的進程和Linux的進程,應(yīng)用程序的進程是否為同一個概念答:DVM指dalivk的虛擬機。每一個Android應(yīng)用程序都在它自己的進程中運營,都擁有一個獨立的Dalvik虛擬機實例。而每一個DVM都是在Linux中的一個進程,所以說可以認為是同一個概念。sim卡的EF文獻是什么?有何作用答:sim卡的文獻系統(tǒng)有自己規(guī)范,重要是為了和手機通訊,sim本身可以有自己的操作系統(tǒng),EF就是作存儲并和手機通訊用的嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種,各有何特性頁式,段式,段頁,用到了MMU,虛擬空間等技術(shù)什么是嵌入式實時操作系統(tǒng),Android操作系統(tǒng)屬于實時操作系統(tǒng)嗎?嵌入式實時操作系統(tǒng)是指當外界事件或數(shù)據(jù)產(chǎn)生時,可以接受并以足夠快的速度予以解決,其解決的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)鉀Q系統(tǒng)作出快速響應(yīng),并控制所有實時任務(wù)協(xié)調(diào)一致運營的嵌入式操作系統(tǒng)。重要用于工業(yè)控制、軍事設(shè)備、航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時間有苛刻的規(guī)定,這就需要使用實時系統(tǒng)。又可分為軟實時和硬實時兩種,而android是基于linux內(nèi)核的,因此屬于軟實時。一條最長的短信息約占多少byte?中文70(涉及標點),英文160,160個字節(jié)。有一個一維整型數(shù)組int[]data保存的是一張寬為width,高為height的圖片像素值信息。請寫一個算法,將該圖片所有的白色不透明(0xffffffff)像素點的透明度調(diào)整為50%。如何將SQLite數(shù)據(jù)庫(dictionary.db文獻)與apk文獻一起發(fā)布解答:可以將dictionary.db文獻復(fù)制到EclipseAndroid工程中的resaw目錄中。所有在resaw目錄中的文獻不會被壓縮,這樣可以直接提取該目錄中的文獻??梢詫ⅲ鋓ctionary.db文獻復(fù)制到resaw目錄中如何將打開resaw目錄中的數(shù)據(jù)庫文獻?解答:在Android中不能直接打開resaw目錄中的數(shù)據(jù)庫文獻,而需要在程序第一次啟動時將該文獻復(fù)制到手機內(nèi)存或SD卡的某個目錄中,然后再打開該數(shù)據(jù)庫文獻。復(fù)制的基本方法是使用getResources().openRawResource方法獲得resaw目錄中資源的InputStream對象,然后將該InputStream對象中的數(shù)據(jù)寫入其他的目錄中相應(yīng)文獻中。在AndroidSDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來打開任意目錄中的SQLite數(shù)據(jù)庫文獻。DDMS和TraceView的區(qū)別?DDMS是一個程序執(zhí)行查看器,在里面可以看見線程和堆棧等信息,TraceView是程序性能分析器。java中如何引用本地語言可以用JNI(javanativeinterfacejava本地接口)接口。談?wù)凙ndroid的IPC(進程間通信)機制IPC是內(nèi)部進程通信的簡稱,是共享"命名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android中該機制,只合用于Activity和Service之間的通信,類似于遠程方法調(diào)用,類似于C/S模式的訪問。通過定義AIDL接口文獻來定義IPC接口。Servier端實現(xiàn)IPC接口,Client端調(diào)用IPC接口本地代理。NDK是什么NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發(fā)者迅速的開發(fā)C/C++的動態(tài)庫,并能自動將so和java應(yīng)用打成apk包。NDK集成了交叉編譯器,并提供了相應(yīng)的mk文獻和隔離cpu、平臺等的差異,開發(fā)人員只需簡樸的修改mk文獻就可以創(chuàng)建出soAndroid面試基礎(chǔ)題做下總結(jié)Intent的幾種有關(guān)Activity啟動的方式有哪些,你了解每個含義嗎?這里Android123提醒大家,Intent的一些標記有FLAG_ACTIVITY_BROUGHT_TO(shè)_FRONT、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK等。每種含義大家看SDK文檔和具體跑下這樣你的記憶會更深刻些。2.Activity和Task的啟動模式有哪些?每種含義是什么?有關(guān)在AndroidManifest.xml中的android:launchMode定義,重要有standard、singleTop、singleTask和singleInstance,同時對于android:taskAffinity這些問題大家也要了解,Android開發(fā)網(wǎng)在以前的文章中講過,但是很多開發(fā)者仍然不是很清楚,這些基礎(chǔ)問題我們以后仍然會再次總結(jié)。關(guān)于Activity的啟動模式,參考:3.通過Intent傳遞一些二進制數(shù)據(jù)的方法有哪些?1).使用Serializable接口實現(xiàn)序列化,這是Java常用的方法。2).實現(xiàn)Parcelable接口,這里Android的部分類比如Bitmap類就已經(jīng)實現(xiàn)了,同時Parcelable在AndroidAIDL中互換數(shù)據(jù)也很常見的。4.能說下Android應(yīng)用的入口點嗎?真正的Android入口點是application的main,你可以看下androidmanifest.xml的包含關(guān)系就清楚了??梢詻]有Activity但是必須有Application5.Android都有哪些XML解析器,都純熟掌握嗎?這里XmlPull、SAX和DOM相信做過Web開發(fā)的都已經(jīng)滾瓜爛熟了。6.SQLite支持事務(wù)嗎?添加刪除如何提高性能?SQLite作為輕量級的數(shù)據(jù)庫,比MySQL還小,但支持SQL語句查詢,提高性能可以考慮通過原始通過優(yōu)化的SQL查詢語句方式解決。7.AndroidService和Binder、AIDL你都純熟嗎?作為Android重要的后臺服務(wù),這些每個Android開發(fā)者都應(yīng)當掌握,這也算是和JavaSE最大的不同了,具體的實例大家可以查看Android音樂播放器的源代碼Music.git中的,這里不再贅述。8.你用過哪款A(yù)ndroid手機,有哪些優(yōu)點和局限性,相對于iPhone或Symbian又有哪些優(yōu)缺陷?把這個作為面試題也是考察下,可以大約了解到它對Android的了解限度,多移動開發(fā)的結(jié)識。1.請描述下Activity的生命周期。創(chuàng)建oncreate-啟動onstart–恢復(fù)onResume–暫停onPause–結(jié)束onEnd–銷毀onDestroy2.假如后臺的Act

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論