1. Activity和fragment的生命周期
-
Activity從onCreate→onStart→onResume→onPause→onStop→onDestroy,其中oncreate初始化加載布局資源,onStart布局可見但是還在后臺不可交互
onResume布局可見在前臺可以交互。onPause正在停止當前activity,onStop表示activity即將停止,做一些回收資源操作,onDestroy銷毀activity最終的資源釋放。總結:onStart和onPause可見不可見,onResume和onStop可不可以交互
-
Fragment從onAttach→onCreate→onCreateView→onStart→onResume→onPause→onStop→onDestroyView→onDestroy-onDetach
?
2. Layout_gravity和gravity的區別。
比如設置android:layout_gravity="right"的button會顯示在父view的最右邊。所以layout_gravity是設置當前view在父view的位置。
比如設置了android:gravity="left"的LinearLayout會讓里面的子View最顯示在最左邊。所以gravity是設置當前view里面的子view的位置。
3. 當一個activity跳轉到另一個activity的生命周期
我們分別用AB代替兩個activity
onPause(A)→onCreate(B)→onStart(B)→onResume(B)→onStop(A)
4.簡單介紹Handler Message MessageQueue Looper
當Handler調用sendMessage方法會先把調用MessageQueue.enqeueMessage把Message加到消息隊列,然后Looper開啟循環不斷遍歷消息隊列,調用MessageQueue.next獲取message,然后調用目標Handler的dispatchMessage,判斷Message有沒有Callback即有沒有Runnable對象,再判斷Handler有沒有callback,如果都沒最后輸出到Handler的handleMessage方法來處理消息。
5. 內存溢出和內存泄露
oom又叫out of memory 就是內存溢出。就是對象需求的內存大于jvm可用內存,避免oom要
減小對象內存的使用
1)使用更加輕量的數據結構,使用ArrayMap/SparseArray代替HashMap
2)避免使用Enum
3)減小bitmap對象的內存占用 使用insampleSize縮放比例,設置decodeFormat,解碼格式
4)使用更小的圖片,用tinypng壓縮圖片
內存對象的重復使用。使用對象池
1)StringBuilder減少String對象創建
2)避免在onDraw創建對象,因為onDraw會頻繁調用,頻繁gc,從而造成內存抖動。
3)復用系統提供的資源,比如字符串 顏色 圖片 動畫 樣式 和布局
4)在listview或者gridview對convertView的復用
5)bitmap對象的復用在api11-18使用inbitmap,確定具有相同的解碼模式,第二張圖片會使用第一張照片已存在的位置
避免內存泄露
1)注意Activity的泄漏,一般是內部類引用導致activity泄露比如handler
2)Activity Context被傳到其他實例中,這可能導致自身引用發生泄漏
3)考慮使用Application Context 而不是Activity Context當然dialog就必須是activity的content
4)注意臨時的bitmap對象的回收 調用bitmap.recycle()
5) 監聽器的注銷要手動unregister 比如realm的list監聽器
6)注意緩存容器中的對象泄漏比如2.3版本的drawable會對view強引用,
7)注意webview的泄露
8)還有Cursor游標的關閉。
6. Jvm的堆棧方法區
堆區存放所有的對象,只有一個,每個對象都包含一個與之對應的class信息class的目的是得到操作指令,但是不包括基本類型和對象引用,new一個類就是對象引用。只存放對象本身。
棧區 每個線程都有一個棧區,用來存放對象的引用和基本類型,(怎么區分對象和對象的應用呢 舉個例子 Person person=new Person(); =左邊是對象的引用,=右邊是對象),其他棧不能訪問另外一個棧的內容
方法區,就是靜態變量static修飾的變量,常量。