1、Android 基礎面試 https://www.jianshu.com/p/ffe7e0561c85?tdsourcetag=s_pcqq_aiomsg(還須要總結知識)html
https://blog.csdn.net/songzi1228/article/details/99975018 (多線程的總結)java
https://www.jianshu.com/p/90db19b4c98a (大佬的博客園來觀看使用)web
1.Activity異常的生命週期處理 面試
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
異常或者系統內存不足會調用該方法
2.Fragment的生命週期
Fragment的生命週期算法
3.SingleTask的啓動模式數據庫
能夠將不一樣的APP的activity中設置爲相同的taskAffinity,雖然在兩個應用當中可是他們會被分配到同一個Task中編程
4. View的事件分發機制數組
2、異步消息處理機制瀏覽器
1. 主線程中調用Loop,那麼爲何沒有形成阻塞呢?
ActivityThread的Main方法裏面有個Loop的消息隊列,ActivityThread 有個 getHandler 方法,獲得這個 handler 就能夠發送消息,而後 loop 裏就分發消息,而後就發給 handler, 緩存
而後就執行到 H(Handler )裏的對應代碼。因此說ActivityThread的main方法主要就是作消息循環,一旦退出消息循環,那麼你的程序也就能夠退出了,因此這些代碼就不會卡死。
2. AsyncTask
1). 組成:線程池+Handler
2). Sting : 指的是doInBackgroud的參數類型
String : 指的是onProgressUpdate的參數類型
Long : 指的是onPostExecute的方法的參數以及doInBackground的返回參數
public class AsynctaskText extends AsyncTask<String , String , Long>{
/**
* 運行在UI線程中,在調用doInBackground以前運行的,能夠作一些控件初始化
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
*後臺運行的方法,運行在非ui線程中,能夠執行耗時操做
*/
@Override
protected Long doInBackground(String... strings) {
return null;
}
/**
*在doBackground裏面會執行onProgressUpdate這個函數
*/
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
/**
*運行在ui線程,在doInBackground以後去執行的,
*/
@Override
protected void onPostExecute(Long integer) {
super.onPostExecute(integer);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
}
execute和executeOnExecutor的區別
execute : Execute方法是串行執行,須要一個一個去執行
executeOnExecutor : 並行執行,須要添加線程池參數, 任務能夠同步進行
3、VIew繪製相關知識
1. window、surface、decorview
window : 是對咱們Android系統當中窗口的一種抽象類,PhoneWindow是Window窗口的一個實現類。
DecorView : 是咱們應用窗口的一個根容器(本質上是一個FreamLayout),主要包含兩個參數TitleView 和 ContentView
surface : 是窗口獨佔一個surface的寫實區域
3. ListView滑動時候爲何不會發生OOM的緣由(RecycleBin的機制) : 將離開屏幕外的view刪除而且存放到RecycleBin這個類裏面,當準備展現下一個view的時候,它會從RecycleBin裏面取出一個scrapView,而後就將它設置爲converVIew的參數進行判斷是否已經設置過,從getView裏面有這個方法
從而到達view複用的做用
4.ListView的性能優化5個優化點:
1). converView
2).viewHolder
3).getVIew儘可能少作耗時的操做(當滑動中止時候再去加載圖片)
4).ListVIew中的item元素避免半透明
5).開啓硬件加速
4、 異常與性能
1. 如何產生ANR
a). View的按鍵或者觸摸事件在5秒沒有獲得迴應
b). BroadcastReciver的onReceive()函數運行在了主線程中,在10秒內沒法完成處理
c).Service的各個生命週期函數在20秒內沒法完成處理
2. 如何解決ANR
a). 使用AsyncTask處理IO的耗時操做
b). 使用Thread或者HandlerThread提供異步操做
c). 使用Handler來處理工做線程的耗時操做
d). Activity裏面的全部生命週期都是在主線程中,避免寫大量的耗時操做
3. OOM容易混淆的概念
內存溢出:咱們申請的內存已經超出虛擬機的最大內存的限度就會拋出Out Of memory
內存抖動 : 短期大量的對象被建立而後就釋放,觸發的GC機制,嚴重佔用內存區。
內存泄露 : 咱們要回收的對象沒法進行GC的回收操做
4. bitmap的講解
(1).Bitmap的模型: Android 2.3.3以前,Bitmap的像素數據存放在Native內存,而Bitmap對象自己則存放在Dalvik Heap中。而在Android3.0以後,Bitmap的像素數據也被放在了Dalvik Heap中。
(2).在Android2.3.3以前推薦使用Bitmap.recycle()方法進行Bitmap的內存回收; 在Android3.0以後更注重對Bitmap的複用
(3). recycle 的方法: 它既回收JAVA的內存也回收native的內存,這個對象之後就不會再被調用了。當你沒有對象時候就會有GC去回收它,建議不要主動去調用它(快速截屏)
(4).inBitmap參數的好處 : 前提是舊的inBitmap大小>=新的inBitmap的大小,不然不能複用。
(5). LRU的算法 : 內部使用LinkedHashMap做爲緩存, get和put完成添加和獲取的操做,HashMap的remove方法來移除對象,當內部緩存滿的時候,會調用trimToSize把較早或者使用最少的緩存對象移除出去,添加新的對象。
(6). 三級緩存 : 網絡->本地->內存
原理:第一次打開app時候,圖片首先從網絡得到,而後再本地和內存各緩存一份,再去請求相同的url的時候,就會去本地或者內存去找
(7). 圖片產生OOM的緣由
a.一個頁面加載過多圖片
b. 加載圖片沒有進行對圖片尺寸、質量進行壓縮
c.加載大量圖片時候作圖片緩存
(8) . 圖片的種類
PNG : 無損壓縮格式,支持透明通道
JPEG : 有損壓縮格式,不支持透明通道
WEBP : 既支持有損壓縮也支持無損壓縮,也支持透明通道
GIF : 支持多幀動畫
(9). 超大圖片加載方案
可使用BitMapRegionDecoder
5. UI卡頓的講解
1). UI卡頓緣由分析
(1).在UI線程中作輕微的耗時操做,致使UI卡頓
(2).佈局Layout過於複雜,沒法在16ms內完成渲染(從佈局上),可使用include、merage、view-stub這樣標籤做爲處理,佈局過於複雜使用自定義view
(3).同一時間動畫執行次數太多,致使CPU或GPU負載太重
(4).View的過分繪製,致使某些像素在同一幀時間內過分繪製屢次,從而讓CPU或者GPU太重(從代碼上) ----->自定義view使用clipRect來屏蔽被遮蓋的view繪製
(5).冗餘的資源或者邏輯致使加載過慢
(6).避免在onDraw裏面執行對象的建立(這樣會產生內存抖動)
(7).圖片顯示(監聽ListView滑動時候,就不要加載圖片,當監聽到中止時候,再去加載圖片)
6.常見內存泄露案例
1.單例:長生命週期的對象(Application的對象)持有短生命週期的對象(是指Activity的對象)---->解決getApplicationContext()
2. handler : 非靜態內部類持有外部類的引用,致使於沒法釋放外部類的對象---->解決方法將handler至於爲static的對象,而後將外部類改成弱引用來使用
3.線程引發: AsyncTask和Runnable使用匿名內部類,由於非靜態內部類持有外部類的引用,和handler相似
4.文件的讀寫、數據庫網絡啓用後沒有關閉
5.註冊廣播沒有關閉廣播
7.內存管理
(1).分配機制
(2).回收機制
五大進程:前臺進程、可見進程、服務進程、後臺進程、空進程
(3).內存優化
當Service完成任務後,儘可能中止它(可使用IntentService)----->它是在異步線程中執行的,用完後它會自動釋放對象的
避免濫用Bitmap致使內存的浪費
儘可能少使用枚舉常量,可使用註解方法
使用多進程來分擔主內存耗時
8.冷啓動優化
5、開源框架的學習
1.AOP的切面編程(目前做爲了解使用)
(1).註解使用先關介紹
@Before 前置通知,至關於BeforeAdvice
@AfterReturning 後置通知,至關於AfterReturningAdvice
@Around 環繞通知,至關於MethodInterceptor
@AfterThrowing拋出通知,至關於ThrowAdvice
@After 最終final通知,無論是否異常,該通知都會執行
@DeclareParents 引介通知,至關於IntroductionInterceptor (瞭解)
(2). JoinPoint 鏈接點對象能夠得到參數講解
目標對象:getTarget()
得到方法簽名:getSignature()
得到方法名稱:getSignature().getName()
得到實際參數:getArgs()
得到當前指定方法的類型:getKind()
案例1:性能監控
@Aspect
public class PerformanAop {
@Around("call(* com.example.mi.okhttp.MainActivity.**(..))")
public void getTime(ProceedingJoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
String name = signature.toShortString();
long time = System.currentTimeMillis();
try {
joinPoint.proceed(); ----------------->執行該程序的方法
} catch (Throwable throwable) {
throwable.printStackTrace();
}
Log.d("ceshi", name + "=" + (System.currentTimeMillis() - time));
}
}
2.MVC的架構的介紹
C層 : 頁面和數據交互,耦合程度高,不利於解耦
3.MVP的架構介紹
MVP的特色:
Presenter徹底將Model和View解耦,主要邏輯處於Presenter中;Presenter和具體View沒有直接關聯,都是經過接口進行交互。
View變動時候,能夠保持Presenter不變,因此Model和View已經徹底解耦
MVP的優勢:
低耦合:Model、VIew層的變換不回影響到對方
可重用性:Model層可用於多個View
方便測試:能夠單獨多Model和VIew層單獨測試
MVP的缺點:
當有一個很大的複雜頁面,這樣接口機會新增長不少接口,致使維護成本很大。
解決方法:把一些通用的接口做爲基類,其餘接口去繼承
4.MVC和MVP流程的大體區別
5.MVVM的數據模型
MVVM的特色:
ViewModel和Model/View進行雙向綁定,View 發生改變時候,ViewModel會通知Model更新數據;Model數據更新時候,ViewModel會通知View更新顯示
6.插件化模型(學習反射)主要解決
(1).動態加載 DexClassLoader、PathClassLoader學習(動態加載app)
(2).動態加載資源文件 AssetManager 動態加載資源文件
(3).代碼的加載
7.熱修復模型
(1).Android 類加載機制
PathClassLoader : 加載內存中已經安裝的apk中的dex
DexClassLoader : 加載sd卡中的apk/jar
(2).熱修復機制(經過向dexElements數組插入dex來完成熱修復)
dexElements數組、ClassLoader會遍歷dexElements這個數組
原理:dexElements數組會在基類的BaseClassLoader中創造好,DexClassLoader和PathClassLoade
都是繼承BaseClassLoader這個類的,經過ClassLoader去遍歷dexElements數組,加載這個數組
dex文件,若是BaseClassLoader加載到正確的dex文件後,就不會再去加載有crash的dex文件了,
把正確的dex文件排在dexElements數組前面便可。
8.進程保活的實現
(1).Android的進程優先級:前臺優先級、可見進程、服務進程、後臺進程、空進程(主要爲了作緩存、縮短下次啓動時間)
(2).進程保活方案
a.利用系統廣播拉活
缺點:當只有在特定場景下才能夠拉起保活,下次被殺死後,沒法獲得控制
b.利用系統Service機制拉活 : onStartCommand方法,返回START_STICKY
缺點:在短期內被屢次殺死就不會被拉活、被root或者其餘工具被stop也是沒法拉活的
c.經過native進程拉活(經過AMS的進程殺死)
d.進程相互喚醒(打開一個app同時喚醒另外一個app)
e.提高Service進程優先級,好比改成前臺進程 startForeground(1,notification)
f.JobScheduler用來檢測你本身的服務是否被殺掉,若是被殺掉了,你重啓本身的服務 缺點:須要有自啓動權限
6、Java基礎面試
1.synchronized(悲觀鎖)和lock的區別
synchronzied 同步代碼塊底層原理 : monitorenter指向同步代碼塊的開始位置,monitorexit指向同步代碼塊的結束位置
線程執行到monitorenter指令時,該線程對象持有鎖,即線程得到monitor持有權,count計數器+1,得到線程鎖
線程執行完畢後,執行monitorexit執行指令,count爲0,釋放鎖。 注意:不管是正常結束仍是異常結束,都會執行monitorexit指令
synchronized 的同步方法的底層原理 : ACC_SYNCHRONIZED的flag標記該方法是不是同步方法,從而執行相應的同步調用
2.sleep和wait(notify)區別
sleep是Thread的內部的一個靜態方法,能夠再任何地方調用;wait是Object成員方法,只能在synchroized代碼中被調用,其餘地方調用會非法監控異常
在等待時候,wait是釋放鎖的,用於線程交互;sleep會一直持有鎖,不會改變鎖的狀態,用於線程切換cpu的狀態
3.lock、synchronized 和 volatile的區別
synchronized 和 volatile 的區別
volatile只能在線程內存和主內存之間存一個變量值,synchronized能夠修飾類、對象、方法等,可是synchronized很消耗內存
volatile的理解:具備可見性、有序性,不具有原子性、禁止指令重排。 volatile修飾的變量會強制把數值寫入主內存中
synchronized 和 lock 的區別
synchronized是Java的關鍵字,Lock是接口
synchronized是自動釋放鎖,Lock須要手動釋放鎖,因此寫到try catch中而且在finally中釋放鎖
synchronized沒法中斷等待的鎖,Lock能夠中斷,它能夠在激烈的讀寫操做
4.線程池工做流程:
(1).首先判斷線程池是否已經滿了
(2).其次是判斷工做隊列是否已經滿了
(3).最後判斷整個線程池是否滿了
五種線程池、四種拒絕策略、三種阻塞隊列
五種線程池
threadPool = Executors.newCachedThreadPool(); //有緩衝的線程池,線程數 JVM 控制
threadPool = Executors.newFixedThreadPool(3); //固定大小的線程池,支持線程池併發
threadPool = Executors.newScheduledThreadPool(2); //固定大小的線程池,支持定時或者週期執行任務
threadPool = Executors.newSingleThreadExecutor(); //單線程的線程池,只有一個線程在工做
threadPool = new ThreadPoolExecutor(); //默認線程池,可控制參數比較多
四種拒絕策略
rejected = new ThreadPoolExecutor.AbortPolicy(); //默認,隊列滿了丟任務拋出異常
rejected = new ThreadPoolExecutor.DiscardPolicy(); //隊列滿了丟任務不異常
rejected = new ThreadPoolExecutor.DiscardOldestPolicy(); //將最先進入隊列的任務刪,以後再嘗試加入隊列
rejected = new ThreadPoolExecutor.CallerRunsPolicy(); //若是添加到線程池失敗,那麼主線程會本身去執行該任務
三種阻塞隊列
有限隊列
ArrayBlockingQueue<>(5); //基於數組的先進先出隊列,有界
SynchronousQueue<>(); //無緩衝的等待隊列,無界 適用於newCachedThreadPool線程池
無限隊列
LinkedBlockingQueue<>(); //基於鏈表的先進先出隊列,無界 適用於newFixedThreadPool、newScheduledThreadPool
參數講解:
* corePoolSize:核心線程池大小
* maximumPoolSize:最多線程池大小
* keepAliveTime:表示空閒線程的存活時間
* unit:keepAliveTime時間單位
* workQueue:阻塞任務隊列
* threadFactory:新建線程工廠
* RejectedExecutionHandler:保護策略
5.throw和throws的區別
throw : 用在方法體內,跟的是對象名,throw拋出異常,必定會拋出某種異常
throws : 用在方法後面,跟的是類名,它拋出的異常只是一種可能性,並不必定會拋出異常的
6.final、finalize、finally的關鍵字的區別
final : 修飾符,能夠修飾類,不能再派生新的子類也不能做爲父類被繼承 ; 能夠修飾變量,該變量的數值就不能修改
finally : try ... catch 語句中使用
finalize : 在垃圾回收時候使用,被清理對象沒有被引用的狀況下調用的。
7.註解相關介紹
1.Retention : 定義註解保留的時間
RetentionPolicy.SOURCE 註解只保留在源碼,在編譯器進行編譯時會被忽略
RetentionPolicy.CLASS 註解由編譯器保存在class文件中,但不須要在運行時由VM保留,沒法經過反射讀取,這是默認的策略。
RetentionPolicy.RUNTIME 註解由編譯器保存在class文件中,並在運行時由VM保留,能夠經過反射讀取。
2.Target : 修飾對象的範圍
ElementType.TYPE:容許被修飾的註解做用在類、接口和枚舉上
ElementType.FIELD:容許做用在屬性字段上
ElementType.METHOD:容許做用在方法上
ElementType.PARAMETER:容許做用在方法參數上
ElementType.CONSTRUCTOR:容許做用在構造器上
ElementType.LOCAL_VARIABLE:容許做用在本地局部變量上
ElementType.ANNOTATION_TYPE:容許做用在註解上
ElementType.PACKAGE:容許做用在包上
8.觸發GC的條件
(1). 當應用程序空閒時,即沒有應用線程再運行時,GC會被調用的
(2). JAVA內存不足的時候,GC會被調用
9. 減小GC的開銷措施
(1). 不要顯示調用System.gc()
(2).儘可能減小建立臨時對象(至關於減小垃圾的產生,從而延長第二次GC的觸發時間),對象不用時候最好顯示設置爲null(有利於GC收集器斷定垃圾,從而提升垃圾回收)
(3). 儘可能使用StringBuffer,而不用String來增長字符串
(4). 能使用基本變量就不用封裝好的對象(好比int ---> Integer對象)
(5). 儘可能減小使用靜態變量(靜態變量屬於全變量,不會被GC回收掉,他們也會一直佔用內存,增長GC的次數)
10.終止線程的方法
1.while(boolean 變量值去終止) ------> 可是不會被當即終止線程
2.while(!Thread.interrupted())---------->判斷是否執行Thread.interrupted這個方法,執行以後必定在try..catch..中的catch方法中執行return,這樣才能夠真正中斷該方法
3. while(flag && ! Thread.interrupted()) ----->這兩個方法去真正執行中斷程序
private volatile boolean flag = false
11.多線程優化
將非UI線程設置線程等級,通常下載線程Thread.setThreadPriority(Processs.THREAD_PRIORITY_BACKGROUND);
7、網絡相關的知識
1.http和https的區別
HTTPS協議須要到CA申請證書,通常免費證書不多,須要交費。
HTTP協議運行在TCP之上,全部傳輸的內容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,全部傳輸的內容都通過加密的。
HTTP和HTTPS使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
HTTPS能夠有效的防止運營商劫持,解決了防劫持的一個大問題。
2. http1.0、http1.1和http2.0區別
http1.0 1.0+ : 支持版本號、請求頭、代理鏈接
http1.1 : 默認持久鏈接、支持緩存、支持管道方法發送多個請求 (一個TCP只能鏈接一個HTTP,不能複用;只能單向請求方式)
http2.0 : 支持多路複用,能夠設定請求的優先級;支持雙向通訊;去除不須要的HTTP請求頭,減小網絡帶寬
3.Http的請求方式
常見如下四種:
get : 獲取資源
post : 建立資源
put : 更新資源
delete : 刪除資源
4.get和post的區別
url可見性 : get的url可見(不安全) post的url參數不可見(安全)
數據傳輸上 : get經過拼接url進行傳遞參數 post經過body體傳輸參數
緩存性: get請求是能夠緩存的 post請求不能夠緩存
後退頁面的反應 : get請求頁面後退時,不產生影響 post請求頁面後退時,會從新提交請求
傳輸數據的大小 : get通常傳輸數據大小不超過2k-4k post請求傳輸數據的大小能夠本身,也能夠無限大
5. cookie和session的區別
存放位置不一樣:cookie存放在客戶端,session存放在服務端的
存取方式不一樣 : cookie用鍵值對,session能夠保存任何內容
安全性 : cookie保存在客戶端,因此安全性比session低
有限期不一樣 : cookie能夠設置時間,session則不能
set-cookie:[expires過時、到期)=new.Date(Date.now() +10 *1000)] 10S後過時,若是不設置默認是關閉瀏覽器當即失效
對服務器壓力不一樣 : 處於高併發狀況下,cookie比session要高,由於它是保存在客戶端的
6.輸入URL後HTTP請求返回完整的過程
7.網絡模式
8.三次握手的過程
SYN(synchronous創建聯機) ACK(acknowledgement 確認) Sequence number(順序號碼)
第一次握手:主機A發送位碼爲syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求創建聯機;
第二次握手:主機B收到請求後要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包;
第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則鏈接創建成功。
4.四次揮手
FIN (但願斷開鏈接) ACK(acknowledgement 確認) Sequence number(順序號碼)
5.三次握手和四次揮手的面試點
爲何不能用兩次握手進行鏈接
三次握手是爲了確保雙方都已經進入準備好的狀態,能夠進行通訊,而兩次握手的建立可能形成死鎖
假如:當C給S發一個鏈接請求,而後把C一個應答,這時候S已經認爲建立成功了,可是C認爲尚未建立成功,將忽略S那邊發來的數據,還在等待應答中,S發出的分組超時後,
再次發送請求,這樣就會造成死鎖
若是已經創建了鏈接,可是客戶端忽然出現故障了怎麼辦?
TCP還設有一個保活計時器,顯然,客戶端若是出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會從新復位這個計時器,
時間一般是設置爲2小時,若兩小時尚未收到客戶端的任何數據,服務器就會發送一個探測報文段,之後每隔75秒鐘發送一次。若一連發送10個探測報文仍然沒反應,
服務器就認爲客戶端出了故障,接着就關閉鏈接。
6.TCP和UDP的區別
a.基於鏈接與無鏈接;
b.對系統資源的要求(TCP較多,UDP少);
c.UDP程序結構較簡單;
d.流模式與數據報模式 ;
e.TCP保證數據正確性,UDP容易丟包;TCP保護數據的順序,UDP不行 UDP應用於IP電話和實時視頻會議
7.Http請求協議的講解
8.請求頭的常見屬性詳解
User-Agent : 向服務器請求的操做系統以及版本號等
Referer : 你當前網頁的上一個地址
Cache-Control : 緩存
Connection : 鏈接的類型(長鏈接)
Range : 多線程取捨時候,截取某一個字段
If-Match :
If-Modified-Since :
If-None-Match :
9.響應頭的講解
Cache-Control : 緩存
Content-Encoding : gzip 編碼格式: 壓縮
Content-Type : text/html 直接的文本、html類型
響應碼 : 100-199 信息提示
200-299 成功
300-399 重定向
400-499 客戶端錯誤
500-599 服務端錯誤
8、自定義註解的學習
@Retention:註解的保留位置
@Retention(RetentionPolicy.SOURCE) //註解僅存在於源碼中,在class字節碼文件中不包含
@Retention(RetentionPolicy.CLASS) // 默認的保留策略,註解會在class字節碼文件中存在,但運行時或者反射都沒法得到,
@Retention(RetentionPolicy.RUNTIME) // 註解會在class字節碼文件中存在,在運行時能夠經過反射獲取到
@Target:註解的做用目標
@Target(ElementType.TYPE) //接口、類、枚舉、註解
@Target(ElementType.FIELD) //字段、枚舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法參數
@Target(ElementType.CONSTRUCTOR) //構造函數
@Target(ElementType.LOCAL_VARIABLE)//局部變量
@Target(ElementType.ANNOTATION_TYPE)//註解
@Target(ElementType.PACKAGE) ///包
@Document:說明該註解將被包含在javadoc中
@Inherited:說明子類能夠繼承父類中的該註解
案例:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface Xml {
String[] layouts();
}
@Xml(layouts = "activity_main")
------------------------回家須要再調試看看---------------------------------
2.Activity之間的通訊
Intent/Bundle
3.Activity向Fragment傳遞數據
1).Bundle之間通訊
fragment.setArguments------>Activity與Fragment之間的通訊橋樑
getArguments()---->得到Bundle對象,仍是key-value的模式
2).直接在Activity之間定義
在onAttach綁定時候,強制轉換Acitivity的對象得到真實對象
4.Fragment向Activity對象傳遞數據
調用流程:
5.Activity與Service之間通訊
1).綁定服務,利用ServiceConnection之間的通訊
Activity寫的代碼:
Service寫的代碼:
2).利用Intent之間的通訊
3).定義一個callback接口來監聽服務中進程的變化
Service定義接口
Activity進行數據的調用
7.service和IntentService的區別
onHandleIntent在IntentService是抽象類,須要繼承去實現的
相比與Service它使用好處是不用你去手動釋放,當你執行完onHandleIntent就會釋放service,
其次就是他能夠經過執行HandlerThread執行異步操做
8.service的啓動和綁定的講解
service的綁定:
啓動服務比綁定服務的優先級高
先綁定服務後啓動服務: 綁定服務會轉爲啓動服務運行狀態,若是綁定的activity銷燬,服務會繼續運行
先啓動服務後綁定服務: 服務不會轉爲綁定服務狀態,會和Activity綁定,可是activity銷燬,會按啓動服務生命週期走
startService : 讓服務長期運行在後臺,可是沒法與服務進行通信
bindServcie : 能夠與服務進行通信,可是沒法長期運行在後臺
9.parcelable和serializable區別學習
組件之間存儲數據通常用parcelable,serializable將對象寫到磁盤中
序列化: 內存中的對象----->磁盤
反序列化: 磁盤中的對象---->內存
parcelable的實現步驟:
1)implements Parcelable
2)重寫writeToParcel方法,將你的對象序列化爲一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包須要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據
3)重寫describeContents方法,內容接口描述,默認返回0就能夠
4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator
public class MyParcelable implements Parcelable
{
private int mData;
public int describeContents()
{
return 0;
}
public void writeToParcel(Parcel out, int flags)
{
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>()
{
public MyParcelable createFromParcel(Parcel in)
{
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size)
{
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in)
{
mData = in.readInt();
}
}
簡而言之: 經過writeToParcel將你的對象映射成Parcel對象,再經過createFromParcel將Parcel對象映射成你的對象
10.AIDL的使用
11.WebView面試講解
1).webview在佈局文件中的使用: webview寫在其餘容器中時(webview徹底銷燬的辦法,不然會內存泄漏)
2).webviewClient.onPageFinished-------->WebChromeClent.onProgressChanged() : 頁面跳轉時候調用這個函數