這是我近段時間收集的面試題囱稽,獻(xiàn)給打算年后找工作的同學(xué)們。文中涉及的知識比較廣也可能比較零散二跋,并且一些較為基礎(chǔ)的知識我都略去了(比如Android四大組件是什么這類問題)战惊,有些我附上了自己的理解,有些附上了詳細(xì)的相關(guān)文章鏈接扎即。大家挑自己感興趣的內(nèi)容查看即可吞获,后期我也會繼續(xù)不斷補(bǔ)充况凉。
基礎(chǔ)組件篇
橫豎屏切換時Activity的生命周期變化?
1.如果自己沒有配置android:ConfigChanges,這時默認(rèn)讓系統(tǒng)處理各拷,就會重建Activity刁绒,此時Activity的生命周期會走一遍。
onSaveInstanceState() 與onRestoreIntanceState()
資源相關(guān)的系統(tǒng)配置發(fā)生改變或者資源不足:例如屏幕旋轉(zhuǎn)烤黍,當(dāng)前Activity會銷毀知市,并且在onStop之前回調(diào)onSaveInstanceState保存數(shù)據(jù),在重新創(chuàng)建Activity的時候在onStart之后回調(diào)onRestoreInstanceState速蕊。其中Bundle數(shù)據(jù)會傳到onCreate(不一定有數(shù)據(jù))和onRestoreInstanceState(一定有數(shù)據(jù))嫂丙。用戶或者程序員主動去銷毀一個Activity的時候不會回調(diào),其他情況都會調(diào)用规哲,來保存界面信息跟啤。如代碼中finish()或用戶按下back,不會回調(diào)唉锌。
2.如果設(shè)置android:configChanges="orientation|keyboardHidden|screenSize">隅肥,此時Activity的生命周期不會重走一遍,Activity不會重建袄简,只會回調(diào)onConfigurationChanged方法武福。
activity的startActivity和context的startActivity區(qū)別
(1)從Activity中啟動新的Activity時可以直接mContext.startActivity(intent)就好,
(2)如果從其他Context中啟動Activity則必須給intent設(shè)置Flag:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;
mContext.startActivity(intent);
介紹下Android應(yīng)用程序啟動過程
整個應(yīng)用程序的啟動過程要執(zhí)行很多步驟痘番,但是整體來看捉片,主要分為以下五個階段:
? 一. :Launcher通過Binder進(jìn)程間通信機(jī)制通知ActivityManagerService,它要啟動一個Activity汞舱;
? 二.:ActivityManagerService通過Binder進(jìn)程間通信機(jī)制通知Launcher進(jìn)入Paused狀態(tài)伍纫;
? 三.:Launcher通過Binder進(jìn)程間通信機(jī)制通知ActivityManagerService,它已經(jīng)準(zhǔn)備就緒進(jìn)入Paused狀態(tài)昂芜,于是ActivityManagerService就創(chuàng)建一個新的進(jìn)程莹规,用來啟動一個ActivityThread實(shí)例,即將要啟動的Activity就是在這個ActivityThread實(shí)例中運(yùn)行泌神;
? 四. :ActivityThread通過Binder進(jìn)程間通信機(jī)制將一個ApplicationThread類型的Binder對象傳遞給ActivityManagerService良漱,以便以后ActivityManagerService能夠通過這個Binder對象和它進(jìn)行通信;
? 五 :ActivityManagerService通過Binder進(jìn)程間通信機(jī)制通知ActivityThread欢际,現(xiàn)在一切準(zhǔn)備就緒母市,它可以真正執(zhí)行Activity的啟動操作了。
相關(guān)文章:Android應(yīng)用程序啟動過程源代碼分析
如何保證Service不被殺死损趋?
提供進(jìn)程優(yōu)先級患久,降低進(jìn)程被殺死的概率
方法一:監(jiān)控手機(jī)鎖屏解鎖事件,在屏幕鎖屏?xí)r啟動1個像素的 Activity,在用戶解鎖時將 Activity 銷毀掉蒋失。
方法二:啟動前臺service返帕。
方法三:提升service優(yōu)先級:
在AndroidManifest.xml文件中對于intent-filter可以通過android:priority = "1000"這個屬性設(shè)置最高優(yōu)先級,1000是最高值篙挽,如果數(shù)字越小則優(yōu)先級越低荆萤,同時適用于廣播。
在進(jìn)程被殺死后铣卡,進(jìn)行拉活
方法一:注冊高頻率廣播接收器僻爽,喚起進(jìn)程赶站。如網(wǎng)絡(luò)變化兜畸,解鎖屏幕郑诺,開機(jī)等
方法二:雙進(jìn)程相互喚起。
方法三:依靠系統(tǒng)喚起州邢。
方法四:onDestroy方法里重啟service:service +broadcast 方式儡陨,就是當(dāng)service走ondestory的時候,發(fā)送一個自定義的廣播量淌,當(dāng)收到廣播的時候骗村,重新啟動service;
依靠第三方
根據(jù)終端不同呀枢,在小米手機(jī)(包括 MIUI)接入小米推送胚股、華為手機(jī)接入華為推送;其他手機(jī)可以考慮接入騰訊信鴿或極光推送與小米推送做 A/B Test裙秋。
簡述下Acitivty任務(wù)棧和使用方法
任務(wù)棧是一種后進(jìn)先出的結(jié)構(gòu)琅拌。位于棧頂?shù)腁ctivity處于焦點(diǎn)狀態(tài),當(dāng)按下back按鈕的時候,棧內(nèi)的Activity會一個一個的出棧,并且調(diào)用其onDestory()方法。如果棧內(nèi)沒有Activity,那么系統(tǒng)就會回收這個棧,每個APP默認(rèn)只有一個棧,以APP的包名來命名.
1摘刑、standard:默認(rèn)模式:每次啟動都會創(chuàng)建一個新的activity對象进宝,放到目標(biāo)任務(wù)棧中
2、singleTop:判斷當(dāng)前的任務(wù)棧頂是否存在相同的activity對象枷恕,如果存在党晋,則直接使用,如果不存在徐块,那么創(chuàng)建新的activity對象放入棧中
3未玻、singleTask:在任務(wù)棧中會判斷是否存在相同的activity,如果存在胡控,那么會清除該activity之上的其他activity對象顯示扳剿,如果不存在,則會創(chuàng)建一個新的activity放入棧頂
4铜犬、singleIntance:會在一個新的任務(wù)棧中創(chuàng)建activity舞终,并且該任務(wù)棧種只允許存在一個activity實(shí)例轻庆,其他調(diào)用該activity的組件會直接使用該任務(wù)棧種的activity對象
方法一:使用android:launchMode="standard|singleInstance|single Task|singleTop"來控制Acivity任務(wù)棧癣猾。
方法二:Intent Flags:
Intent intent=new Intent();
intent.setClass(MainActivity.this, MainActivity2.class);
intent.addFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Flags有很多敛劝,比如:
Intent.FLAG_ACTIVITY_NEW_TASK? 相當(dāng)于singleTask
Intent. FLAG_ACTIVITY_CLEAR_TOP? 相當(dāng)于singleTop
相關(guān)文章:Android總結(jié)篇系列:Activity Intent Flags及Task相關(guān)屬性
Context相關(guān)問題
Activity和Service以及Application的Context是不一樣的,Activity繼承自ContextThemeWraper.其他的繼承自ContextWrapper.
每一個Activity和Service以及Application的Context都是一個新的ContextImpl對象getApplication()用來獲取Application實(shí)例的,但是這個方法只有在Activity和Service中才能調(diào)用的到纷宇。那么也許在絕大多數(shù)情況下我們都是在Activity或者Service中使用Application的夸盟,但是如果在一些其它的場景,比如BroadcastReceiver中也想獲得Application的實(shí)例像捶,這時就可以借助getApplicationContext()方法.
getApplicationContext()比getApplication()方法的作用域會更廣一些上陕,任何一個Context的實(shí)例,只要調(diào)用getApplicationContext()方法都可以拿到我們的Application對象拓春。
Context的數(shù)量等于Activity的個數(shù) + Service的個數(shù) + 1释簿,這個1為Application.
那Broadcast Receiver,Content Provider呢硼莽?Broadcast Receiver庶溶,Content Provider并不是Context的子類,他們所持有的Context都是其他地方傳過去的懂鸵,所以并不計入Context總數(shù)偏螺。
怎么在Service中創(chuàng)建Dialog對話框
1.在我們?nèi)〉肈ialog對象后,需給它設(shè)置類型匆光,即:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
2.在Manifest中加上權(quán)限:
View篇
非UI線程可以更新UI嗎?
可以
當(dāng)訪問UI時套像,ViewRootImpl會調(diào)用checkThread方法去檢查當(dāng)前訪問UI的線程是哪個,如果不是UI線程則會拋出異常執(zhí)行onCreate方法的那個時候ViewRootImpl還沒創(chuàng)建终息,無法去檢查當(dāng)前線程.ViewRootImpl的創(chuàng)建在onResume方法回調(diào)之后.
voidcheckThread() {if(mThread != Thread.currentThread()) {? ? ? ? throw new CalledFromWrongThreadException("Only the original thread that created a view hierarchy can touch its views.");? ? }}
非UI線程是可以刷新UI的夺巩,前提是它要擁有自己的ViewRoot,即更新UI的線程和創(chuàng)建ViewRoot是同一個,或者在執(zhí)行checkThread()前更新UI.
相關(guān)文章:Android子線程真的不能更新UI么
解決ScrollView嵌套ListView和GridView沖突的方法
重寫ListView的onMeasure方法,來自定義高度:
@Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
? ? ? ? super.onMeasure(widthMeasureSpec, expandSpec);
? ? }
主要考察對MeasureSpec的三種模式的理解,相關(guān)文章.
自定義View優(yōu)化策略
為了加速你的view周崭,對于頻繁調(diào)用的方法劲够,需要盡量減少不必要的代碼。先從onDraw開始休傍,需要特別注意不應(yīng)該在這里做內(nèi)存分配的事情征绎,因?yàn)樗鼤?dǎo)致GC,從而導(dǎo)致卡頓磨取。在初始化或者動畫間隙期間做分配內(nèi)存的動作人柿。不要在動畫正在執(zhí)行的時候做內(nèi)存分配的事情。
你還需要盡可能的減少onDraw被調(diào)用的次數(shù)忙厌,大多數(shù)時候?qū)е耾nDraw都是因?yàn)檎{(diào)用了invalidate().因此請盡量減少調(diào)用invaildate()的次數(shù)凫岖。如果可能的話,盡量調(diào)用含有4個參數(shù)的invalidate()方法而不是沒有參數(shù)的invalidate()逢净。沒有參數(shù)的invalidate會強(qiáng)制重繪整個view哥放。
另外一個非常耗時的操作是請求layout歼指。任何時候執(zhí)行requestLayout(),會使得Android UI系統(tǒng)去遍歷整個View的層級來計算出每一個view的大小甥雕。如果找到有沖突的值踩身,它會需要重新計算好幾次。另外需要盡量保持View的層級是扁平化的社露,這樣對提高效率很有幫助挟阻。
如果你有一個復(fù)雜的UI,你應(yīng)該考慮寫一個自定義的ViewGroup來執(zhí)行他的layout操作峭弟。與內(nèi)置的view不同附鸽,自定義的view可以使得程序僅僅測量這一部分,這避免了遍歷整個view的層級結(jié)構(gòu)來計算大小瞒瘸。這個PieChart 例子展示了如何繼承ViewGroup作為自定義view的一部分坷备。PieChart 有子views,但是它從來不測量它們情臭。而是根據(jù)他自身的layout法則省撑,直接設(shè)置它們的大小。
線程篇
Handler谎柄、Message丁侄、Looper、MessageQueue
一朝巫、相關(guān)概念的解釋
主線程(UI線程)
定義:當(dāng)程序第一次啟動時鸿摇,Android會同時啟動一條主線程(Main Thread)作用:主線程主要負(fù)責(zé)處理與UI相關(guān)的事件
Message(消息)
定義:Handler接收和處理的消息對象(Bean對象)
作用:通信時相關(guān)信息的存放和傳遞
ThreadLocal
定義:ThreadLocal是線程內(nèi)部的存儲類,通過它可以實(shí)現(xiàn)在每個線程中存儲自己的私有數(shù)據(jù)劈猿。即數(shù)據(jù)存儲以后拙吉,只能在指定的線程中獲取這個存儲的對象,而其它線程則不能獲取到當(dāng)前線程存儲的這個對象揪荣。
作用:負(fù)責(zé)存儲和獲取本線程的Looper
MessageQueue(消息隊(duì)列)
定義:采用單鏈表的數(shù)據(jù)結(jié)構(gòu)來存儲消息列表
作用:用來存放通過Handler發(fā)過來的Message筷黔,按照先進(jìn)先出執(zhí)行
Handler(處理者)
定義:Message的主要處理者
作用:負(fù)責(zé)發(fā)送Message到消息隊(duì)列&處理Looper分派過來的Message
Looper(循環(huán)器)
定義:扮演Message Queue和Handler之間橋梁的角色
作用:消息循環(huán):循環(huán)取出Message Queue的Message消息派發(fā):將取出的Message交付給相應(yīng)的Handler
2、自己畫下圖解
need-to-insert-img
3仗颈、Handler發(fā)送消息有哪幾種方式佛舱?
一、sendMessage(Message msg)
二挨决、post(Ruunable r)
4请祖、Handler處理消息有哪幾種方式?
這個直接看dispatchMessage()源碼:
publicvoiddispatchMessage(Message msg){if(msg.callback !=null) {//1. post()方法的處理方法handleCallback(msg);? ? }else{if(mCallback !=null) {if(mCallback.handleMessage(msg)) {return;? ? ? ? ? ? }? ? ? ? }//2. sendMessage()方法的處理方法handleMessage(msg);? ? }}//1. post()方法的最終處理方法privatestaticvoidhandleCallback(Message message){? ? message.callback.run();}//2. sendMessage()方法的最終處理方法publicvoidhandleMessage(Message msg){}
5.Message脖祈、Handler肆捕、MessageQueue、Looper的之間的關(guān)系盖高?
首先慎陵,是這個MessagQueue眼虱,MessageQueue是一個消息隊(duì)列,它可以存儲Handler發(fā)送過來的消息席纽,其內(nèi)部提供了進(jìn)隊(duì)和出隊(duì)的方法來管理這個消息隊(duì)列捏悬,其出隊(duì)和進(jìn)隊(duì)的原理是采用單鏈表的數(shù)據(jù)結(jié)構(gòu)進(jìn)行插入和刪除的,即enqueueMessage()方法和next()方法胆筒。這里提到的Message邮破,其實(shí)就是一個Bean對象诈豌,里面的屬性用來記錄Message的各種信息仆救。
然后,是這個Looper矫渔,Looper是一個循環(huán)器彤蔽,它可以循環(huán)的取出MessageQueue中的Message,其內(nèi)部提供了Looper的初始化和循環(huán)出去Message的方法庙洼,即prepare()方法和loop()方法顿痪。在prepare()方法中,Looper會關(guān)聯(lián)一個MessageQueue油够,而且將Looper存進(jìn)一個ThreadLocal中蚁袭,在loop()方法中,通過ThreadLocal取出Looper石咬,使用MessageQueue的next()方法取出Message后揩悄,判斷Message是否為空,如果是則Looper阻塞鬼悠,如果不是删性,則通過dispatchMessage()方法分發(fā)該Message到Handler中,而Handler執(zhí)行handlerMessage()方法焕窝,由于handlerMessage()方法是個空方法蹬挺,這也是為什么需要在Handler中重寫handlerMessage()方法的原因。這里要注意的是Looper只能在一個線程中只能存在一個它掂。這里提到的ThreadLocal巴帮,其實(shí)就是一個對象,用來在不同線程中存放對應(yīng)線程的Looper虐秋。
最后榕茧,是這個Handler,Handler是Looper和MessageQueue的橋梁熟妓,Handler內(nèi)部提供了發(fā)送Message的一系列方法雪猪,最終會通過MessageQueue的enqueueMessage()方法將Message存進(jìn)MessageQueue中。我們平時可以直接在主線程中使用Handler起愈,那是因?yàn)樵趹?yīng)用程序啟動時只恨,在入口的main方法中已經(jīng)默認(rèn)為我們創(chuàng)建好了Looper译仗。
相關(guān)文章:blog.csdn.net/qq_30379689…
6.為什么在子線程中創(chuàng)建Handler會拋異常?
Handler的工作是依賴于Looper的官觅,而Looper(與消息隊(duì)列)又是屬于某一個線程(ThreadLocal是線程內(nèi)部的數(shù)據(jù)存儲類纵菌,通過它可以在指定線程中存儲數(shù)據(jù),其他線程則無法獲取到)休涤,其他線程不能訪問咱圆。因此Handler就是間接跟線程是綁定在一起了。因此要使用Handler必須要保證Handler所創(chuàng)建的線程中有Looper對象并且啟動循環(huán)功氨。因?yàn)樽泳€程中默認(rèn)是沒有Looper的序苏,所以會報錯。
正確的使用方法是:
privatefinalclassWorkThreadextendsThread{privateHandler mHandler;publicHandlergetHandler(){returnmHandler;? ? ? ? }publicvoidquit(){? ? ? ? ? ? mHandler.getLooper().quit();? ? ? ? }@Overridepublicvoidrun(){super.run();//創(chuàng)建該線程對應(yīng)的Looper,// 內(nèi)部實(shí)現(xiàn)// 1捷凄。new Looper()// 2忱详。將1步中的lopper 放在ThreadLocal里,ThreadLocal是保存數(shù)據(jù)的跺涤,主要應(yīng)用場景是:線程間數(shù)據(jù)互不影響的情況// 3匈睁。在1步中的Looper的構(gòu)造函數(shù)中new MessageQueue();//其實(shí)就是創(chuàng)建了該線程對用的Looper,Looper里創(chuàng)建MessageQueue來實(shí)現(xiàn)消息機(jī)制//對消息機(jī)制不懂得同學(xué)可以查閱資料桶错,網(wǎng)上很多也講的很不錯航唆。Looper.prepare();? ? ? ? ? ? mHandler =newHandler() {@OverridepublicvoidhandleMessage(Message msg){super.handleMessage(msg);? ? ? ? ? ? ? ? ? ? Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) +","+ msg.what);? ? ? ? ? ? ? ? }? ? ? ? ? ? };//開啟消息的死循環(huán)處理即:dispatchMessageLooper.loop();//注意這3個的順序不能顛倒Log.d("WorkThread","end");? ? ? ? }? ? }
HandlerThread
1、HandlerThread作用
當(dāng)系統(tǒng)有多個耗時任務(wù)需要執(zhí)行時院刁,每個任務(wù)都會開啟一個新線程去執(zhí)行耗時任務(wù)糯钙,這樣會導(dǎo)致系統(tǒng)多次創(chuàng)建和銷毀線程,從而影響性能黎比。為了解決這一問題超营,Google提供了HandlerThread,HandlerThread是在線程中創(chuàng)建一個Looper循環(huán)器阅虫,讓Looper輪詢消息隊(duì)列演闭,當(dāng)有耗時任務(wù)進(jìn)入隊(duì)列時,則不需要開啟新線程颓帝,在原有的線程中執(zhí)行耗時任務(wù)即可米碰,否則線程阻塞。
2购城、HanlderThread的優(yōu)缺點(diǎn)
HandlerThread本質(zhì)上是一個線程類吕座,它繼承了Thread;
HandlerThread有自己的內(nèi)部Looper對象瘪板,可以進(jìn)行l(wèi)ooper循環(huán)吴趴;
通過獲取HandlerThread的looper對象傳遞給Handler對象,可以在handleMessage()方法中執(zhí)行異步任務(wù)侮攀。
創(chuàng)建HandlerThread后必須先調(diào)用HandlerThread.start()方法锣枝,Thread會先調(diào)用run方法厢拭,創(chuàng)建Looper對象。
HandlerThread優(yōu)點(diǎn)是異步不會堵塞撇叁,減少對性能的消耗
HandlerThread缺點(diǎn)是不能同時繼續(xù)進(jìn)行多任務(wù)處理供鸠,需要等待進(jìn)行處理,處理效率較低
HandlerThread與線程池不同陨闹,HandlerThread是一個串行隊(duì)列楞捂,背后只有一個線程。
相關(guān)文章:Android 多線程之IntentService 完全詳解
IntentService
它本質(zhì)是一種特殊的Service,繼承自Service并且本身就是一個抽象類
它可以用于在后臺執(zhí)行耗時的異步任務(wù)趋厉,當(dāng)任務(wù)完成后會自動停止
它擁有較高的優(yōu)先級寨闹,不易被系統(tǒng)殺死(繼承自Service的緣故),因此比較適合執(zhí)行一些高優(yōu)先級的異步任務(wù)
它內(nèi)部通過HandlerThread和Handler實(shí)現(xiàn)異步操作
創(chuàng)建IntentService時觅廓,只需實(shí)現(xiàn)onHandleIntent和構(gòu)造方法鼻忠,onHandleIntent為異步方法涵但,可以執(zhí)行耗時操作
即使我們多次啟動IntentService杈绸,但I(xiàn)ntentService的實(shí)例只有一個,這跟傳統(tǒng)的Service是一樣的矮瘟,最終IntentService會去調(diào)用onHandleIntent執(zhí)行異步任務(wù)瞳脓。
當(dāng)任務(wù)完成后,IntentService會自動停止澈侠,而不需要手動調(diào)用stopSelf()劫侧。另外,可以多次啟動IntentService哨啃,每個耗時操作都會以工作隊(duì)列的方式在IntentService中onHandlerIntent()回調(diào)方法中執(zhí)行烧栋,并且每次只會執(zhí)行一個工作線程。
相關(guān)文章:Android 多線程之IntentService 完全詳解
AsyncTask
1拳球、AsyncTask是什么
AsyncTask是一種輕量級的異步任務(wù)類审姓,它可以在線程池中執(zhí)行后臺任務(wù),然后把執(zhí)行的進(jìn)度和最終結(jié)果傳遞給主線程并主線程中更新UI祝峻,通過AsyncTask可以更加方便執(zhí)行后臺任務(wù)以及在主線程中訪問UI魔吐,但是AsyncTask并不適合進(jìn)行特別耗時的后臺任務(wù),對于特別耗時的任務(wù)來說莱找,建議使用線程池酬姆。
2、AsyncTask使用方法
三個參數(shù)
Params:表示后臺任務(wù)執(zhí)行時的參數(shù)類型奥溺,該參數(shù)會傳給AysncTask的doInBackground()方法
Progress:表示后臺任務(wù)的執(zhí)行進(jìn)度的參數(shù)類型辞色,該參數(shù)會作為onProgressUpdate()方法的參數(shù)
Result:表示后臺任務(wù)的返回結(jié)果的參數(shù)類型,該參數(shù)會作為onPostExecute()方法的參數(shù)
五個方法
onPreExecute():異步任務(wù)開啟之前回調(diào)浮定,在主線程中執(zhí)行
doInBackground():執(zhí)行異步任務(wù)相满,在線程池中執(zhí)行
onProgressUpdate():當(dāng)doInBackground中調(diào)用publishProgress時回調(diào)诱篷,在主線程中執(zhí)行
onPostExecute():在異步任務(wù)執(zhí)行之后回調(diào),在主線程中執(zhí)行
onCancelled():在異步任務(wù)被取消時回調(diào)
3雳灵、AsyncTask引起的內(nèi)存泄漏
原因:非靜態(tài)內(nèi)部類持有外部類的匿名引用棕所,導(dǎo)致Activity無法釋放解決:AsyncTask內(nèi)部持有外部Activity的弱引用AsyncTask改為靜態(tài)內(nèi)部類Activity的onDestory()中調(diào)用AsyncTask.cancel()
4.結(jié)果丟失
屏幕旋轉(zhuǎn)或Activity在后臺被系統(tǒng)殺掉等情況會導(dǎo)致Activity的重新創(chuàng)建,之前運(yùn)行的AsyncTask會持有一個之前Activity的引用悯辙,這個引用已經(jīng)無效琳省,這時調(diào)用onPostExecute()再去更新界面將不再生效。
5躲撰、AsyncTask并行or串行
AsyncTask在Android 2.3之前默認(rèn)采用并行執(zhí)行任務(wù)针贬,AsyncTask在Android 2.3之后默認(rèn)采用串行執(zhí)行任務(wù)如果需要在Android 2.3之后采用并行執(zhí)行任務(wù),可以調(diào)用AsyncTask的executeOnExecutor();
6.AsyncTask內(nèi)部的線程池
private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
sDefaultExecutor是SerialExecutor的一個實(shí)例拢蛋,而且它是個靜態(tài)變量桦他。也就是說,一個進(jìn)程里面所有AsyncTask對象都共享同一個SerialExecutor對象谆棱。
相關(guān)文章:android多線程-AsyncTask之工作原理深入解析
一些面試心經(jīng)
一般情況下第一輪都是基礎(chǔ)面試快压,需要扎實(shí)的基礎(chǔ)
最常用的Android 基礎(chǔ)知識
Java 基礎(chǔ)知識
了解一些 常用東西的原理,例如:handler垃瞧, thread 等
項(xiàng)目中的技術(shù)點(diǎn)
第二輪的時候需要了解更深層次的東西
Android 事件分發(fā)機(jī)制原理
Android 繪圖機(jī)制原理
WindowManager 的相關(guān)知識
進(jìn)程間傳輸方式
Java 內(nèi)存管理機(jī)制
一些常用的 list,map 原理蔫劣,以及子類之間的差別
能進(jìn)入第三輪基本沒什么問題,但是要注意以下問題
該輪一般是 老大或者部門負(fù)責(zé)人个从,問的問題一般都看 深度與廣度當(dāng)問及薪水的時候脉幢,要說一個合適的,小公司隨意嗦锐,大公司一定要慎重嫌松,當(dāng)心里沒底的時候,可以告訴對方奕污,讓對方給一個合理的薪資萎羔。一般都是在原工資基礎(chǔ)之上增長,聽獵頭說一般漲幅都在15%-30%菊值,超 NB 的可以要30%及以上外驱,如果感覺自己還不錯的,挺厲害的腻窒,建議最高20%昵宇,一般人就定在15% 左右最靠譜。公司內(nèi)部一般有一套機(jī)制儿子,根據(jù)公司情況而定瓦哎。
我們的面試原則就是拿到合理薪資,得到 offer
個人發(fā)展情況,這個問題很難回答蒋譬,如果和公司方向不符合割岛,極有可能和公司無緣。建議多試探性的問問公司缺少什么犯助,你能否給予公司對應(yīng)的東西癣漆。當(dāng)然對于有自我追求的人,那可以放心大膽的提剂买。我的方向就是架構(gòu)師惠爽,哈哈哈,挺極端的瞬哼,別學(xué)我哦婚肆。我感覺選擇都是雙向的,因此我知道自己需要的是什么坐慰。
你最擅長什么UI 還是其他什么较性?這個問題更不好回答。你要說你擅長 UI结胀,是不是意味著你其他能力就不行赞咙?雖然我不知道面試官的用意,但是我能感覺到把跨,這個問題不是那么好回答人弓,我會回答說自己都行,來什么業(yè)務(wù)接什么需求着逐。可能回答不太好意蛀,總之和公司的職位吻合就行耸别,這樣總不至于出錯吧。
摘自文章:一個五年Android開發(fā)者百度县钥、阿里秀姐、聚美、映客的面試心經(jīng)
簡歷模板推薦:
更多面試題庫:
www.jackywang.tech/AndroidInte…
Android 2018 最新面試題(3-5年經(jīng)驗(yàn)個人面試經(jīng)歷)
網(wǎng)站
作者:大頭呆
鏈接:https://juejin.im/post/5a82a07df265da4e7071c78f
來源:掘金
著作權(quán)歸作者所有省有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處谴麦。