1. 流行技術
- 框架:MVP(框架) + Rxjava(響應式編程) + Retrofit(網絡請求封裝)
- 經常使用三方庫:
- Rxbus :事件訂閱管理
- ButterKnife :view 注入框架(setting 設置 m 開頭)
- fastjson/Gson :Json 處理工具
- glide/Fresco :圖片加載組件
- PictureSelector :圖片選擇器
- zxing :二維碼掃描
- Lifecycle :生命週期管理組件
- tinker :熱修復組件 使用
- Android-PickerView :多功能選擇框(時間、地點、文件等,支持單選多選)
- AndPermission :權限管理組件
- SmartRefreshLayout :上拉加載、下拉刷新
- material-calendarview :日曆控件
- SwipeDelMenuLayout : 側滑菜單
- banner :廣告輪播圖
- 經常使用三方工具:
- 友盟統計、友盟分享、第三方登陸
- 百度/高德地圖、定位
- 極光推送
- 微信支付、支付寶支付
- Bugly 異常上報和運營統計
- leakcanary 內存檢測工具
- ViewServer 可以使用可視化界面顯示工具
- 語言:
- java、kotlin(官方 kotlin 上位,可是 java 短期也不能淘汰)
- 其餘:
- React Native :跨平臺解決方案,但目前屬於踩坑階段。
- Hybrid :混合開發,Android 的殼 + webview 頁面,可服務器直接更新,可是加載受網絡限制,超級耗流量。
- dagger2 :依賴注入框架(經過註解注入對象,在預編譯的時期,非反射),上手成本超高。
- MVVM :也是一種新的架構模式、數據和 view 雙向綁定,但綁定後 view 複用性差。
2.技術棧
-
架構的演變:MVC -> MVP、MVVM。html
咱們前公司架構使用的 MVP ,劃分比較狠一些,就是 activity/fragment 中只有 view 更新,其他的全部操做全在 presenter 中(包擴跳轉、onActivityResult 的處理),中間使用接口定義規範,這樣作的好處就是 view 的頁面能夠直接複製去使用,不同的邏輯所有都在 presenter 中去修改,咱們的同業客戶端(toBC)和旅遊客戶端(toC)在頁面展現上幾乎沒有區別,區別就在於邏輯的處理,能夠根據訂單進行返傭操做。java
-
網絡請求、數據解析android
最開始使用的是 httpurlconnection ,經過流的方式去處理數據,後期有 volley、xUtils,在後來 okhttp 出現,使用的是 OkGo(那時候仍是 MVC 模式)、在後來就是如今的 MVP + Rxjava + Retrofit。ios
-
頁面、動畫git
想要作一個動畫的過程:先把你須要動的 view 先畫出來,而後經過 動畫 讓他動起來,最後在加上手勢判斷,添加邏輯。github
- 畫出來:
- 動畫 :屬性動畫(Property Animation)、視圖動畫 (View Animation)。
- 設置動做:平移、旋轉、縮放、漸變。
- 設置屬性:時長、重複規律、速度攔截器(勻速、加速、減速、回彈等,也可自定義)
- 特殊場景:ArgbEvaluator 顏色漸變、自定義 Evaluator(設置起始值、根據動畫完成度,自行定義函數),
- 複雜場景:使用 AnimatorSet 來同時管理調配多個動畫;
Android動畫web
扔物線關於 view 的專欄編程
-
優化:頁面、內存json
- 頁面:過分繪製、邊界佈局。
- 過分繪製(Overdraw):開發者模式,調試 GPU 過分繪製。
-
- 移除默認的 Window 背景
- 移除控件中沒必要要的背景
- 減小布局文件的層級(嵌套)
- 邊界佈局
- Hierarchy View 工具
-
- 儘可能讓佈局扁平、減小嵌套、RelativeLayout 代替 LinearLayout、使用 include、merge 等標籤 。
- 內存:溢出、泄漏。
-
安全: 安全這裏接觸的比較少,通常就是代碼混淆,加 360 加固。canvas
-
其餘:
- webview 交互:坑多、不少個性的問題。
- 頁面適配:文件適配,算好各類分辨率文件,放到資源文件中,經過
@dimen/..
引用。
- 新控件: 新控件
-
代碼管理:
3.經驗踩坑
- java 的值傳遞。引用數據類型和基本數據類型在看成參數傳遞時、要時刻明白傳遞的是地址值,仍是值,對數據進行修改時,會不會改變值。
使用滾輪的三方庫,傳入 list,在回調中根據返回的 position 取值發現 list 數據變了,在他的代碼裏發現他是直接進行了賦值操做,在滾動時對 list 進行了修改致使。
- 啓動模式 singleTask 。
在從新開啓頁面的時候,不會走 onCreate 方法,會走 onNewIntent 方法。
- 沒什麼特殊狀況的話,在 build.gradle 中最好使用指定版本。
高德地圖 : 使用的是最新版本,恰巧使用 tinker 打補丁包,發現包大了 20 多兆,查找發現由於使用的是 last 版本,自動更新了,最後改回指定版本。
- 學會換位思想,能夠減小溝通成本。
開啓你的 activity 須要帶哪些參數,能夠在你本身的類裏面寫開啓的方法,把參數帶上。
- 使用重載方法,解決參數數量變化的問題。
分享功能:酒店分享新添加出入店時間,利用重載方法添加參數,省去修改其餘掉用方法。
- 儘可能和 ios 端統一變量和邏輯。
這個坑實在是太多了,歷史記錄最開始是本地保存,我和 ios 各寫各的,後來需求開了,須要同步後臺,發現咱們本地數據類不一樣,又作的適配。活動頁面,從列表進入詳情,ios 列表判斷是否過時,我進入詳情後判斷,形成了邏輯不統一。
- xml 中 include 相同的文件。
只有最上面的佈局纔會被注入到 activity 中,下面的佈局須要手動 findviewbyid。作懸停頁面的時候,經過 include 引入兩個相同的頁面。
- getTop()的方法獲取的高度是相對於父佈局。
郵輪的詳情頁面,添加產品下線時,展現推薦產品功能,佈局進行嵌套(爲了顯示和隱藏),高度對不上,懸停錯誤。
- popupwindow 嵌套 edittext時,沒法使用粘貼功能,系統bug。
處理:換成 dialogfragment 代替。彈窗查詢手機號。
- popupwindow 中 edittext 沒法獲取焦點。
在 new popupwindow 的時候在構造時,選擇爲 true。
- view 實例化,最好使用
LayoutInflater.from(mContext).inflate(getResId(), parent, false)
。
參數介紹
- 使用 NestedScrollView 代替 Scrollview ,防止滑動衝突,以及嵌套 RecyclerView 的顯示不全。
- 引導頁面點擊或者滑動進入,取消點擊按鈕。
setOnTouchListener 重寫 onTouch 方法,進行手勢就判斷攔截。
- 機票日曆選擇頁面,點擊自動定位到中間位置。
從新設置 LayoutManager 中 smoothScroller 的 calculateDtToFit 方法實現。
- 7.0 的新特性的 apk 下載後的升級安裝。
7.0 之後禁止向你的應用外公開。 Android7.0新特性,及Android N適配
-
TextView 和 SpannableStringBuilder。
有一些樣式、間距等徹底可使用 TextView 和 SpannableStringBuilder 去實現。 好比:設置行間距、行數、超過指定字數以 "..." 結尾、設置摺疊、字體居中。 只用一個 TextView 實現字體大小不一樣、顏色不一樣、加粗、刪除線等。
其實你不懂:Android之TextView 不經常使用的幾個方法
【Android】強大的SpannableStringBuilder
- RecyclerView 複用的問題。
item 的狀態、圖片錯亂這個比較常見,好解決。
酒店的房間列表,屬於列表套列表,最開始數據所有返回,加載列表,沒有問題。 後期列表的子列表改爲單獨接口訪問,這就須要更新操做了,問題也就來了,列表的item notifyDataSetChanged 會產生新的 item 對象,新的 item 沒有綁定 adapter ,刷新無效,可是個人子 item 顯示隱藏還必需要刷新,就只能手動更新,不使用 notifyDataSetChanged。
- view.gone 和 invisiable 的區別。
在 RelativeLayout 中,兩個 view 有依賴關係,當一個 view gone 時,另外一個 view 就找不到依賴,位置就亂了。
- onWindowFocusChanged 方法裏面去獲取高度。
須要測量 view 的時候,onCreate 獲取不到,頁面尚未繪製完。
- notifydatechange 是在子線程進行更新,須要時間。
notifydatechange 以後直接調用滾動方法,可能位置會有問題。ScrollView 嵌套 RecyclerView 時,更新後,要經過 ScrollView 定位。
- ScrollView 滑動過快回調會不及時。
作一些懸停漸變的操做時,要在上下邊界從新設置位置或漸變度。懸停和漸變。
- webview 和 h5 同步瀏覽器測試須要設置代碼。
//用於同步瀏覽器調試
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
複製代碼
- popupwindow 裏若是使用的 listview 添加分割線時,在高度計算時,要添加上。
- textview 設置 drawable,更換圖片。
Drawable drawable = getResources().getDrawable(R.drawable.signdown);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
複製代碼
- 頁面添加懸浮按鈕時,最好單獨寫 view 非侵入的 xml,在使用時,直接 new 出來,add 進頁面。不然需求改動,你就哭了。
- webview 交互 h5 時的數據類,須要包裝。
var jsonStr = JSON.stringify(str);
複製代碼
在接收的時候須要去除 "/"。 27. 預覽 pdf 跳轉瀏覽器,Android webview 沒有 ios 的強大。 28. RecyclerView 的 adapter 若是有 if 必定要不全 else 不然會發生錯亂。 29. 簡單的列表建議使用 LinearLayout addview 使用。 31. 機票列表的數據和經停數據不在一個藉口中。
列表一個接口,經停數據須要再次訪問,訪問後使用 map 存儲,減小請求時間。
- 使用代碼主動去調用控件的點擊事件(模擬人手去觸摸控件)
performClick方法
- TelephonyManager 使用時,第一次會走無任何狀態的回調,TelephonyManager.CALL_STATE_IDLE:
添加 一個 變量,第一次走邏輯。
- realm 與 新大陸打印之間的 so 衝突。so 的過濾。
- 屏蔽 home 按鍵引起的 Window type can not be changed after the window is added 問題
- dialogfragment 顯示彈窗 中間有padding link
- edittext 設置整數和小數
android:inputType="numberDecimal|number"
- android rsa 與 java rsa 加密不一樣 link
4.規範
- Android 開發規範 :Android 開發手冊
- 阿里巴巴 java 插件 :java 開發規約插件
- 版本控制規範:使用 GIT FLOW 管理開發流程
5.小技巧
- tips:
- ctrl + p :查看方法的傳入參數
- ctrl + e :查看最近打開的文件
- F2:快速跳轉到報錯的代碼
- alt + 數字鍵 :快速打開對應數字的側邊欄
- ctrl/ctrl + shift + r :當前頁面/整個項目查找替換
- ctrl/ctrl + shift + f :當前頁面/整個項目搜索
- ctrl + shift + f :生成成員變量。
- shift + f6 :重命名。
- alt + m :提取方法(我改鍵了)
- alt + i : generate 的彈窗
- 代碼模版 :相似新建 activity 能夠直接將 MVP。 所須要的類全都生成出來,不用一個一個新建。
- 阿里巴巴矢量圖庫
- tinypng圖片壓縮
6.其餘
- 文案排版:中文文案排版指北
- 在學習技術以外,最好能在掌握其餘的知識,好比:產品、運營
- 給你們推薦幾本書:
- 社科類:《影響力》、《烏合之衆》(心理學)、《啓示錄》(產品)、《原則》、《窮查理寶典》
- 技術類:《24 種設計模式介紹與 6 大設計原則》、《重構》、《大話設計模式》、