1. Activity和fragment的生命周期
-
Activity從onCreate→onStart→onResume→onPause→onStop→onDestroy愕把,其中oncreate初始化加載布局資源拣凹,onStart布局可見但是還在后臺(tái)不可交互
onResume布局可見在前臺(tái)可以交互茵瘾。onPause正在停止當(dāng)前activity,onStop表示activity即將停止咐鹤,做一些回收資源操作,onDestroy銷毀activity最終的資源釋放圣絮∑砘蹋總結(jié):onStart和onPause可見不可見,onResume和onStop可不可以交互
-
Fragment從onAttach→onCreate→onCreateView→onStart→onResume→onPause→onStop→onDestroyView→onDestroy-onDetach
?
2. Layout_gravity和gravity的區(qū)別扮匠。
比如設(shè)置android:layout_gravity="right"的button會(huì)顯示在父view的最右邊捧请。所以layout_gravity是設(shè)置當(dāng)前view在父view的位置。
比如設(shè)置了android:gravity="left"的LinearLayout會(huì)讓里面的子View最顯示在最左邊棒搜。所以gravity是設(shè)置當(dāng)前view里面的子view的位置疹蛉。
3. 當(dāng)一個(gè)activity跳轉(zhuǎn)到另一個(gè)activity的生命周期
我們分別用AB代替兩個(gè)activity
onPause(A)→onCreate(B)→onStart(B)→onResume(B)→onStop(A)
4.簡(jiǎn)單介紹Handler Message MessageQueue Looper
當(dāng)Handler調(diào)用sendMessage方法會(huì)先把調(diào)用MessageQueue.enqeueMessage把Message加到消息隊(duì)列,然后Looper開啟循環(huán)不斷遍歷消息隊(duì)列力麸,調(diào)用MessageQueue.next獲取message可款,然后調(diào)用目標(biāo)Handler的dispatchMessage,判斷Message有沒有Callback即有沒有Runnable對(duì)象克蚂,再判斷Handler有沒有callback闺鲸,如果都沒最后輸出到Handler的handleMessage方法來處理消息。
5. 內(nèi)存溢出和內(nèi)存泄露
oom又叫out of memory 就是內(nèi)存溢出埃叭。就是對(duì)象需求的內(nèi)存大于jvm可用內(nèi)存摸恍,避免oom要
減小對(duì)象內(nèi)存的使用
1)使用更加輕量的數(shù)據(jù)結(jié)構(gòu),使用ArrayMap/SparseArray代替HashMap
2)避免使用Enum
3)減小bitmap對(duì)象的內(nèi)存占用 使用insampleSize縮放比例赤屋,設(shè)置decodeFormat立镶,解碼格式
4)使用更小的圖片,用tinypng壓縮圖片
內(nèi)存對(duì)象的重復(fù)使用类早。使用對(duì)象池
1)StringBuilder減少String對(duì)象創(chuàng)建
2)避免在onDraw創(chuàng)建對(duì)象媚媒,因?yàn)閛nDraw會(huì)頻繁調(diào)用,頻繁gc莺奔,從而造成內(nèi)存抖動(dòng)欣范。
3)復(fù)用系統(tǒng)提供的資源,比如字符串 顏色 圖片 動(dòng)畫 樣式 和布局
4)在listview或者gridview對(duì)convertView的復(fù)用
5)bitmap對(duì)象的復(fù)用在api11-18使用inbitmap令哟,確定具有相同的解碼模式恼琼,第二張圖片會(huì)使用第一張照片已存在的位置
避免內(nèi)存泄露
1)注意Activity的泄漏,一般是內(nèi)部類引用導(dǎo)致activity泄露比如handler
2)Activity Context被傳到其他實(shí)例中屏富,這可能導(dǎo)致自身引用發(fā)生泄漏
3)考慮使用Application Context 而不是Activity Context當(dāng)然dialog就必須是activity的content
4)注意臨時(shí)的bitmap對(duì)象的回收 調(diào)用bitmap.recycle()
5) 監(jiān)聽器的注銷要手動(dòng)unregister 比如realm的list監(jiān)聽器
6)注意緩存容器中的對(duì)象泄漏比如2.3版本的drawable會(huì)對(duì)view強(qiáng)引用晴竞,
7)注意webview的泄露
8)還有Cursor游標(biāo)的關(guān)閉。
6. Jvm的堆棧方法區(qū)
堆區(qū)存放所有的對(duì)象狠半,只有一個(gè)噩死,每個(gè)對(duì)象都包含一個(gè)與之對(duì)應(yīng)的class信息class的目的是得到操作指令颤难,但是不包括基本類型和對(duì)象引用,new一個(gè)類就是對(duì)象引用已维。只存放對(duì)象本身行嗤。
棧區(qū) 每個(gè)線程都有一個(gè)棧區(qū),用來存放對(duì)象的引用和基本類型垛耳,(怎么區(qū)分對(duì)象和對(duì)象的應(yīng)用呢 舉個(gè)例子 Person person=new Person(); =左邊是對(duì)象的引用栅屏,=右邊是對(duì)象),其他棧不能訪問另外一個(gè)棧的內(nèi)容
方法區(qū)堂鲜,就是靜態(tài)變量static修飾的變量栈雳,常量。