1.AIDL
1.aidl對(duì)應(yīng)的接口名稱與aidl文件名相同(aidl對(duì)應(yīng)的接口名稱必須與aidl文件名相同不然無法自動(dòng)編譯)
2.aidl的文件的內(nèi)容類似java代碼
3.創(chuàng)建一個(gè)Service(服務(wù)),在服務(wù)的onBind(Intent intent)方法中返回實(shí)現(xiàn)了aidl接口的對(duì)象
4.aidl對(duì)應(yīng)的接口的方法前面不能加訪問權(quán)限修飾符(public ,private,protected等,也不能用static final!)
5.AIDL默認(rèn)支持的類型包括Java基本類型,String,List,Map,CharSequence,自定義類型需要實(shí)現(xiàn)Parcelable接口
2.前臺(tái)進(jìn)程

3.Toast
使用Toast提示時(shí),關(guān)于提示時(shí)長(zhǎng),顯示時(shí)長(zhǎng)默認(rèn)只有2種設(shè)置,toast只能設(shè)置為 2s和3.5s.傳進(jìn)去自定義數(shù)字并不會(huì)報(bào)錯(cuò),只是實(shí)際不起作用,想要更豐富的提示推薦用Dialog
4.AlertDialog
1.AlertDialog.Builder的create() 和show()方法都返回AlertDialog對(duì)象
2.AlertDialog不能直接用new關(guān)鍵字構(gòu)建對(duì)象,而必須使用其內(nèi)部類Builder(****因?yàn)槠錁?gòu)造器都是保護(hù)的,所以不允許非子類調(diào)用****)
5.SQLiteOpenHelper對(duì)數(shù)據(jù)庫進(jìn)行管理的方法
getReadableDatabase()和 getWriteableDatabase()都可以得到一個(gè)可既可以讀又可以寫的數(shù)據(jù)庫對(duì)象,不同的是,當(dāng)磁盤空間滿了之后, getReadableDatabase()得到的是一個(gè)只讀的對(duì)象,而 getWriteableDatabase()則會(huì)拋出異常。
6.Android系統(tǒng)對(duì)下列哪些對(duì)象提供了資源池
A.Message提供了消息池,有靜態(tài)方法Obtain從消息池中取對(duì)象;
B.Thread默認(rèn)不提供資源池,除非使用線程池ThreadPool管理;
C.AsynTask是線程池改造的,池里 默認(rèn)提供(核數(shù)+1)個(gè)線程進(jìn)行并發(fā)操作,最大支持(核數(shù) * 2 + 1)個(gè)線程,超過后會(huì)丟棄其他任務(wù);
D.Looper,每個(gè)Looper創(chuàng)建時(shí)創(chuàng)建一個(gè)消息隊(duì)列和線程對(duì)象,也不是資源池;
因此答案為AC
7.IntentService
繼承Service的,那么它包含了Service的全部特性,當(dāng)然也包含service的生命周期,那么與service不同的是,IntentService在執(zhí)行onCreate操作的時(shí)候,內(nèi)部開了一個(gè)線程,去你執(zhí)行你的耗時(shí)操作。
8.style和theme
style和theme本質(zhì)上就是同一個(gè)東西,xml格式完全相同,只是我用在activity上我就叫他theme,我用在view上我就叫他style。唯一的區(qū)別就是style里頭控制的各個(gè)屬性了,某些屬性是只有針對(duì)Activity才能生效的(你view有標(biāo)題欄嘛有狀態(tài)欄有導(dǎo)航欄嗎嘛?但是反過來Activity內(nèi)部卻有一個(gè)繼承自View的Decorview) 。所以style可以作用在activity上,但是theme卻不能反過來作用在view上
9.線程間通信
andriod提供了 Handler 和 Looper 來滿足線程間的通信。 Handler 先進(jìn)先出原則。 Looper 類用來管理特定線程內(nèi)對(duì)象之間的消息交換(MessageExchange) 。 1)Looper: 一個(gè)線程可以產(chǎn)生一個(gè) Looper 對(duì)象,由它來管理此線程里的 MessageQueue( 消息隊(duì)列 ) 。 2)Handler: 你可以構(gòu)造 Handler 對(duì)象來與 Looper 溝通,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 從 Message Queue取出 ) 所送來的消息。 3) Message Queue( 消息隊(duì)列 ): 用來存放線程放入的消息。 4) 線程: UIthread 通常就是 main thread ,而 Android 啟動(dòng)程序時(shí)會(huì)替它建立一個(gè) MessageQueue 。

Message:消息分為硬件產(chǎn)生的消息(如按鈕、觸摸)和軟件生成的消息;
MessageQueue:消息隊(duì)列的主要功能向消息池投遞消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
Handler:消息輔助類,主要功能向消息池發(fā)送各種消息事件(Handler.sendMessage)和處理相應(yīng)消息事件(Handler.handleMessage);
Looper:不斷循環(huán)執(zhí)行(Looper.loop),按分發(fā)機(jī)制將消息分發(fā)給目標(biāo)處理者。
《Android中Handler引起的內(nèi)存泄露》
10.Activity間通過Intent傳遞數(shù)據(jù)大小限制
底層parcel對(duì)象在不同activity直接傳遞過程中保存在一個(gè)叫做“ Binder transaction buffe”的地方,既然是緩沖區(qū),肯定有大小限制1M。(官方解釋,對(duì)于具體某一次Activity間傳輸?shù)南拗拼笮∈遣淮_定的,依據(jù)使用環(huán)境而定)
該博客“Yet another post on Serializable vs Parcelable”中 Serializable和Parcel時(shí)提到以下兩點(diǎn)數(shù)據(jù),僅供參考了解,實(shí)際使用各有不同
- 使用 Serializable 和parcel傳輸相同對(duì)象,都轉(zhuǎn)換為byte[]后,parcel大概是serializable的20倍了。
- 但是官方建議使用Parcel,原因是說速度是serializable的將近10倍。
11.橫豎屏切換時(shí)候Activity的生命周期
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
12.dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念
Dvm的進(jìn)程是dalivk虛擬機(jī)進(jìn)程,每個(gè)android程序都運(yùn)行在自己的進(jìn)程里面,每個(gè)android程序系統(tǒng)都會(huì)給他分配一個(gè)單獨(dú)的liunx uid(user id),每個(gè)dvm都是linux里面的一個(gè)進(jìn)程.所以說這兩個(gè)進(jìn)程是一個(gè)進(jìn)程.
12. 如何在一個(gè)Service中啟動(dòng)一個(gè)Activity
Intent intent = new Intent(Service.this,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
13.程序之間的親和性的理解
1、默認(rèn)情況下一個(gè)應(yīng)用的所有Activity都是具有相同的affinity,都是從application中繼承,application的affinity默認(rèn)就是manifest的包名。
2、affinity對(duì)Activity來說,就像是身份證一樣,可以告訴所在的Task,自己屬于其中的一員。
3、應(yīng)用場(chǎng)合:
a:根據(jù)affinity重新為Activity選擇合適的宿主Task;
b:與allowTaskReparenting屬性配合;
c:啟動(dòng)Activity使用Intent設(shè)置了FLAG_ACTIVITY_NEW_TASK標(biāo)記。
14.注冊(cè)廣播有幾種方式,這些方式有什么特點(diǎn)和區(qū)別?
兩種方式,首先這兩種方式都要先寫繼承自broadcastreceive的類
答: 第一種:在清單文件中聲明,添加
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二種使用代碼進(jìn)行注冊(cè)如:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver,filter);
兩種注冊(cè)類型的區(qū)別是:
1)第二種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。
2)第一種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。
15.Activity A 啟動(dòng) Activity B 時(shí)一系列操作的發(fā)生順序
Activity A 的 onPause方法執(zhí)行。
Activity B 的 onCreate、onStart和 onResume方法依次執(zhí)行。
然后,如果 Activity A 在屏幕上不再可見,則其 onStop方法執(zhí)行。
您可以利用這種可預(yù)測(cè)的生命周期回調(diào)順序管理從一個(gè) Activity 到另一個(gè) Activity 的信息轉(zhuǎn)變。 例如,如果您必須在第一個(gè) Activity 停止時(shí)向數(shù)據(jù)庫寫入數(shù)據(jù),以便下一個(gè) Activity 能夠讀取該數(shù)據(jù),則應(yīng)在 onPause而不是 onStop執(zhí)行期間向數(shù)據(jù)庫寫入數(shù)據(jù).
onPause較容易被觸發(fā),所以我們?cè)谧鯞roadcastReceiver注銷時(shí)放在onStop要好些。onPause時(shí)Activity界面仍然是可見的,如彈出一個(gè)Dialog時(shí)。但在保存數(shù)據(jù)時(shí),放在onPause去做可以保證數(shù)據(jù)存儲(chǔ)的有效性,如果放在onStop去做,在某些情況下Activity走完onPause后有可能還沒順利走到onStop就被系統(tǒng)回收了。
16.如何實(shí)現(xiàn)應(yīng)用內(nèi)多語言切換?
直接調(diào)用Android開放的接口Resources.updateConfiguration:
public static void changeSystemLanguage(Context context, String language) {
if (context == null || TextUtils.isEmpty(language)) {
return;
}
Resources resources = context.getResources();
Configuration config = resources.getConfiguration();
if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language)) {
config.locale = Locale.SIMPLIFIED_CHINESE;
} else {
config.locale = new Locale(language);
}
resources.updateConfiguration(config, null);
}