android实现地图功能实现,Android快速实现地图功能(不仅快!而且小!)
圖片
導讀
本文旨在提供一個解決思路,不僅適用于添加地圖這一種場景。還有更多的場景可以用到,比如展示在線 PDF 文檔等。
01 前言
最近都在忙著討論項目需求,忙著學習 React Native ,時間一久都快忘記我是一個搞 Andorid 開發的了。今天突然想到了自己在上個項目期間的一個經歷。覺得可能會對一些人有幫助,于是就寫出來和大家分享一下!
上個項目是一個 O2O 類型的項目,在更新了幾個版本之后,老板打算進行推廣,進行地鐵廣告,電梯廣告,地推等等。讓我把 Apk 大小優化一下,說現在的10M太大了,不利于用戶下載。
02 窮途末路
其實我在寫代碼的時候已經很克制了。除了一些必備的三方庫以外,基本也沒有引入什么其他多余的東西。而且我已經做了以下優化工作:
優化圖片大小
使用 tinyPNG 壓縮圖片大小
有些圖片換成 webP 格式,如背景圖
icon 圖標僅保留一套,使用時將 ImageView 大小限制死。僅保留極個別不同分辨率的圖標。
部分icon 使用 svg 代替(少量)
優化布局
優化層級,減少布局嵌套
一個界面一個界面的消除過渡繪制
多使用 include 標簽,重用布局
不必要的布局使用 ViewStub 延遲加載(用的很少)
將可復用資源抽取到對應的 res 文件中,如字符串,樣式等
優化代碼
實體類去除沒用到屬性,并將屬性設為 public ,去除 get / set 方法
減少內部嵌套的實體類,尤其像 GsonFormat 這樣的工具生成的實體類
能服用的盡量復用。
還剔除了一部分我自己常用的打包好的工具類中一些沒調到的方法。
不過,僅是減少幾行代碼,對 Apk 體積的優化成效甚微。
優化三方庫的使用
Glide 還是 Picaso 糾結了好一陣子。Picaso 要小很多
推送,統計,三方登錄,微信支付,地圖,這個沒法刪。但是優化了一下 so 適配CPU的數量。
經過了這些工作后(可能有遺漏,時間太久記不太清了),老板還讓我優化 Apk 大小,我就實在是想不到其他辦法了。而且我把網上能搜到的關于 Apk 優化的文章基本都看了,只要是能用的都會去試一下。但除了圖片以外的優化都收效甚微。
03 靈光一閃
我把 Apk 傳到 **https://nimbledroid.com **上進行了分析,發現其中最占體積的就是【百度地圖】了,足足占了 6M 多。但是我們作為 O2O 產品怎么可能沒有地圖呢?這是產品經理也不會同意的啊。于是我苦思冥想,采取了曲線救國的方式,干掉了百度地圖,最終將那個版本的推廣 Apk 包減小至僅有 3.34M。(由于已經離職,下圖就不顯示App名稱了,除非有廣告費,哈哈哈~)
圖片
思路很簡單,就是用 JS 的地圖替換了原生的地圖。因為我分析了一下地圖在這個 App 的功能占比,其實算是一個比較弱的功能,用戶要想看到地圖頁面,必須經歷以下的流程。
圖片
圖片
如上圖所示,這個頁面的層級比較深,而且根據前面幾個版本的頁面統計數據來看,確實很少有用戶點到這個界面來。但是又不能沒有這個功能,所以最終采取了這樣折中的辦法。性能怎么樣呢?再來個圖給大家看下吧。
圖片
我覺得性能還是可以接受的,雖然不如原生加載的快,但是我很滿意了,因為我把安裝包縮小了(用到的導航功能是跳轉外部地圖)終于可以交差了,而且產品經理和老板都沒有看出和之前地圖的差別來,只是覺得這個小伙子還挺屌的,真的給搞到只剩下3M了(嘿嘿~)。
04 代碼實現
相比集成原生地圖,集成 JS 地圖簡直就是不能再更簡單了!! 不用下載煩人的 jar 包,不用考慮 so 文件的兼容。而且我覺得 JS 地圖只有性能上不如原生,在功能上貌似還要更豐富一點。當然這里只是用于簡單的地圖展示和添加一個 Marker,更多功能可以自行探索。
但是最開始集成的時候我還是遇到了坑,剛開始使用的是百度的 JS 地圖,但是發現在通過 Native 代碼調用 JS 代碼設置 Marker 的時候,百度總設置失敗。網上查了很久,總覺得步驟方法都沒有錯,但是就是不行,正當我打算放棄這個念頭的時候,想起來不是還有高德地圖的么,于是試了一下果然就行了。
先大概說一下步驟:
到開發者平臺申請 JS 地圖的秘鑰
在 assets 目錄下創建一個離線的 html 頁面
在 WebView 中加載該離線頁面
通過 Native 調用 JS 方法,在地圖上添加 Marker 圖標
第一步就不用我說了吧,直接從第二步開始吧。【2】在 assets 目錄下創建一個離線地圖 html 網頁【amap.html】,代碼如下↓↓↓,注意看注釋!!這里可能需要我們會一點 HTML 和 JS 的知識。速成就好了,只要明白一個 html 頁面是如何搭建起來的就行。
圖片放大看,源碼點原文▼
圖片
【3】然后創建一個帶 WebView 控件的 Activity 頁面,在代碼中將該 WebView 的 setJavaScriptEnabled() 方法設置為 true,然后通過 webview 加載 asstes 中編寫好的離線地圖 amap.html 文件。
圖片
【4】最后在 JS 地圖上設置 Marker 就行。這里涉及到了 Native 調用 JS 代碼,不熟悉的可以搜索一下。
圖片
05 結語
這個 App 是一年多以前寫的了,因為最近在學習 React Native,就突然回想起了那次通過 JS 解決問題的經歷。 所以寫出來和大家分享一下。其實還有很多業務可以通過這種思路去解決,但是通過 WebView 調用 JS 代碼畢竟還是存在性能上的局限性,所以才會出現像 RN 這樣的技術。恩...看來還是要早點把 RN 學好才行!哈哈~
轉載
總結
以上是生活随笔為你收集整理的android实现地图功能实现,Android快速实现地图功能(不仅快!而且小!)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue通过for循环生成的checkbo
- 下一篇: 我这几年的生活