背景:做一個問題總結,希望可以給別人一些參考。
偏前端類的問題:
一.安卓的四大組件
這個網上有很多資料,我也會把鏈接放大下面,大家可以做些參考,這裏面我就說下我理解的。
1.1 activity
作用:activity我理解是一個GUI頁面,裏面可以放置組件,比如說button,select等。
生命週期:
oncreate->onstart->onresume->running->onpause->onstop->ondestory
activity是存放到棧中,採用先進後出的方式。
1.2 說下intent()
intent兩種跳轉形式:
功能:intent可以跳轉到activity,server和廣播。
第一種:顯示跳轉
距離就是從一個activity跳轉到另一個activity
構造函數的形式:
Intent intent=new Intent(second.activity);
方法的形式:
通過setClass/setClassname的形式:
Intent intent=new Intent()
intent.setClass();
第二種:隱示跳轉
intent(action,data,類別)交給系統,系統會做出匹配完成跳轉。
這個其實就是intent七個屬性:action,data,類別,extra,type,flag,組件。
這裏面說下flag:
flag正好對應activty的4中啓動模式:
standard:這個是默認啓動模式,即棧內activity每次oncreat都會創建實例,無論棧內是否已有實例。
single top模式:activity已經位於棧頂,oncreate不會創建實例。------>push場景會用到。
single task模式:非棧頂的activity被oncreate,會放到棧頂,之前棧頂實例會pop出去。------>首頁場景會用到。
single instance模式:一個activity一個棧。----->撥號盤場景。
1.3 intent最大能傳遞多大數據
intent跳轉的另一個activity最大傳輸數據1M,大於1M會出現靜默崩潰。
解決這類問題方法:
進程內:緩存磁盤或者文件緩存
進程外:通過contentprovider進行進程內數據共享和傳遞。
2. server
server我理解用來做一些後臺數據交互的組件。
2.1生命週期:
第一種:oncreate->onstartcommend->ondestory--->這種一般直接啓動服務做處理
第二種:oncreate->onbind->onunbind->ondestroy---->這個把server和另一個組件做綁定,比如activity。
2.2 服務類型 前臺服務和普通服務:
前臺服務:比如狀態標誌展示的服務
普通服務:後臺運行服務。
2.3 ANR現象:
服務啓動後如果不手動開啓進程就會默認運行在主進程中,在主進程中做耗時操作就會出現ANR現象,表現形式就是卡頓無反應。
2.4 intentserver類和server類區別在哪裏:
兩點:
一方面: intentserver有一個onHandleIntent()函數可以直接創建子進程。server也可以調用函數創建子進程。
最大優勢就是在多次調用onHandleIntent()函數的時候可以按照順序執行。(類似python unittest中case1->case2那種形式)
3. contentProvider
這個組件主要用來做數據存儲,有點類似python sqlalcheny這個庫,主要通過orm形式做數據庫增刪改查。
3.1 6個核心方法
oncreate(),query(),insert(),update(),delete(),gettype();
3.2 如何訪問內部數據
方式類似uri的形式:存放地址和報名(有點類似mysql中庫名和表名)。
4.廣播:
角色:發送者和接受者(跟後端MQ類似)。
用戶:不同組件通信(同一個app或者不同app之間),多線程通信和安卓系統通信。
核心方法:onrecevice()方法
註冊方法:
靜態註冊:在xml中註冊。特點:不跟隨任何組件生命週期(有點類似spring初始化即可調通)。缺點:耗電和耗內存。
動態註冊:在代碼中調用註冊方法進行註冊。特點:靈活,生命週期跟隨被綁定組件。缺點:在app關閉前一定要註銷,否則會引發內存泄漏。
參考博客:
https://blog.csdn.net/xchaha/article/details/80398620
https://blog.csdn.net/xiankog/article/details/81702119
二.H5相關
2.1 能說下jsbridge的原理嘛
jsbridge是H5和native之前作爲數據交互的通道,主要包含兩塊:通信調用和句柄解析。
通信調用:
js調用native一共有兩種形式:注入api和攔截url scheme
注入api:
native通過某種形式把類或者方法注入js.content(window)中(這個我理解就是會有中間方法把方法封裝成js可以調用接口形式)
native注入成功後就js可以直接把data傳入。
這種方式最大特點就是native來維護各種版本的橋名,對應測試更好H5測試兼容性一個節點。
缺點:因爲注入時機不確定,有可能會出現注入api失敗的情況,這樣就需要js在調用前確認是否注入成功。
攔截url scheme:
js通過莫種形式比如說iframe.src(src是iframe一個屬性),調用內部框架即native對應類的方法。形式類似uri 區別點就是
協議和host可以自定義。這個方式有一種缺陷就是uri是有長度限制(好像是256字節)。爲了避免這個缺陷ios會通過ajrax形式把data放入header或者body中。
缺點:js需要維護各種版本橋名,還有就是uri是有長度限制的。
native調用js:
native可以直接調用js的代碼塊。
句柄解析:
信息通信消息都是單向,所以爲了回調會有一個callbackid的存在。這個callbakcid在全局必須是唯一的,client發送消息給server,
server處理完成後吧callbakcid作爲key和處理結果發送給client。
比如說js->native流程就是:js發送bridgename,data,callbacikd給natvie,native通過bridgename找到類和方法,把data傳入進行運算,再以callbackid作爲key和運算結果作爲value返回給js。
https://blog.csdn.net/yuzhengfei7/article/details/93468914
2.2 簡單說下webview
webview一共兩個作用:一.用來展示html頁面;二.跟js進行交互。
webview類:
加載頁面;
前進/後退;
清除緩存;
獲取html的高度和滾動距離
下載文件;
websetting類(配置類):
設置js交互->websetting.setjavascriptenable(true);
縮放操作;
設置字體大小;
設置緩存;
設置編碼格式;
webviewclinet類(處理各種通知和請求事件):
攔截url進行重定向;
處理瀏覽器的按鍵事件;
處理https事件;
webchromeclient:輔助webview處理js對話框,網站標題等
加載進度展示;
獲取網頁標題回調;
打開/關閉窗口回調;
網頁提示框;
https://www.jianshu.com/p/3e0136c9e748
2.3 能簡單說下小程序的mini框架嘛?
框架結構:
index ----------->對應小程序的首頁
log
log.js ------------>log的js邏輯
log.wxml ------------>log的html頁面模板
log.wxss ------------>log的頁面樣式
log.json ------------>log的配置頁面
utils
utils.js
app.js ------------>小程序加載邏輯
app.json ------------->應用全局配置,如背景顏色
app.wxss ------------->全局樣式
wxml:構建頁面內容-->html
wxss:頁面樣式----->顏色配置
wxs:wxml的增加版本,腳本語言,快速構建頁面。
js:交互邏輯,數據通信。
wxml的4個特性:
特性1 綁定數據:
id;
class;---->對應css的類名
style;------>對應樣式模板
hidde;------>是否隱藏
特性2 列表展示:
特性3 條件展示:
特性4 模板展示:
<temple>
<view> 收件人:{{name}}</view>
</temple>
2.4 小程序的啓動機制:
分成兩種啓動:冷啓動和熱啓動。
冷啓動:首次打開或者微信死掉,走小程序的全部生命週期(這個是我理解的)
熱啓動:一段時間內再次進入小程序,不請求接口更新直接進入首頁
小程序生命週期:onlunch ->onshow->onhide->onerror
頁面生命週期:onload->onshow->onready->onhide->onerror
ps:我覺得了解生命週期可以幫助我們在遇到問題的時候快速定位哪裏修改,我記得之前遇到因爲熱啓動,前端沒有調用啓動接口更新數據,我們可以在提bug的時候可以提出自己想法,雖然fe可能不接受,但是也是自我學習過程嘛。
頁面路由 小程序頁面路由全部由框架管理:
初始化,加載----->進棧
返回 ------>出棧
切換tab ------>之前tab頁面全部出棧,新tab頁面出棧
https://www.jianshu.com/p/64170244e64c
2.5 簡單介紹下html
html是標籤語言主要用來構建頁面內容,主要模塊如下:
佈局標籤:
字體標籤:
表單標籤:
<form>:
<button>:
三.java基礎
3.1 final關鍵字可以修飾什麼?
final可以修飾class,方法和變量。
final修飾class後這個類不可以被繼承。
final修飾方法是防止其他類繼承後修改方法和提高效率。
final修飾變量後,變量的值不可被修改。
3.2 final和static的區別是什麼?
static用來修飾方法和變量,類初始化的時候會優先加載static修飾方法和變量。
static修飾方法的時候,同一個類中其他方法可以通過 類名.方法 的訪問。
static修飾方法或者變量,在類初始化的時候會被優先執行。
final 就只是變量值不可變。
https://blog.csdn.net/kuangay/article/details/81485324
https://www.jb51.net/article/157603.htm