前言
前幾天去參加了一場面試。面試的題目大多很基礎,有一道關於埋點的問題,面試官問我如果不用第三方SDK進行埋點,自己埋點的話,如何減少埋點對業務程式碼的入侵。
當時沒想太多,就說建立一個 BaseView 類,在這個類中進行埋點的操作,然後使需要進行埋點操作的 View 繼承這個 Base 類。後來想想,這個方案其實存在很多問題,因為讓每個需要埋點的 View 去繼承 BaseView 類,說明 View 需要自定義,會耗費很多的時間和精力,對於自帶的 Button 等控制元件的埋點,這種方法又無法實現。所以說,其實在這個問題上,我答的不是很好,但可能之前的幾個問題答得不錯,面試官也沒說什麼,就說行,然後繼續問下面的問題。
對於埋點,減少業務程式碼入侵這個問題,我回來想了想,或許用代理模式來實現,會是一個很好的選擇。
埋點先來說說埋點的概念,埋點就是在使用者使用APP時,對使用者的操作行為進行記錄,比如使用者點選了一個 Button 然後跳轉至了哪個介面,然後在這個介面上又點選了哪個控制元件,等等等一系列操作進行記錄,然後APP將行為記錄傳至後臺,這就是埋點。
利用這些資訊,可以對使用者進行數字畫像,根據使用者的行為特點,針對性地提供功能服務,以及對軟體的優化等。現在市場上已經有很多第三方的埋點SDK,比如說友盟的使用者行為資料檢測。
這些第三方SDK,基本上不用對自己的業務程式碼進行改變,就可以進行埋點的操作,而如果我們自己來實現埋點的話,基本上的思路就是,在使用者點選控制元件的時候,對使用者這個行為進行記錄,然後進行一些資訊處理操作,程式碼來實現就是。
mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //埋點操作 actionRecord(); //跳轉至另外一個介面 startActivity(new Intent(mContext,AnotherActivity.class)); } });
actionRecord() 裡是一些埋點相關的操作,我們可以看到,這個操作已經入侵到了我們的業務程式碼中,埋的點如果少還好,如果有大量的點要埋,這種實現方式後期維護將變的十分困難,因此需要另外一種方法來實現。
/** * Created by chaochaowu on 2018/9/15. */public class OnClickListenerProxy implements View.OnClickListener { private View.OnClickListener listener; public OnClickListenerProxy(View.OnClickListener listener) { this.listener = listener; } @Override public void onClick(View v) { //埋點操作 actionRecord(); //呼叫在業務程式碼中定義的 onClick 操作 listener.onClick(v); } private void actionRecord(){ //一些埋點的操作 }}
將埋點相關的操作全都放入這個代理類中,在業務程式碼中,呼叫如下。
mButton.setOnClickListener(new OnClickListenerProxy(new View.OnClickListener() { @Override public void onClick(View v) { //跳轉至另外一個介面 startActivity(new Intent(mContext,AnotherActivity.class)); } }));
可以發現,業務程式碼中沒有出現埋點相關的操作,我們由此減少了埋點操作對業務程式碼的入侵,埋點的操作交由代理類實現,如果我們需要對埋點操作進行修改,只要對代理類中的方法進行修改,而不需要去每個埋點的地方修改。
以上便是減少埋點對業務程式碼入侵的一種方式,不過,如果專案真的有埋點的需求,我會優先考慮使用第三方(逃。
最後最後不管怎麼樣,不論是什麼樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的準備,當然除了這個還需要在平時把自己的基礎打紮實,這樣不論面試官怎麼樣一個知識點裡往死裡鑿,你也能應付如流啊~
快來獲取學習資料提升自己去挑戰一下BAT面試難關吧!
Android 學習,面試文件,視訊收集大整理
最後祝大家面試順利!