<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          字節(jié)-Android開(kāi)發(fā)面經(jīng)(一)

          共 4018字,需瀏覽 9分鐘

           ·

          2021-05-28 15:46

          點(diǎn)擊藍(lán)字關(guān)注我們,獲取更多面經(jīng)








          handler機(jī)制




                當(dāng)我們創(chuàng)建一個(gè)handler時(shí),會(huì)調(diào)用looper的mylooper方法來(lái)獲得當(dāng)前線程的looper。如果沒(méi)有,就會(huì)新建一個(gè)looper并存放在looper線程池里,保證每個(gè)線程都有自己唯一的looper。而looper中持有MessageQueue,當(dāng)新建一個(gè)Message時(shí),通過(guò)handler發(fā)送時(shí),會(huì)將這個(gè)Message存放到MessageQueue中,而loop方法一直在循環(huán)從messageQueue中取消息,發(fā)送的message會(huì)被取到,并處理。當(dāng)發(fā)送了多個(gè)message時(shí),會(huì)遵循先進(jìn)先出原則維持在messageQueue中。那么,不同線程中發(fā)送的message,最終是怎么在主線程中完成處理的呢。要從target的dispatchMessage方法中找答案。






          Activity的生命周期




               在Android中會(huì)維持一個(gè)Activity Stack(Activity棧),當(dāng)一個(gè)新的Activity創(chuàng)建時(shí),它就會(huì)放到棧頂,這個(gè)Activity就處于運(yùn)行狀態(tài)。當(dāng)再有一個(gè)新的Activity被創(chuàng)建后,會(huì)重新壓人棧頂,而之前的Activity則會(huì)在這個(gè)新的Activity底下,就像槍梭壓入子彈一樣。而且之前的Activity就會(huì)進(jìn)入后臺(tái)。

          一個(gè)Activity實(shí)質(zhì)上有四種狀態(tài):

          a.運(yùn)行中(Running/Active):這時(shí)Activity位于棧頂,是可見(jiàn)的,并且可以用戶交互。

          b.暫停(Paused):當(dāng)Activity失去焦點(diǎn),不能跟用戶交互了,但依然可見(jiàn),就處于暫停狀態(tài)。當(dāng)一個(gè)新的非全屏的Activity或者一個(gè)透明的Activity放置在棧頂,Activity就處于暫停狀態(tài);這個(gè)時(shí)候Activity的各種數(shù)據(jù)還被保持著;只有在系統(tǒng)內(nèi)存在極低的狀態(tài)下,系統(tǒng)才會(huì)自動(dòng)的去銷毀Activity。

          c.停止(Stoped):當(dāng)一個(gè)Activity被另一個(gè)Activity完全覆蓋,或者點(diǎn)擊HOME鍵退入了后臺(tái),這時(shí)候Activity處于停止?fàn)顟B(tài)。這里有些是跟暫停狀態(tài)相似的:這個(gè)時(shí)候Activity的各種數(shù)據(jù)還被保持著;當(dāng)系統(tǒng)的別的地方需要用到內(nèi)容時(shí),系統(tǒng)會(huì)自動(dòng)的去銷毀Activity。

          d.銷毀(Detroyed):當(dāng)我們點(diǎn)擊返回鍵或者系統(tǒng)在內(nèi)存不夠用的情況下就會(huì)把Activity從棧里移除銷毀,被系統(tǒng)回收,這時(shí)候,Activity處于銷毀狀態(tài)。

          3.Fragment生命周期執(zhí)行流程

          Fragment創(chuàng)建:setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume();

          Fragment變?yōu)椴豢梢?jiàn)狀態(tài)(鎖屏、回到桌面、被Activity完全覆蓋):onPause()->onSaveInstanceState()->onStop();

          Fragment變?yōu)椴糠挚梢?jiàn)狀態(tài)(打開(kāi)Dialog樣式的Activity):onPause()->onSaveInstanceState();

          Fragment由不可見(jiàn)變?yōu)榛顒?dòng)狀態(tài):onStart()->OnResume();

          Fragment由部分可見(jiàn)變?yōu)榛顒?dòng)狀態(tài):onResume();

          退出應(yīng)用:onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(注意退出不會(huì)調(diào)用onSaveInstanceState方法,因?yàn)槭侨藶橥顺觯瑳](méi)有必要再保存數(shù)據(jù));

          Fragment被回收又重新創(chuàng)建:被回收?qǐng)?zhí)行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),重新創(chuàng)建執(zhí)行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();

          橫豎屏切換:與Fragment被回收又重新創(chuàng)建一樣。






          Service的onBind和onStart




          1startService();此種開(kāi)啟方式Service會(huì)經(jīng)歷onCreate()--onStart()。若Service還沒(méi)運(yùn)行,則先調(diào)用onCreate(),然后調(diào)用onStart();如果Service已經(jīng)啟動(dòng),則只會(huì)調(diào)用onStart()。一個(gè)ServiceonStart()方法可以被調(diào)用多次。stopService的時(shí)候直接onDestroy,如果是調(diào)用者自己直接退出而沒(méi)有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。

          注:多次調(diào)用startService()方法并不會(huì)嵌套,所以無(wú)論同一個(gè)服務(wù)被啟動(dòng)了多少次,一旦調(diào)用stopService()或者sopSelf(),他都會(huì)立刻停止。

           

          2bindService():此種啟動(dòng)方式Service會(huì)經(jīng)歷onCreate()--onBind(),onBind將會(huì)返回給客戶端一個(gè)IBind接口實(shí)例,IBind允許客戶端回調(diào)服務(wù)的方法,比如得到Service的運(yùn)行狀態(tài)等。這個(gè)時(shí)候調(diào)用者會(huì)和Service綁定在一起,調(diào)用者退出的時(shí)候,Service就會(huì)調(diào)用onUnbind--onDestroy退出。






          Android持久化方案




          Android中的持久化方式主要有三種:

          文件存儲(chǔ)

          SharedPreference存儲(chǔ)

          數(shù)據(jù)庫(kù)存儲(chǔ)

           

          一、文件存儲(chǔ)

                       文件存儲(chǔ)是將數(shù)據(jù)原封不動(dòng)地保存到文件中,適用于一些簡(jiǎn)單的額文本數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)。

                   存數(shù)據(jù)主要用到了Context的openFileOutput(String fileName,int mode)方法,該方法可以在底層產(chǎn)生一個(gè)FileOutputStream對(duì)象,然后用BufferedWriter等包裝類對(duì)其進(jìn)行包裝后,就可以對(duì)指定文件進(jìn)行寫(xiě)數(shù)據(jù)了。其中的mode是 文件操作模式,有MODE_PRIVATE和MODE_APPEND兩種模式,前者是默認(rèn)的,后者是當(dāng)文件存在的時(shí)候,數(shù)據(jù)以追加的方式寫(xiě)入文件。

                 當(dāng)在一個(gè)Context調(diào)用該方法時(shí),會(huì)在 data/data/工程包名/files 目錄下發(fā)現(xiàn)保存剛剛數(shù)據(jù)的文件。


          二、SharedPreference存儲(chǔ)

                     SharedPreferences是用 鍵值對(duì) 的方式存儲(chǔ)數(shù)據(jù)的,并且保存的當(dāng)保存一條數(shù)據(jù)的時(shí)候,需要給這條數(shù)據(jù)提供一個(gè)對(duì)應(yīng)的key,然后在讀取該數(shù)據(jù)的時(shí)候通過(guò)該key讀取。

          1、存數(shù)據(jù)到SharedPreferences中

          2、利用SharedPreferences從文件中讀取數(shù)據(jù)

           

          三、SQLite存儲(chǔ)

                   SQLite是Android中內(nèi)置的一款輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù),它的運(yùn)算速度非常快,占用資源少。Android中提供了一個(gè)SQLiteOpenHelper幫助抽象類,借助這個(gè)類可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建和升級(jí)。利用SQLiteOpenHelper中的getReadableDatabase()和getWritableDatabase()方法可以獲取對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀和寫(xiě)的對(duì)象。






          hashmap原理




           HashMap 是基于哈希表的Map 接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null 值和null 鍵(允許一個(gè)null鍵,HashTable不允許entry的鍵或者值為空)。此類不保證映射的順序,特別是它不保證該順序恒久不變。

          HashMap 底層是 數(shù)組和鏈表 結(jié)合在一起使用也就是 鏈表散列。HashMap 通過(guò) key 的 hashCode 經(jīng)過(guò)擾動(dòng)函數(shù)處理過(guò)后得到 hash 值,然后通過(guò) (n - 1) & hash值 判斷當(dāng)前元素存放的位置(這里的 n 指的是數(shù)組的長(zhǎng)度)。如果當(dāng)前位置存在元素的話,就判斷該元素與要存入的元素的 hash 值以及 key 是否相同,如果相同的話,直接覆蓋;不相同就通過(guò)拉鏈法解決沖突。

          所謂 “拉鏈法” 就是:將鏈表和數(shù)組相結(jié)合。也就是說(shuō)創(chuàng)建一個(gè)鏈表數(shù)組,數(shù)組中每一格就是一個(gè)鏈表。若遇到哈希沖突,則將沖突的值加到鏈表中即可。

          HashMap 底層數(shù)據(jù)結(jié)構(gòu)為 Node 類型數(shù)組,Node 類型為 HashMap 的內(nèi)部類,數(shù)據(jù)結(jié)構(gòu)為鏈表。當(dāng)新建一個(gè)HashMap 的時(shí)候,就會(huì)初始化一個(gè)數(shù)組。





          更多面經(jīng)





          阿里-Android開(kāi)發(fā)面經(jīng)(一)


          百度-Android開(kāi)發(fā)面經(jīng)(一)


          滴滴-Android開(kāi)發(fā)面經(jīng)(一)


              掃描二維碼

             獲取更多面經(jīng)

            扶搖就業(yè)  


          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操美女的豆花视频网站 | 男人天堂网在线观看 | 久青草电影 | 爽妇综合网| 国产精品久久久久毛片SUV |