1.AIDL
1.aidl對應(yīng)的接口名稱與aidl文件名相同(aidl對應(yīng)的接口名稱必須與aidl文件名相同不然無法自動編譯)
2.aidl的文件的內(nèi)容類似java代碼
3.創(chuàng)建一個Service(服務(wù))崎溃,在服務(wù)的onBind(Intent intent)方法中返回實現(xiàn)了aidl接口的對象
4.aidl對應(yīng)的接口的方法前面不能加訪問權(quán)限修飾符(public ,private,protected等虚倒,也不能用static final!)
5.AIDL默認(rèn)支持的類型包括Java基本類型,String轩勘,List,Map裁着,CharSequence尊流,自定義類型需要實現(xiàn)Parcelable接口
2.前臺進(jìn)程
3.Toast
使用Toast提示時,關(guān)于提示時長,顯示時長默認(rèn)只有2種設(shè)置,toast只能設(shè)置為 2s和3.5s.傳進(jìn)去自定義數(shù)字并不會報錯,只是實際不起作用膘魄,想要更豐富的提示推薦用Dialog
4.AlertDialog
1.AlertDialog.Builder的create() 和show()方法都返回AlertDialog對象
2.AlertDialog不能直接用new關(guān)鍵字構(gòu)建對象,而必須使用其內(nèi)部類Builder(****因為其構(gòu)造器都是保護(hù)的,所以不允許非子類調(diào)用****)
5.SQLiteOpenHelper對數(shù)據(jù)庫進(jìn)行管理的方法
getReadableDatabase()和 getWriteableDatabase()都可以得到一個可既可以讀又可以寫的數(shù)據(jù)庫對象竭讳,不同的是创葡,當(dāng)磁盤空間滿了之后, getReadableDatabase()得到的是一個只讀的對象绢慢,而 getWriteableDatabase()則會拋出異常灿渴。
6.Android系統(tǒng)對下列哪些對象提供了資源池
A.Message提供了消息池,有靜態(tài)方法Obtain從消息池中取對象胰舆;
B.Thread默認(rèn)不提供資源池骚露,除非使用線程池ThreadPool管理;
C.AsynTask是線程池改造的缚窿,池里 默認(rèn)提供(核數(shù)+1)個線程進(jìn)行并發(fā)操作棘幸,最大支持(核數(shù) * 2 + 1)個線程,超過后會丟棄其他任務(wù)倦零;
D.Looper误续,每個Looper創(chuàng)建時創(chuàng)建一個消息隊列和線程對象吨悍,也不是資源池;
因此答案為AC
7.IntentService
繼承Service的蹋嵌,那么它包含了Service的全部特性育瓜,當(dāng)然也包含service的生命周期,那么與service不同的是栽烂,IntentService在執(zhí)行onCreate操作的時候躏仇,內(nèi)部開了一個線程,去你執(zhí)行你的耗時操作愕鼓。
8.style和theme
style和theme本質(zhì)上就是同一個東西钙态,xml格式完全相同,只是我用在activity上我就叫他theme菇晃,我用在view上我就叫他style。唯一的區(qū)別就是style里頭控制的各個屬性了蚓挤,某些屬性是只有針對Activity才能生效的(你view有標(biāo)題欄嘛有狀態(tài)欄有導(dǎo)航欄嗎嘛磺送?但是反過來Activity內(nèi)部卻有一個繼承自View的Decorview) 。所以style可以作用在activity上灿意,但是theme卻不能反過來作用在view上
9.線程間通信
andriod提供了 Handler 和 Looper 來滿足線程間的通信估灿。 Handler 先進(jìn)先出原則。 Looper 類用來管理特定線程內(nèi)對象之間的消息交換(MessageExchange) 缤剧。 1)Looper: 一個線程可以產(chǎn)生一個 Looper 對象馅袁,由它來管理此線程里的 MessageQueue( 消息隊列 ) 。 2)Handler: 你可以構(gòu)造 Handler 對象來與 Looper 溝通荒辕,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 從 Message Queue取出 ) 所送來的消息汗销。 3) Message Queue( 消息隊列 ): 用來存放線程放入的消息。 4) 線程: UIthread 通常就是 main thread 抵窒,而 Android 啟動程序時會替它建立一個 MessageQueue 弛针。
Message:消息分為硬件產(chǎn)生的消息(如按鈕、觸摸)和軟件生成的消息李皇;
MessageQueue:消息隊列的主要功能向消息池投遞消息(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對象在不同activity直接傳遞過程中保存在一個叫做“ Binder transaction buffe”的地方卓囚,既然是緩沖區(qū)瘾杭,肯定有大小限制1M。(官方解釋捍岳,對于具體某一次Activity間傳輸?shù)南拗拼笮∈遣淮_定的富寿,依據(jù)使用環(huán)境而定)
該博客“Yet another post on Serializable vs Parcelable”中 Serializable和Parcel時提到以下兩點數(shù)據(jù)睬隶,僅供參考了解,實際使用各有不同
- 使用 Serializable 和parcel傳輸相同對象页徐,都轉(zhuǎn)換為byte[]后苏潜,parcel大概是serializable的20倍了。
- 但是官方建議使用Parcel变勇,原因是說速度是serializable的將近10倍恤左。
11.橫豎屏切換時候Activity的生命周期
1、不設(shè)置Activity的android:configChanges時搀绣,切屏?xí)匦抡{(diào)用各個生命周期飞袋,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次
2链患、設(shè)置Activity的android:configChanges="orientation"時巧鸭,切屏還是會重新調(diào)用各個生命周期,切橫麻捻、豎屏?xí)r只會執(zhí)行一次
3纲仍、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期贸毕,只會執(zhí)行onConfigurationChanged方法
12.dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念
Dvm的進(jìn)程是dalivk虛擬機(jī)進(jìn)程,每個android程序都運行在自己的進(jìn)程里面,每個android程序系統(tǒng)都會給他分配一個單獨的liunx uid(user id),每個dvm都是linux里面的一個進(jìn)程.所以說這兩個進(jìn)程是一個進(jìn)程.
12. 如何在一個Service中啟動一個Activity
Intent intent = new Intent(Service.this,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
13.程序之間的親和性的理解
1郑叠、默認(rèn)情況下一個應(yīng)用的所有Activity都是具有相同的affinity,都是從application中繼承明棍,application的affinity默認(rèn)就是manifest的包名乡革。
2、affinity對Activity來說摊腋,就像是身份證一樣沸版,可以告訴所在的Task,自己屬于其中的一員歌豺。
3推穷、應(yīng)用場合:
a:根據(jù)affinity重新為Activity選擇合適的宿主Task;
b:與allowTaskReparenting屬性配合;
c:啟動Activity使用Intent設(shè)置了FLAG_ACTIVITY_NEW_TASK標(biāo)記。
14.注冊廣播有幾種方式类咧,這些方式有什么特點和區(qū)別?
兩種方式馒铃,首先這兩種方式都要先寫繼承自broadcastreceive的類
答: 第一種:在清單文件中聲明,添加
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二種使用代碼進(jìn)行注冊如:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver,filter);
兩種注冊類型的區(qū)別是:
1)第二種不是常駐型廣播,也就是說廣播跟隨程序的生命周期痕惋。
2)第一種是常駐型区宇,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來值戳,程序也會被系統(tǒng)調(diào)用自動運行议谷。
15.Activity A 啟動 Activity B 時一系列操作的發(fā)生順序
Activity A 的 onPause方法執(zhí)行。
Activity B 的 onCreate堕虹、onStart和 onResume方法依次執(zhí)行卧晓。
然后芬首,如果 Activity A 在屏幕上不再可見,則其 onStop方法執(zhí)行逼裆。
您可以利用這種可預(yù)測的生命周期回調(diào)順序管理從一個 Activity 到另一個 Activity 的信息轉(zhuǎn)變郁稍。 例如,如果您必須在第一個 Activity 停止時向數(shù)據(jù)庫寫入數(shù)據(jù)胜宇,以便下一個 Activity 能夠讀取該數(shù)據(jù)耀怜,則應(yīng)在 onPause而不是 onStop執(zhí)行期間向數(shù)據(jù)庫寫入數(shù)據(jù).
onPause較容易被觸發(fā),所以我們在做BroadcastReceiver注銷時放在onStop要好些桐愉。onPause時Activity界面仍然是可見的财破,如彈出一個Dialog時。但在保存數(shù)據(jù)時从诲,放在onPause去做可以保證數(shù)據(jù)存儲的有效性左痢,如果放在onStop去做,在某些情況下Activity走完onPause后有可能還沒順利走到onStop就被系統(tǒng)回收了系洛。
16.如何實現(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);
}