1 如何導(dǎo)入外部數(shù)據(jù)庫
把原數(shù)據(jù)庫包括在項(xiàng)目源碼的 res/raw
android系統(tǒng)下數(shù)據(jù)庫應(yīng)該存放在 /data/data/com..(package name)/ 目錄下喉恋,所以我們需要做的是把已有的數(shù)據(jù)庫傳入那個目錄下.操作方法是用FileInputStream讀取原數(shù)據(jù)庫落蝙,再用FileOutputStream把讀取到的東西寫入到那個目錄.
2 本地廣播和全局廣播有什么差別
因廣播數(shù)據(jù)在本應(yīng)用范圍內(nèi)傳播衩茸,不用擔(dān)心隱私數(shù)據(jù)泄露的問題。 不用擔(dān)心別的應(yīng)用偽造廣播藐窄,造成安全隱患资昧。 相比在系統(tǒng)內(nèi)發(fā)送全局廣播,它更高效荆忍。
3 LaunchMode應(yīng)用場景
standard格带,創(chuàng)建一個新的Activity。
singleTop刹枉,棧頂不是該類型的Activity叽唱,創(chuàng)建一個新的Activity。否則微宝,onNewIntent棺亭。
singleTask,回退棧中沒有該類型的Activity蟋软,創(chuàng)建Activity镶摘,否則,onNewIntent+ClearTop钟鸵。
singleInstance钉稍,回退棧中,只有這一個Activity棺耍,沒有其他Activity贡未。
singleTop適合接收通知啟動的內(nèi)容顯示頁面。
例如蒙袍,某個新聞客戶端的新聞內(nèi)容頁面俊卤,如果收到10個新聞推送,每次都打開一個新聞內(nèi)容頁面是很煩人的害幅。
singleTask適合作為程序入口點(diǎn)消恍。
例如瀏覽器的主界面。不管從多少個應(yīng)用啟動瀏覽器以现,只會啟動主界面一次狠怨,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面邑遏。
singleInstance應(yīng)用場景:
鬧鈴的響鈴界面佣赖。 你以前設(shè)置了一個鬧鈴:上午6點(diǎn)。在上午5點(diǎn)58分记盒,你啟動了鬧鈴設(shè)置界面憎蛤,并按 Home 鍵回桌面;在上午5點(diǎn)59分時,你在微信和朋友聊天;在6點(diǎn)時,鬧鈴響了世舰,并且彈出了一個對話框形式的 Activity(名為 AlarmAlertActivity) 提示你到6點(diǎn)了(這個 Activity 就是以 SingleInstance 加載模式打開的)底洗,你按返回鍵,回到的是微信的聊天界面,這是因?yàn)?AlarmAlertActivity 所在的 Task 的棧只有他一個元素, 因此退出之后這個 Task 的棧空了灵奖。如果是以 SingleTask 打開 AlarmAlertActivity,那么當(dāng)鬧鈴響了的時候估盘,按返回鍵應(yīng)該進(jìn)入鬧鈴設(shè)置界面瓷患。
4 Android事件傳遞流程:
事件都是從Activity.dispatchTouchEvent()開始傳遞
事件由父View傳遞給子View,ViewGroup可以通過onInterceptTouchEvent()方法對事件攔截遣妥,停止其向子view傳遞
如果事件從上往下傳遞過程中一直沒有被停止擅编,且最底層子View沒有消費(fèi)事件,事件會反向往上傳遞箫踩,這時父View(ViewGroup)可以進(jìn)行消費(fèi)爱态,如果還是沒有被消費(fèi)的話,最后會到Activity的onTouchEvent()函數(shù)境钟。
如果View沒有對ACTION_DOWN進(jìn)行消費(fèi)锦担,之后的其他事件不會傳遞過來,也就是說ACTION_DOWN必須返回true慨削,之后的事件才會傳遞進(jìn)來
OnTouchListener優(yōu)先于onTouchEvent()對事件進(jìn)行消費(fèi)
5 ANR對話框
應(yīng)用在5秒內(nèi)未響應(yīng)用戶的輸入事件(如按鍵或者觸摸)
BroadcastReceiver未在10秒內(nèi)完成相關(guān)的處理
Service在特定的時間內(nèi)無法處理完成 20秒
可以使用一下方法
使用AsyncTask處理耗時IO操作洞渔。
使用Thread或者HandlerThread時,調(diào)用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設(shè)置優(yōu)先級缚态,否則仍然會降低程序響應(yīng)磁椒,因?yàn)槟J(rèn)Thread的優(yōu)先級和主線程相同。
使用Handler處理工作線程結(jié)果玫芦,而不是使用Thread.wait()或者Thread.sleep()來阻塞主線程浆熔。
Activity的onCreate和onResume回調(diào)中盡量避免耗時的代碼
BroadcastReceiver中onReceive代碼也要盡量減少耗時,建議使用IntentService處理
6 Requestlayout,onlayout,onDraw,DrawChild
requestLayout()方法 :會導(dǎo)致調(diào)用measure()過程 和 layout()過程 桥帆。 將會根據(jù)標(biāo)志位判斷是否需要ondraw
onLayout()方法(如果該View是ViewGroup對象医增,需要實(shí)現(xiàn)該方法,對每個子視圖進(jìn)行布局)
調(diào)用onDraw()方法繪制視圖本身 (每個View都需要重載該方法老虫,ViewGroup不需要實(shí)現(xiàn)該方法)
drawChild()去重新回調(diào)每個子視圖的draw()方法
7 Handler
1 當(dāng)Android程序第一次創(chuàng)建的時候叶骨,在主線程同時會創(chuàng)建一個Looper對象。Looper實(shí)現(xiàn)了一個簡單的消息隊(duì)列张遭,一個接著一個處理Message對象。程序框架所有主要的事件(例如:屏幕上的點(diǎn)擊時間地梨,Activity生命周期的方法等等)都包含在Message對象中菊卷,然后添加到Looper的消息隊(duì)列中缔恳,一個一個處理。主線程的Looper存在整個應(yīng)用程序的生命周期內(nèi)洁闰。
2 當(dāng)一個Handler對象在主線程中創(chuàng)建的時候歉甚,它會關(guān)聯(lián)到Looper的 message queue 。Message添加到消息隊(duì)列中的時候Message會持有當(dāng)前Handler引用扑眉,當(dāng)Looper處理到當(dāng)前消息的時候纸泄,會調(diào)用Handler#handleMessage(Message).
3 在java中,no-static的內(nèi)部類會 隱式的 持有當(dāng)前類的一個引用腰素。static的類則沒有聘裁。
8 onSaveInstanceState,onRestoreInstanceState
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它們不同于 onCreate()弓千、onPause()等生命周期方法衡便,它們并不一定會被觸發(fā)。當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足洋访、用戶直接按Home鍵)由系統(tǒng)銷毀一個Activity镣陕,onSaveInstanceState() 會被調(diào)用。但是當(dāng)用戶主動去銷毀一個Activity時姻政,例如在應(yīng)用中按返回鍵呆抑,onSaveInstanceState()就不會被調(diào)用。除非該activity是被用戶主動銷毀的汁展,通常onSaveInstanceState()只適合用于保存一些臨時性的狀態(tài)鹊碍,而onPause()適合用于數(shù)據(jù)的持久化保存。
9 OOM
Out Of Merrory善镰,Android系統(tǒng)的每一個應(yīng)用程序都設(shè)置一個硬性的Dalvik Heap Size最大限制閾值妹萨,如果申請的內(nèi)存資源超過這個限制,系統(tǒng)就會拋出OOM錯誤
內(nèi)存泄漏炫欺,阻止對象回收:
類的靜態(tài)變量持有大數(shù)據(jù)對象
非靜態(tài)內(nèi)部類存在靜態(tài)實(shí)例
資源對象未關(guān)閉
Handler內(nèi)存泄漏
解決方法:
使用更加輕量的數(shù)據(jù)結(jié)構(gòu) 例如乎完,我們可以考慮使用ArrayMap/SparseArray而不是HashMap等傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)
避免在Android里面使用Enum
減小Bitmap對象的內(nèi)存占用,Bitmap對象的復(fù)用
使用更小的圖片
StringBuilder 在有些時候品洛,代碼中會需要使用到大量的字符串拼接的操作树姨,這種時候有必要考慮使用StringBuilder來替代頻繁的“+”。
避免在onDraw方法里面執(zhí)行對象的創(chuàng)建
10 Asynctask
內(nèi)存泄露: 非靜態(tài)內(nèi)部類AsynTask會隱式地持有外部類的引用桥状,如果其生命周期大于外部activity的生命周期帽揪,就會出現(xiàn)內(nèi)存泄漏
注意要復(fù)寫AsynTask的onCancel方法,把里面的socket辅斟,file等转晰,該關(guān)掉的要及時關(guān)掉
在 Activity 的onDestory()方法中調(diào)用Asyntask.cancal方法
Asyntask內(nèi)部使用弱引用的方式來持有Activity
若Activity已經(jīng)銷毀,此時AsynTask執(zhí)行完并且返回結(jié)果,會報(bào)異常嗎?
當(dāng)一個App旋轉(zhuǎn)時查邢,整個Activity會被銷毀和重建蔗崎。當(dāng)Activity重啟時,AsyncTask中對該Activity的引用是無效的扰藕,因此onPostExecute()就不會起作用缓苛,若AsynTask正在執(zhí)行,折會報(bào) view not attached to window manager 異常
同樣也是生命周期的問題邓深,在 Activity 的onDestory()方法中調(diào)用Asyntask.cancal方法未桥,讓二者的生命周期同步