安卓面試題整理_第1頁
安卓面試題整理_第2頁
安卓面試題整理_第3頁
安卓面試題整理_第4頁
安卓面試題整理_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Activity生命周期1.啟動(dòng)Activity:系統(tǒng)會(huì)先調(diào)用onCreate方法,然后調(diào)用onStart方法,最后調(diào)用onResume,Activity進(jìn)入運(yùn)行狀態(tài)。2.當(dāng)前Activity被其他Activity覆蓋其上或被鎖屏:系統(tǒng)會(huì)調(diào)用onPause方法,暫停當(dāng)前Activity的執(zhí)行。3.當(dāng)前Activity由被覆蓋狀態(tài)回到前臺(tái)或解鎖屏:系統(tǒng)會(huì)調(diào)用onResume方法,再次進(jìn)入運(yùn)行狀態(tài)。4.當(dāng)前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏,自身退居后臺(tái):系統(tǒng)會(huì)先調(diào)用onPause方法,然后調(diào)用onStop方法,進(jìn)入停滯狀態(tài)。5.用戶后退回到此Activity:系統(tǒng)會(huì)先調(diào)用onRestart方法,然后調(diào)用onStart方法,最后調(diào)用onResume方法,再次進(jìn)入運(yùn)行狀態(tài)。6.當(dāng)前Activity處于被覆蓋狀態(tài)或者后臺(tái)不可見狀態(tài),即第2步和第4步,系統(tǒng)內(nèi)存不足,殺死當(dāng)前Activity,而后用戶退回當(dāng)前Activity:再次調(diào)用onCreate方法、onStart方法、onResume方法,進(jìn)入運(yùn)行狀態(tài)。7.用戶退出當(dāng)前Activity:系統(tǒng)先調(diào)用onPause方法,然后調(diào)用onStop方法,最后調(diào)用onDestory方法,結(jié)束當(dāng)前Activity二.BroadcastReceive生命周期生命周期只有十秒左右,如果在onReceive()內(nèi)做超過十秒內(nèi)的事情,就會(huì)報(bào)ANR(ApplicationNoResponse)程序無響應(yīng)的錯(cuò)誤信息它的生命周期為從回調(diào)onReceive()方法開始到該方法返回結(jié)果后結(jié)束。普通廣播,通過Context.sendBroadcast(IntentmyIntent)發(fā)送的有序廣播,通過Context.sendOrderedBroadcast(intent,receiverPermission)發(fā)送的,該方法第2個(gè)參數(shù)決定該廣播的級(jí)別,發(fā)送優(yōu)先級(jí)級(jí)別數(shù)值是在-1000到1000之間,值越大,發(fā)送的優(yōu)先級(jí)越高;

廣播接收者接收廣播時(shí)的級(jí)別可通過intentfilter中的priority進(jìn)行設(shè)置,接收優(yōu)先級(jí)級(jí)別數(shù)值設(shè)為2147483647時(shí)優(yōu)先級(jí)最高,同級(jí)別接收的先后是隨機(jī)的,再到級(jí)別低的收到廣播,高級(jí)別的或同級(jí)別先接收到廣播的可以通過abortBroadcast()方法截?cái)鄰V播使其他的接收者無法收到該廣播和其他構(gòu)造函數(shù)。異步廣播,通過Context.sendStickyBroadcast(IntentmyIntent)發(fā)送的,還有sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,

initialCode,initialData,initialExtras)方法,該方法具有有序廣播的特性也有異步廣播的特性;發(fā)送異步廣播需要賦權(quán)。注意:1.生命周期只有十秒左右,如果在onReceive()內(nèi)做超過十秒內(nèi)的事情,就會(huì)報(bào)ANR(ApplicationNoResponse)程序無響應(yīng)的錯(cuò)誤信息,如果需要完成一項(xiàng)比較耗時(shí)的工作,應(yīng)該通過發(fā)送Intent給Service,由Service來完成.這里不能使用子線程來解決,因?yàn)锽roadcastReceiver的生命周期很短,子線程可能還沒有結(jié)束BroadcastReceiver就先結(jié)束了.BroadcastReceiver一旦結(jié)束,此時(shí)BroadcastReceiver的所在進(jìn)程很容易在系統(tǒng)需要內(nèi)存時(shí)被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒有任何活動(dòng)組件的進(jìn)程).如果它的宿主進(jìn)程被殺死,那么正在工作的子線程也會(huì)被殺死.所以采用子線程來解決是不可靠的2.動(dòng)態(tài)注冊(cè)廣播接收器還有一個(gè)特點(diǎn),就是當(dāng)用來注冊(cè)的Activity關(guān)掉后,廣播也就失效了。靜態(tài)注冊(cè)無需擔(dān)憂廣播接收器是否被關(guān)閉,只要設(shè)備是開啟狀態(tài),廣播接收器也是打開著的。也就是說哪怕app本身未啟動(dòng),該app訂閱的廣播在觸發(fā)時(shí)也會(huì)對(duì)它起作用系統(tǒng)常見廣播Intent,如開機(jī)啟動(dòng)、電池電量變化、時(shí)間改變等廣播三.Service

生命周期使用context.startService()啟動(dòng)Service其生命周期為context.startService()->onCreate()->onStart()->Servicerunning-->(如果調(diào)用context.stopService())->onDestroy()->Serviceshutdown如果Service還沒有運(yùn)行,則android先調(diào)用onCreate()然后調(diào)用onStart();

如果Service已經(jīng)運(yùn)行,則只調(diào)用onStart(),所以一個(gè)Service的onStart方法可能會(huì)重復(fù)調(diào)用多次。

調(diào)用stopService的時(shí)候直接onDestroy,

如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。

該Service的調(diào)用者再啟動(dòng)起來后可以通過stopService關(guān)閉Service。

所以調(diào)用startService的生命周期為:onCreate-->onStart(可多次調(diào)用)-->onDestroy

對(duì)于bindService()啟動(dòng)Service會(huì)經(jīng)歷:

context.bindService()->onCreate()->onBind()->Servicerunning-->onUnbind()->onDestroy()->Servicestop

onBind將返回給客戶端一個(gè)IBind接口實(shí)例,IBind允許客戶端回調(diào)服務(wù)的方法,比如得到Service運(yùn)行的狀態(tài)或其他操作。

這個(gè)時(shí)候把調(diào)用者(Context,例如Activity)會(huì)和Service綁定在一起,Context退出了,

Srevice就會(huì)調(diào)用onUnbind->onDestroy相應(yīng)退出。

所以調(diào)用bindService的生命周期為:onCreate-->onBind(只一次,不可多次綁定)-->onUnbind-->onDestory。

一但銷毀activity它就結(jié)束,如果按home把它放到后臺(tái),那他就不退出。android中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?ViewAnimation(TweenAnimation):補(bǔ)間動(dòng)畫,給出兩個(gè)關(guān)鍵幀,通過一些算法將給定屬性值在給定的時(shí)間內(nèi)在兩個(gè)關(guān)鍵幀間漸變。

Viewanimation只能應(yīng)用于View對(duì)象,而且只支持一部分屬性,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng)、放大、縮小以及產(chǎn)生透明度的變化.

另一種Frame動(dòng)畫,傳統(tǒng)的動(dòng)畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。寫出三種常用layout布局并進(jìn)行解釋。最常用的三種:相對(duì)布局RelativeLayout,線性布局LinearLayout,幀布局FrameLayout,網(wǎng)格布局GridLayout六.請(qǐng)介紹下Android的數(shù)據(jù)存儲(chǔ)方式。使用SharedPreferences存儲(chǔ)數(shù)據(jù),文件存儲(chǔ)數(shù)據(jù),網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù),ContentProvider,SQLite數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)七.寫出幾種service和Activity的交互方式1.廣播交互

2.共享文件交互

3.Messenger交互(信使交互)4.自定義接口交互

5.AIDL交互Fragment生命周期1.當(dāng)一個(gè)fragment被創(chuàng)建的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài).。onAttach()onCreate()onCreateView()onActivityCreated()2.當(dāng)這個(gè)fragment對(duì)用戶可見的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài)。onStart()onResume()3.當(dāng)這個(gè)fragment進(jìn)入“后臺(tái)模式”的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài)。onPause()onStop()4.當(dāng)這個(gè)fragment被銷毀了(或者持有它的activity被銷毀了),它會(huì)經(jīng)歷以下狀態(tài)。onPause()onStop()onDestroyView()onDestroy()//onDetach()5.就像activitie一樣,在以下的狀態(tài)中,可以使用Bundle對(duì)象保存一個(gè)fragment的對(duì)象。onCreate()onCreateView()onActivityCreated()view的繪制過程,講講draw/onDraw和drawChild這個(gè)可以口述。簡(jiǎn)要解釋一下activity、intent、intentfilter、service、Broadcase、BroadcaseReceiver一個(gè)activity呈現(xiàn)了一個(gè)用戶可以操作的可視化用戶界面一個(gè)service不包含可見的用戶界面,而是在后臺(tái)無限地運(yùn)行可以連接到一個(gè)正在運(yùn)行的服務(wù)中,連接后,可以通過服務(wù)中暴露出來的借口與其進(jìn)行通信一個(gè)broadcastreceiver是一個(gè)接收廣播消息并作出回應(yīng)的component,broadcastreceiver沒有界面intent:contentprovider在接收到ContentResolver的請(qǐng)求時(shí)被激活。activity,service和broadcastreceiver是被稱為intents的異步消息激活的。一個(gè)intent是一個(gè)Intent對(duì)象,它保存了消息的內(nèi)容。對(duì)于activity和service來說,它指定了請(qǐng)求的操作名稱和待操作數(shù)據(jù)的URIIntent對(duì)象可以顯式的指定一個(gè)目標(biāo)component。如果這樣的話,android會(huì)找到這個(gè)component(基于manifest文件中的聲明)并激活它。但如果一個(gè)目標(biāo)不是顯式指定的,android必須找到響應(yīng)intent的最佳component。它是通過將Intent對(duì)象和目標(biāo)的intentfilter相比較來完成這一工作的。一個(gè)component的intentfilter告訴android該component能處理的entfilter也是在manifest文件中聲明的。IntentService有何優(yōu)點(diǎn)?IntentService是一個(gè)通過Context.startService(Intent)啟動(dòng)可以處理異步請(qǐng)求的Service,使用時(shí)你只需要繼承IntentService和重寫其中的onHandleIntent(Intent)方法接收一個(gè)Intent對(duì)象,在適當(dāng)?shù)臅r(shí)候會(huì)停止自己(一般在工作完成的時(shí)候).所有的請(qǐng)求的處理都在一個(gè)工作線程中完成,它們會(huì)交替執(zhí)行(但不會(huì)阻塞主線程的執(zhí)行),一次只能執(zhí)行一個(gè)請(qǐng)求。

這是一個(gè)基于消息的服務(wù),每次啟動(dòng)該服務(wù)并不是馬上處理你的工作,而是首先會(huì)創(chuàng)建對(duì)應(yīng)的Looper,Handler并且在MessageQueue中添加的附帶客戶Intent的Message對(duì)象,當(dāng)Looper發(fā)現(xiàn)有Message的時(shí)候接著得到Intent對(duì)象通過在onHandleIntent((Intent)msg.obj)中調(diào)用你的處理程序.處理完后即會(huì)停止自己的服務(wù).意思是Intent的生命周期跟你的處理的任務(wù)是一致的.所以這個(gè)類用下載任務(wù)中非常好,下載任務(wù)結(jié)束后服務(wù)自身就會(huì)結(jié)束退出.兩個(gè)Activity之間跳轉(zhuǎn)時(shí)必然會(huì)執(zhí)行的是哪幾個(gè)方法。startActivity(Intentintent);

startActivityForResult(Intentintent,intrequestCode);

onActivityResult(intrequestCode,intresultCode,Intentdata);

setResult(intresultCode);兩個(gè)Activity之間怎么傳遞數(shù)據(jù)?1創(chuàng)建Intent對(duì)象,并配置參數(shù),有那個(gè)activity跳轉(zhuǎn)到哪個(gè)activity

2在intent對(duì)象中進(jìn)行存放數(shù)據(jù),數(shù)據(jù)的格式是key-value形式

3啟動(dòng)跳轉(zhuǎn)

4進(jìn)入下一個(gè)到跳轉(zhuǎn)的activity中,并取得intent對(duì)象

5通過intent對(duì)象取得bundle對(duì)象,數(shù)據(jù)就在bundle對(duì)象中,然后通過key-value形式取得數(shù)據(jù)怎么讓在啟動(dòng)一個(gè)Activity時(shí)就啟動(dòng)一個(gè)service?在activity的onCreate里寫

startService(xxx);Activity怎么和service綁定,怎么在activity中啟動(dòng)自己對(duì)應(yīng)的service?startService()一旦被創(chuàng)建調(diào)用著無關(guān)沒法使用service里面的方法

bindService()把service與調(diào)用者綁定,如果調(diào)用者被銷毀,service會(huì)銷毀

bindService()我們可以使用service里面的方法

bindService().讓activity能夠訪問到service里面的方法

構(gòu)建一個(gè)intent對(duì)象,

Intentservice=newIntent(this,MyService.class);

通過bindService的方法去啟動(dòng)一個(gè)服務(wù),

bindService(intent,newMyConn(),BIND_AUTO_CREATE);

ServiceConnection對(duì)象(重寫onServiceConnected和OnServiceDisconnected方法)和BIND_AUTO_CREATE.十六.什么是Service以及描述下它的生命周期。Service有哪些啟動(dòng)方法,有什么區(qū)別,怎樣停用Service?Service以及描述下它的生命周期:

Service是運(yùn)行在后臺(tái)的android組件,沒有用戶界面,不能與用戶交互,可以運(yùn)行在自己的進(jìn)程,也可以運(yùn)行在其他應(yīng)用程序的上下文里。

Service隨著啟動(dòng)形式的不同,其生命周期稍有差別。當(dāng)用Context.startService()來啟動(dòng)時(shí),Service的生命周期依次為:oncreate——>onStartCommand——>onDestroy當(dāng)用Context.bindService()啟動(dòng)時(shí):onStart——>onBind——>onUnbind——>onDestroy。

Service啟動(dòng)方式有兩種;一是Context.startService和Context.bindService。

區(qū)別是通過startService啟動(dòng)時(shí)Service組件和應(yīng)用程序沒多大的聯(lián)系;當(dāng)用訪問者啟動(dòng)之后,如果訪問者不主動(dòng)關(guān)閉,Service就不會(huì)關(guān)閉,Service組件之間因?yàn)闆]什么關(guān)聯(lián),所以Service也不能和應(yīng)用程序進(jìn)行數(shù)據(jù)交互。而通過bindService進(jìn)行綁定時(shí),應(yīng)用程序可以通過ServiceConnection進(jìn)行數(shù)據(jù)交互。

在實(shí)現(xiàn)Service時(shí)重寫的onBind方法中,其返回的對(duì)象會(huì)傳給ServiceConnection對(duì)象的onServiceConnected(ComponentNamename,IBinderservice)中的service參數(shù);也就是說獲取了serivce這個(gè)參數(shù)就得到了Serivce組件返回的值。Context.bindService(Intentintent,ServiceConnectionconn,intflag)其中只要與Service連接成功conn就會(huì)調(diào)用其onServiceConnected方法,停用Service使用Context.stopService。什么時(shí)候使用Service?Android開發(fā)中,當(dāng)需要?jiǎng)?chuàng)建在后臺(tái)運(yùn)行的程序的時(shí)候(主進(jìn)程不能進(jìn)行耗時(shí)操作),就要使用到Service。Service可以分為有無限生命和有限生命兩種。(1)默認(rèn)情況下,Service其實(shí)是運(yùn)行在主線程中的,如果需要執(zhí)行復(fù)雜耗時(shí)的操作,必須在Service中再創(chuàng)建一個(gè)Thread來執(zhí)行任務(wù)。(2)Service的優(yōu)先級(jí)高于后臺(tái)掛起的Activity,當(dāng)然,也高于Activity所創(chuàng)建的Thread,因此,系統(tǒng)可能在內(nèi)存不足的時(shí)候優(yōu)先殺死后臺(tái)的Activity或者Thread,而不會(huì)輕易殺死Service組件,即使被迫殺死Service,也會(huì)在資源可用時(shí)重啟被殺死的Servicehttp怎么加入超時(shí)和代理Http連接的超時(shí)機(jī)制能夠防止連接線程的無限期等待,一般可分為connect

timeout和socket

timeout二十二.在manifest和代碼中如何注冊(cè)和使用broadcastreceiver。

<!--本程序需要請(qǐng)求的這個(gè)權(quán)限,否則自己也無法調(diào)用這個(gè)廣播了-->

<uses-permission

android:name="com.test.mybrpermission"/>

<!--該receiver的調(diào)用者需要請(qǐng)求的一個(gè)權(quán)限-->

<receiver

android:name=".MyReceiver"

android:exported="true"

android:permission="com.test.mybrpermission"

>

<intent-filter

android:priority="20">

<action

android:name="com.test.mybr"/>

</intent-filter>

</receiver>

二十三.談?wù)刄I中,Padding和Margin有什么區(qū)別?Padding為內(nèi)邊框,指該控件內(nèi)部內(nèi)容,如文本/圖片距離該控件的邊距Margin為外邊框,指該控件距離邊父控件的邊距二十五.談?wù)剬?duì)AndroidNDK的理解。1、NDK是一系列工具的集合。NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫,并能自動(dòng)將so和java應(yīng)用一起打包成apk。這些工具對(duì)開發(fā)者的幫助是巨大的。

NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、ABI等差異,開發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。

NDK可以自動(dòng)地將so和Java應(yīng)用一起打包,極大地減輕了開發(fā)人員的打包工作。

2、NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明。

Google明確聲明該API是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標(biāo)準(zhǔn)庫(libc)、標(biāo)準(zhǔn)數(shù)學(xué)庫(libm)、壓縮庫(libz)、Log庫(liblog)。二十七.Android系統(tǒng)中GC什么情況下會(huì)出現(xiàn)內(nèi)存泄露呢?1.數(shù)據(jù)庫的cursor沒有關(guān)閉2.構(gòu)造adapter時(shí),沒有使用緩存contentview衍生listview的優(yōu)化問題減少創(chuàng)建view的對(duì)象,充分使用contentview,可以使用一靜態(tài)類來優(yōu)化處理getview的過程/3.Bitmap對(duì)象不使用時(shí)采用recycle()釋放內(nèi)存4.activity中的對(duì)象的生命周期大于activity二十八.什么是ANR如何避免它?

無響應(yīng)問題,如果你在activity中有進(jìn)行耗時(shí)長的問題,就會(huì)產(chǎn)生這個(gè)問題。二十九.如果后臺(tái)的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?onSaveInstanceState()

當(dāng)你的程序中某一個(gè)ActivityA在運(yùn)行時(shí),主動(dòng)或被動(dòng)地運(yùn)行另一個(gè)新的ActivityB,這個(gè)時(shí)候A會(huì)執(zhí)行onSaveInstanceState()。B完成以后又會(huì)來找A,這個(gè)時(shí)候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調(diào)用onCreate()方法,不同于直接啟動(dòng)的是這回onCreate()里是帶上了參數(shù)savedInstanceState;而沒被收回的就直接執(zhí)行onResume(),跳過onCreate()了。三十.如何退出Activity1、拋異常強(qiáng)制退出:

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

驗(yàn)證可以,但是,需要解決的問題是,如何使程序結(jié)束掉,而不彈出ForceClose的窗口。

2、記錄打開的Activity:

每打開一個(gè)Activity,就記錄下來。在需要退出時(shí),關(guān)閉每一個(gè)Activity即可。

3、發(fā)送特定廣播:

在需要結(jié)束應(yīng)用時(shí),發(fā)送一個(gè)特定的廣播,每個(gè)Activity收到廣播后,關(guān)閉即可。

4、遞歸退出

在打開新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。三十一.android:gravity與android:layout_gravity的區(qū)別控件本身和控件內(nèi)容三十二.注冊(cè)廣播接收者兩種方式的區(qū)別,及優(yōu)缺點(diǎn)1)第一種是常駐型(靜態(tài)注冊(cè)),也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。2)第二種不是常駐型廣播(動(dòng)態(tài)注冊(cè)),也就是說廣播跟隨程序的生命周期。三十三.AsyncTask

的異步機(jī)制和普通線程有什么區(qū)別,分別有哪些優(yōu)缺點(diǎn)。\o"Android知識(shí)庫"\t"/meng425841867/article/details/_blank"Android應(yīng)用程序的編寫是在\o"JavaEE知識(shí)庫"\t"/meng425841867/article/details/_blank"Java的基礎(chǔ)上進(jìn)行的,android為了更方便的在線程中操作Ui,延伸出了AsyncTask,因此如果在做android的應(yīng)用開發(fā)的時(shí)候,如果需要用到與界面相關(guān)的線程的時(shí)候首選AsyncTask,如果線程主要用來處理數(shù)據(jù),不參與界面操作的時(shí)候盡量用Thread線程,因?yàn)門hread較AsyncTask比有很多優(yōu)點(diǎn)(參考javaAPI),另外如果在應(yīng)用中需要啟動(dòng)多個(gè)線程的時(shí)候,也要使用Thread,它自帶多線程處理??偟膩碚f,如果需要簡(jiǎn)單的操作Ui,AsyncTask更好一些。如果不操作UI或者后臺(tái)線程比較復(fù)雜,Thread更好一些。三十四.Handler機(jī)制和原理三十五.Service生命周期,如何啟用Service,如何停用Service。三十六.隱式、顯式Intent的區(qū)別。顯式Intent直接用組件的名稱定義目標(biāo)組件,這種方式很直接。但是由于開發(fā)人員往往并不清楚別的應(yīng)用程序的組件名稱,因此,顯式Intent更多用于在應(yīng)用程序內(nèi)部傳遞消息。比如在某應(yīng)用程序內(nèi),一個(gè)Activity啟動(dòng)一個(gè)Service。

隱式Intent恰恰相反,它不會(huì)用組件名稱定義需要激活的目標(biāo)組件,它更廣泛地用于在不同應(yīng)用程序之間傳遞消息。

在顯式Intent消息中,決定目標(biāo)組件的唯一要素就是組件名稱,因此,如果你的Intent中已經(jīng)明確定義了目標(biāo)組件的名稱,那么你就完全不用再定義其他Intent內(nèi)容。

而對(duì)于隱式Intent則不同,由于沒有明確的目標(biāo)組件名稱,所以必須由Android系統(tǒng)幫助應(yīng)用程序?qū)ふ遗cIntent請(qǐng)求意圖最匹配的組件。

三十八.簡(jiǎn)述Android應(yīng)用程序結(jié)構(gòu)是哪些?1,Android應(yīng)用程序?qū)?/p>

2,應(yīng)用程序框架層

3,系統(tǒng)運(yùn)行庫層

4,Linux核心層

詳細(xì)的請(qǐng)上網(wǎng)搜索

三十九.Android四大組件分別是什么?對(duì)各種組件的理解?android四大組件分別為Activity、Service、BroadcastReceiver、ContentProvider。四十一.什么情況會(huì)導(dǎo)致ForceClose?如何避免?能否捕獲導(dǎo)致其的異常?拋出運(yùn)行時(shí)異常時(shí)就會(huì)導(dǎo)致ForceClose,比如空指針、數(shù)組越界、類型轉(zhuǎn)換異常等等。

捕獲:可以通過logcat查看拋出異常的代碼出現(xiàn)的位置,然后到程序?qū)?yīng)代碼中進(jìn)行修改。

避免:編寫程序時(shí),要思維縝密,在可能出現(xiàn)異常的地方都作相應(yīng)的處理,增強(qiáng)程序的健壯性。五十.能說出幾個(gè)系統(tǒng)內(nèi)置的Intent嗎?1.從google搜索內(nèi)容

Intentintent=newIntent();

intent.setAction(Intent.ACTION_WEB_SEARCH);

intent.putExtra(SearchManager.QUERY,"searchString")

startActivity(intent);

2.瀏覽網(wǎng)頁

Uriuri=Uri.parse("");

Intentit=newIntent(Intent.ACTION_VIEW,uri);

startActivity(it);

3.顯示地圖

Uriuri=Uri.parse("geo:38.899533,-77.036476");

Intentit=newIntent(Intent.Action_VIEW,uri);

startActivity(it);

4.路徑規(guī)劃

Uriuri=Uri.parse("/maps?f=dsaddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");

Intentit=newIntent(Intent.ACTION_VIEW,URI);

startActivity(it);

5.撥打電話

Uriuri=Uri.parse("tel:xxxxxx");

Intentit=newIntent(Intent.ACTION_DIAL,uri);

startActivity(it);

6.調(diào)用發(fā)短信的程序

Intentit=newIntent(Intent.ACTION_VIEW);

it.putExtra("sms_body","TheSMStext");

it.setType("vnd.android-dir/mms-sms");

startActivity(it);

7.發(fā)送短信

Uriuri=Uri.parse("smsto:0800000123");

Intentit=newIntent(Intent.ACTION_SENDTO,uri);

it.putExtra("sms_body","TheSMStext");

startActivity(it);

Stringbody="thisissmsdemo";

Intentmmsintent=newIntent(Intent.ACTION_SENDTO,Uri.fromParts("smsto",number,null));

mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY,body);

mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE,true);

mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT,true);

startActivity(mmsintent);

8.發(fā)送彩信

Uriuri=Uri.parse("content://media/external/images/media/23");

Intentit=newIntent(Intent.ACTION_SEND);

it.putExtra("sms_body","sometext");

it.putExtra(Intent.EXTRA_STREAM,uri);

it.setType("image/png");

startActivity(it);

StringBuildersb=newStringBuilder();

sb.append("file://");

sb.append(fd.getAbsoluteFile());

Intentintent=newIntent(Intent.ACTION_SENDTO,Uri.fromParts("mmsto",number,null));

//Belowextradatasarealloptional.

intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT,subject);

intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY,body);

intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI,sb.toString());

intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE,composeMode);

intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT,exitOnSent);

startActivity(intent);

9.發(fā)送Email

Uriuri=Uri.parse("mailto:xxx@");

Intentit=newIntent(Intent.ACTION_SENDTO,uri);

startActivity(it);

Intentit=newIntent(Intent.ACTION_SEND);

it.putExtra(Intent.EXTRA_EMAIL,"me@");

it.putExtra(Intent.EXTRA_TEXT,"Theemailbodytext");

it.setType("text/plain");

startActivity(Intent.createChooser(it,"ChooseEmailClient"));

Intentit=newIntent(Intent.ACTION_SEND);

String[]tos={"me@"};

String[]ccs={"you@"};

it.putExtra(Intent.EXTRA_EMAIL,tos);

it.putExtra(Intent.EXTRA_CC,ccs);

it.putExtra(Intent.EXTRA_TEXT,"Theemailbodytext");

it.putExtra(Intent.EXTRA_SUBJECT,"Theemailsubjecttext");

it.setType("message/rfc822");

startActivity(Intent.createChooser(it,"ChooseEmailClient"));

Intentit=newIntent(Intent.ACTION_SEND);

it.putExtra(Intent.EXTRA_SUBJECT,"Theemailsubjecttext");

it.putExtra(Intent.EXTRA_STREAM,"file:///sdcard/mysong.mp3");

sendIntent.setType("audio/mp3");

startActivity(Intent.createChooser(it,"ChooseEmailClient"));

10.播放多媒體

Intentit=newIntent(Intent.ACTION_VIEW);

Uriuri=Uri.parse("file:///sdcard/song.mp3");

it.setDataAndType(uri,"audio/mp3");

startActivity(it);

Uriuri=Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1");

Intentit=newIntent(Intent.ACTION_VIEW,uri);

startActivity(it);

11.uninstallapk

Uriuri=Uri.fromParts("package",strPackageName,null);

Intentit=newIntent(Intent.ACTION_DELETE,uri);

startActivity(it);

12.installapk

UriinstallUri=Uri.fromParts("package","xxx",null);

returnIt=newIntent(Intent.ACTION_PACKAGE_ADDED,installUri);

13.打開照相機(jī)

<1>Intenti=newIntent(Intent.ACTION_CAMERA_BUTTON,null);

this.sendBroadcast(i);

<2>longdateTaken=System.currentTimeMillis();

Stringname=createName(dateTaken)+".jpg";

fileName=folder+name;

ContentValuesvalues=newContentValues();

values.put(Images.Media.TITLE,fileName);

values.put("_data",fileName);

values.put(Images.Media.PICASA_ID,fileName);

values.put(Images.Media.DISPLAY_NAME,fileName);

values.put(Images.Media.DESCRIPTION,fileName);

values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME,fileName);

UriphotoUri=getContentResolver().insert(

MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);

IntentinttPhoto=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);

startActivityForResult(inttPhoto,10);

14.從gallery選取圖片

Intenti=newIntent();

i.setType("image/*");

i.setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(i,11);

15.打開錄音機(jī)

Intentmi=newIntent(Media.RECORD_SOUND_ACTION);

startActivity(mi);

16.顯示應(yīng)用詳細(xì)列表

Uriuri=Uri.parse("market://details?id=app_id");

Intentit=newIntent(Intent.ACTION_VIEW,uri);

startActivity(it);

//whereapp_idistheapplicationID,findtheID

//byclickingonyourapplicationonMarkethome

//page,andnoticetheIDfromtheaddressbar

剛才找appid未果,結(jié)果發(fā)現(xiàn)用packagename也可以

Uriuri=Uri.parse("market://details?id=<packagename>");

這個(gè)簡(jiǎn)單多了

17.尋找應(yīng)用

Uriuri=Uri.parse("market://search?q=pname:pkg_name");

Intentit=newIntent(Intent.ACTION_VIEW,uri);

startActivity(it);

//wherepkg_nameisthefullpackagepathforanapplication

18.打開聯(lián)系人列表

<1>

Intenti=newIntent();

i.setAction(Intent.ACTION_GET_CONTENT);

i.setType("vnd.android.cursor.item/phone");

startActivityForResult(i,REQUEST_TEXT);

<2>

Uriuri=Uri.parse("content://contacts/people");

Intentit=newIntent(Intent.ACTION_PICK,uri);

startActivityForResult(it,REQUEST_TEXT);

19.打開另一程序

Intenti=newIntent();

ComponentNamecn=newComponentName("com.yellowbook.android2",

"com.yellowbook.android2.AndroidSearch");

i.setComponent(cn);

i.setAction("ent.action.MAIN");

startActivityForResult(i,RESULT_OK);

五十一.如何自定義一個(gè)控件?1、了解View的工作原理

2、編寫繼承自View的子類3、為自定義View類增加屬性

4、繪制控件

5、響應(yīng)用戶消息

6、自定義回調(diào)函數(shù)

一、View結(jié)構(gòu)原理Android系統(tǒng)的視圖結(jié)構(gòu)的設(shè)計(jì)也采用了組合模式,即View作為所有圖形的基類,Viewgroup對(duì)View繼承擴(kuò)展為視圖容器類。View定義了繪圖的基本操作基本操作由三個(gè)函數(shù)完成:measure()、layout()、draw(),其內(nèi)部又分別包含了onMeasure()、onLayout()、onDraw()三個(gè)子方法。具體操作如下:1、measure操作

measure操作主要用于計(jì)算視圖的大小,即視圖的寬度和長度。在view中定義為final類型,要求子類不能修改。measure()函數(shù)中又會(huì)調(diào)用下面的函數(shù):

(1)onMeasure(),視圖大小的將在這里最終確定,也就是說measure只是對(duì)onMeasure的一個(gè)包裝,子類可以覆寫onMeasure()方法實(shí)現(xiàn)自己的計(jì)算視圖大小的方式,并通過setMeasuredDimension(width,height)保存計(jì)算結(jié)果。

2、layout操作

layout操作用于設(shè)置視圖在屏幕中顯示的位置。在view中定義為final類型,要求子類不能修改。layout()函數(shù)中有兩個(gè)基本操作:

(1)setFrame(l,t,r,b),l,t,r,b即子視圖在父視圖中的具體位置,該函數(shù)用于將這些參數(shù)保存起來;

(2)onLayout(),在View中這個(gè)函數(shù)什么都不會(huì)做,提供該函數(shù)主要是為viewGroup類型布局子視圖用的;

3、draw操作

draw操作利用前兩部得到的參數(shù),將視圖顯示在屏幕上,到這里也就完成了整個(gè)的視圖繪制工作。子類也不應(yīng)該修改該方法,因?yàn)槠鋬?nèi)部定義了繪圖的基本操作:

(1)繪制背景;

(2)如果要視圖顯示漸變框,這里會(huì)做一些準(zhǔn)備工作;

(3)繪制視圖本身,即調(diào)用onDraw()函數(shù)。在view中onDraw()是個(gè)空函數(shù),也就是說具體的視圖都要覆寫該函數(shù)來實(shí)現(xiàn)自己的顯示(比如TextView在這里實(shí)現(xiàn)了繪制文字的過程)。而對(duì)于ViewGroup則不需要實(shí)現(xiàn)該函數(shù),因?yàn)樽鳛槿萜魇恰皼]有內(nèi)容“的,其包含了多個(gè)子view,而子View已經(jīng)實(shí)現(xiàn)了自己的繪制方法,因此只需要告訴子view繪制自己就可以了,也就是下面的dispatchDraw()方法;

(4)繪制子視圖,即dispatchDraw()函數(shù)。在view中這是個(gè)空函數(shù),具體的視圖不需要實(shí)現(xiàn)該方法,它是專門為容器類準(zhǔn)備的,也就是容器類必須實(shí)現(xiàn)該方法;

(5)如果需要(應(yīng)用程序調(diào)用了setVerticalFadingEdge或者setHorizontalFadingEdge),開始繪制漸變框;

(6)繪制滾動(dòng)條;

從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個(gè)方法。五十二.返回鍵與Home鍵區(qū)別?在\o"Android知識(shí)庫"Android中,當(dāng)按下Home鍵,默認(rèn)情況下stop前臺(tái)的actiity,即activity設(shè)置成onstop,而不是ondestory。如果再次啟動(dòng)該activity不是調(diào)用onCreate,而是調(diào)用onSavedInstanceState方法,保持上次Activity的狀態(tài)則是從onRestart開始->onStart->onResume;而當(dāng)按下back鍵則不同,back鍵默認(rèn)finish前臺(tái)的activity,即activity的狀態(tài)為onDestory為止,再次啟動(dòng)該activity則從onCreate開始,不會(huì)調(diào)用onSavedInstanceState方法。五十三.OnTuch與OnClick的區(qū)別?1、onClick就傳入一個(gè)View對(duì)象,而onTouch要傳入一個(gè)View對(duì)象和MotionEvent的對(duì)象

2、onTouch對(duì)控件的操作比onCilck更豐富,比如判斷觸摸的狀態(tài)(比如按下,或者放開),和得到點(diǎn)擊的位置等等

3、當(dāng)對(duì)一個(gè)控件觸摸的時(shí)候touch先調(diào)用,onclick是對(duì)touch的一個(gè)擴(kuò)展實(shí)現(xiàn)五十四.如何關(guān)閉廣播?只有動(dòng)態(tài)能取消動(dòng)態(tài)注冊(cè)廣播registerReceiver(Receiver,

filter);

動(dòng)態(tài)取消注冊(cè)的廣播unregisterReceiver(Receiver);

五十五.UI線程和非UI線程的交互方式,寫出幾種各自的耗時(shí)。Handler,runUIThread;,asyntask,五十六.requestLayout,invalidate和postInvalidate的異同當(dāng)一個(gè)VIEW的布局屬性發(fā)生了變化的時(shí)候,可以調(diào)用該方法,讓父VIEW調(diào)用onmeasure和onlayout重新定位該view的位置,需要在UI線程調(diào)用

invalidate強(qiáng)制使view重繪,需要在UI線程調(diào)用

postinvalidate作用同上,但是可以直接在子線程調(diào)用五十七.多線程有幾種實(shí)現(xiàn)方式?

(1)繼承Thread類

(2)實(shí)現(xiàn)Runnable接口,重寫run函數(shù)

(3)實(shí)現(xiàn)Callable接口,重寫call函數(shù)

①Callable規(guī)定的方法是call(),而Runnable規(guī)定的方法是run().

②Callable的任務(wù)執(zhí)行后可返回值,而Runnable的任務(wù)是不能返回值的

③call()方法可拋出異常,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論