LitePal使用心得(激進查詢等)以及小問題記錄

首先:AndroidManifest中Activity的launchMade不能瞎寫,需要着重理解。

"standard"(默認啓動模式)

standard是默認的啓動模式,即如果不指定launchMode屬性,則自動就會使用這種啓動模式。這種啓動模式表示每次啓動該Activity時系統都會爲創建一個新的實例,並且總會把它放入到當前的任務當中。聲明成這種啓動模式的Activity可以被實例化多次,一個任務當中也可以包含多個這種Activity的實例。


"singleTop"

這種啓動模式表示,如果要啓動的這個Activity在當前任務中已經存在了,並且還處於棧頂的位置,那麼系統就不會再去創建一個該Activity的實例,而是調用棧頂Activity的onNewIntent()方法。聲明成這種啓動模式的Activity也可以被實例化多次,一個任務當中也可以包含多個這種Activity的實例。


舉個例子來講,一個任務的返回棧中有A、B、C、D四個Activity,其中A在最底端,D在最頂端。這個時候如果我們要求再啓動一次D,並且D的啓動模式是"standard",那麼系統就會再創建一個D的實例放入到返回棧中,此時棧內元素爲:A-B-C-D-D。而如果D的啓動模式是"singleTop"的話,由於D已經是在棧頂了,那麼系統就不會再創建一個D的實例,而是直接調用D Activity的onNewIntent()方法,此時棧內元素仍然爲:A-B-C-D。


"singleTask"

這種啓動模式表示,系統會創建一個新的任務,並將啓動的Activity放入這個新任務的棧底位置。但是,如果現有任務當中已經存在一個該Activity的實例了,那麼系統就不會再創建一次它的實例,而是會直接調用它的onNewIntent()方法。聲明成這種啓動模式的Activity,在同一個任務當中只會存在一個實例。

注意這裏我們所說的啓動Activity,都指的是啓動其它應用程序中的Activity,因爲"singleTask"模式在默認情況下只有啓動其它程序的Activity纔會創建一個新的任務,啓動自己程序中的Activity還是會使用相同的任務,具體原因會在下面 處理affinity 部分進行解釋。


"singleInstance"

這種啓動模式和"singleTask"有點相似,只不過系統不會向聲明成"singleInstance"的Activity所在的任務當中再添加其它Activity。也就是說,這種Activity所在的任務中始終只會有一個Activity,通過這個Activity再打開的其它Activity也會被放入到別的任務當中。


再舉一個例子,Android系統內置的瀏覽器程序聲明自己瀏覽網頁的Activity始終應該在一個獨立的任務當中打開,也就是通過在<activity>元素中設置"singleTask"啓動模式來實現的。這意味着,當你的程序準備去打開Android內置瀏覽器的時候,新打開的Activity並不會放入到你當前的任務中,而是會啓動一個新的任務。而如果瀏覽器程序在後臺已經存在一個任務了,則會把這個任務切換到前臺。


其實不管是Activity在一個新任務當中啓動,還是在當前任務中啓動,返回鍵永遠都會把我們帶回到之前的一個Activity中的。但是有一種情況是比較特殊的,就是如果Activity指定了啓動模式是"singleTask",並且啓動的是另外一個應用程序中的Activity,這個時候當發現該Activity正好處於一個後臺任務當中的話,就會直接將這整個後臺任務一起切換到前臺。此時按下返回鍵會優先將目前最前臺的任務(剛剛從後臺切換到最前臺)進行回退,下圖比較形象地展示了這種情況:



上面的內容copy了郭神的原話。只是爲了記憶。下面開始說LitePal,一定要注意LitePal的激進查詢,

 mItem = LitePal.find(Items.class, cid, true);

這纔是激進查詢。下面這種是普通查詢。

mItem = LitePal.find(Items.class, cid)
普通查詢查詢不到所關聯的多表裏面的內容。只有激進查詢纔可以。這是個教訓。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章