1. 程式人生 > >Android面試總結(不定時更新版)

Android面試總結(不定時更新版)

前言

因為個人原因想換個公司,所以最近一直忙著交接工作和準備面試,可能準備得比較充分面了幾家都過了,然後進了第一家,一直想寫個文章記錄下面試的事情,所以每次面試完我就在筆記本上記錄了面試的問題,然後斷斷續續寫了這篇文章,文章存了很久一直沒發表,一個是前面剛入職看”前任”的程式碼沒時間,另一個覺得內容不夠豐滿所以一直沒發表,文章的問題是我個人的面試經歷,問題的答案有些並不是當時面試的回答,是我參考了相關資料重新組織語言來說明的,希望找工作的筒子能從中得到幫助,PS:因為可能涉及公司隱私所以我把公司名字給忽略了。

廣西XXX網路科技有限公司

一些廢話:筆試大概二十來分鐘,面試大概一個半小時,一面是另一個專案組的Android技術大牛來面的,全程我感覺他都對我不露任何表情(可能大神的高傲..),但是入職以後發現這大牛其實人還不錯的,二面是所在專案組的組長,好像是產品出身,所以二面沒聊技術,就聊些有的沒得,把該跟HR聊得在這面裡聊了,入職以後發現其實公司氛圍很好,上班不用打卡,免費零食水果(就是這麼容易被滿足..),五險一金按全額工資比例買,而且最主要的是人事妹子很漂亮有沒有!!別的專案組的測試妹子很漂亮有沒有!!我上個部門駐點開發,整個部門23個人,全他麼是男的有沒有!!那種感覺很影響工作心情有沒有!!咳咳,好了迴歸主題..

筆試(摘選)

其實我對這些筆試是很鄙夷的,網上找些筆試題然後讓我們做,但是我還是偷偷拍下了筆試題,畢竟沒準下一家公司跟這家找的是同一套題呢(壞笑臉)..
Q、下列程式碼的執行結果是什麼

System.out.print(100 % 3);
System.out.print(",");
System.out.println(100 % 3.0);

A::1,1.0,這送分題,java自動型別轉換,不會的查資料去…

Q、在繼承中,關於構造方法的說明,下列說法錯誤的是
A、子類無條件的繼承父類的無參構造方法,
B、子類可以引用父類中的有參構造方法,使用super關鍵字,
C、如果子類沒有構造方法,則父類無參構造方法作為自已的構造方法,
D、如果子類有無參構造方法,而父類的無參構造方法則被覆蓋。
A:

這題選D,錯得很明顯

Q、下列程式碼的執行結果是什麼

int x=3;  
int y=1;  
if(x==y)   
    System.out.println("Not equal"); 
else   
    System.out.println("Equal"); 

A:輸出為:Equal,吐槽:想出這道題的人我也是服了..

Q、下列程式碼的執行結果是什麼

public class MyClass{
 static int i;
 public static void main(String argv[]){
 System.out.println(i);
 }
}
A) Error Variable i may not have been initialized 
B) null
C) 0 D) 1

A: C整型全域性變數初始化值為0

Q、常用的設計模式
A: 單例 工廠 建造 代理 觀察者 介面卡模式等等..

Q、android中使用SQLiteOpenHelper這個輔助類時,可以生成一個數據庫,並可以對資料庫進行管理的方法可以是?

  • getWriteableDatabase()
  • getReadableDatabase()
  • getDatabase()
  • getAbleDatabase()

A: getReadableDatabase()和 getWriteableDatabase()都可以得到一個可既可以讀又可以寫的資料庫物件,不同的是,當磁碟空間滿了之後, getReadableDatabase()得到的是一個只讀的物件,而 getWriteableDatabase()則會丟擲異常。

Q、 Intent傳遞資料時,下列的資料型別哪些可以被傳遞
A、Serializable B、charsequence C、Parcelable D、Bundle
A: ABCD

Q、 android 中下列屬於Intent的作用的是
A、實現應用程式間的資料共享
B、是一段長的生命週期,沒有使用者介面的程式,可以保持應用在後臺執行,而不會因為切換頁面而消失
C、可以實現介面間的切換,可以包含動作和動作資料,連線四大元件的紐帶
D、處理一個應用程式整體性的工作
A: A

我本來想一道道寫出來,但是發現好多都是很基礎的,一個個列出來好費時間…所以我就列出來問題大概意思好了,不知道的自己去查資料..android五大布局、四大元件、activity四種啟動模式、service的啟動方法、android資料儲存方式、效能優化、開發技巧、程式碼優化,陣列排序,連續有序的陣列有且只有兩個數相同,寫方法找出來,還有些智力題就不列出來了..以上就是整個筆試題了,筆試時間要求四十分鐘內,其實我做下去也就二十來分鐘就做完了..

面試(摘選)

自我介紹: 這個環節基本都是每個面試的開場白,回答的時候應該有下面幾個重點

  1. 個人基本資訊(姓名、年齡、老家、居住地等);
  2. 來自哪裡(工作地點),是幹什麼的(Android開發工程師),擔任過什麼職務、做過什麼樣的專案;
  3. 自己為何來公司面試;
  4. 最後祝願(希望能得到貴公司的認可等等)。

PS:真誠自然,不能給人套路的感覺(微笑臉)。

Q、上家公司的情況
這個問題就如實說就好了,比如我當時說的是我上家公司是XXX公司,在XXX,是做XXX的,主要的專案是XXX之類的,其實問這種問題最好回答了,在這種問題上儘量扯久點,這樣問別的技術問題的時間可能就少了,成功的概率就又大了點(~ _~)

Q、專案經驗
這個就說自己做過的專案,要點也就這幾個,這個專案是什麼型別的,自己負責的模組,如果可以,把專案用到的技術跟專案碰到的問題和解決方案都說出來,注意一點,千萬不要把作為一顆螺絲釘的功能放大到主結構的功能,當然要是在這個專案上真的是自己獨立設計框架之類的這些就沒什麼了。

Q、用SQL語句獲取當前時間
mysql 、 access: select now();
sqlserver : select getdate();
oracle : select to_char(sysdate(‘yyyy-mm-dd hh24:mi:ss));
講真關於資料庫這塊我是弱項,我真的怕他接著問資料庫的優化或者再往下深入的問,然後我當時說完就扯別的了,扯到別的什麼地方我也不記得了..
Q、Activity的生命週期跟四種啟動模式
這個問題我以前在部落格中分析過,其實就是回答生命週期,然後在什麼場景會觸發這些生命週期方法,如果想加分的話可以再說下異常情景下怎麼儲存資料,然後四種啟動模式要說明應用場景(PS:最後附上一句,啟動模式的設定要符合應用場景,不能為了設定啟動模式而設定啟動模式,多說了這句話逼格會高很多- -!),另外附上鍊接:
Activity生命週期
Activity四種啟動模式

Q、在Java中物件的引用有幾個級別
在Java中物件的引用有四個級別,強引用 、軟引用、弱引用、虛引用。

強引用:最普遍的引用,不申明物件引用時預設就是這個引用。在Java中即使記憶體不足,垃圾回收器(GC)也只是丟擲OutOfMemoryError異常而不會回收使用這個引用的物件。

軟引用(SoftReference):只要記憶體足夠,垃圾回收器(GC)就不會回收這個物件,如果記憶體不足,垃圾回收器(GC)就會回收使用了這個引用物件的記憶體,
使用方法:

  Object obj = new Object();
  SoftReference softReference =new SoftReference(obj);

這樣obj這個物件的引用就是軟引用了。

弱引用(WeakReference):跟軟引用類似,但是不同點在於只要垃圾回收器(GC)掃描了這個引用所在區域的記憶體時,無論記憶體足夠與否都會去回收這個物件的記憶體。使用方法:

 Object obj = new Object();
 WeakReference weakReference =new WeakReference(obj);

虛引用(PhantomReference):
這個引用隨時都會被垃圾回收器(GC)回收使用方法同上,就是換個類。
其實說到上面那樣的層面已經差不多了,想活學活用可以說在ListView優化的時候使用弱引用(WeakRefrence)引用ImageView物件,但是說這個的前提是你得熟悉ListView優化,不然有些老程式設計師可能會接著這個點問下去的。既然說道ListView優化這裡多提一下ListView優化,可以由以下幾種方式優化
①. 複用ConvertView
②. 自定義靜態類ViewHolder
③. 使用分頁載入
④.使用弱引用(WeakRefrence)引用ImageView物件
然後一個個把上面的點進行分析。

Q、startService和bindService的區別
這兩種方式最主要的區別是startService是當呼叫者一旦啟動Service這時呼叫者跟Service沒什麼關聯,這種方式一般通過Context.stopService來停止服務,而bindService可以繫結(呼叫)Service的方法或資料,unBindService可以解綁服務。

Q、看簡歷你寫平常會寫寫部落格,你一般寫些什麼
我寫部落格的目的是為了記錄Android開發的,所以部落格寫的都是Android開發的知識點,遺憾的是瀏覽量很少,主要是以後忘了的時候翻一番自己寫的東西,寫了部落格以後才發現寫一篇部落格要查很多的資料,同時也能掌握一些平常沒注意的知識點,等等雜七雜八的..

Q、那你有沒有在github上開源過什麼專案嗎
沒有,我希望以後有機會參與…

Q、Android進行跨程序的幾種方式
這個問題我以前也分析過..就把幾種跨程序的含義介紹一遍然後把方式、使用方法跟應用場景一個個進行分析,然後總結下他們的優缺點..附上鍊接:
Android 關於IPC機制的理解(一)
Android 關於IPC機制的理解(二)
雖然文章有但是還是要再說說AIDL,作為拓展我列下這個問題並解答
什麼是AIDL,以及如何使用,能處理什麼型別的資料?
AIDL(Android interface definition Language ),Android 介面定義語言,
使用aidl可以幫助我們釋出以及呼叫遠端服務,實現跨程序通訊。
使用:AS中,在Main目錄下右鍵新建一個aidl檔案,然後修改這個檔案的方法,還上自己業務需求的方法,然後Build->Make Project(快捷鍵Ctrl+F9)
然後在gen目錄就生成了對應的介面檔案。然後通過bindSerVice方法繫結遠端服務,在bindService中有一個ServiceConnec介面,覆寫該類的onServiceConnected(ComponentName,IBinder)方法,這個方法的第二個引數IBinder物件其實就是已經在aidl中定義的介面,因此我們可以將IBinder物件強制轉換為aidl中的介面類。然後通過IBinder獲取到的物件(也就是aidl檔案生成的介面)其實是系統產生的代理物件,該代理物件既可以跟我們的程序通訊,又可以跟遠端程序通訊,作為一箇中間的角色實現了程序間通訊。
AIDL預設情況下只能傳遞基本型別、String、List、Map、CharSequence。

Q、應用程式使用了多程序時怎麼呼叫同一個Application的方法
這個問題是最後快要結束面試的時候面試官丟擲來的,太急我也沒記得大概什麼意思,反正就是多程序操作Application的問題,這其實是他挖的一個坑,主要是想看你掉不掉裡面了,採用多程序時一個新程序啟動Android會分配一個新的虛擬機器並劃分新的記憶體地址,記憶體地址都不同了Application肯定不是同一個了,所以多程序時Application也會多次建立,不是同一個Application肯定操作的方法就不一樣了,把這點跟他說了也就可以了

Q、說說Java執行緒池策略
這個就把執行緒池的幾個引數跟他說清楚,然後把Java提供的幾種執行緒池策略說一下,然後再說一下自己封裝的執行緒池策略就可以了,講真,面試官真不是我親戚..也不是我特意又要貼我的文章的..但是我前面確實詳細的在文章裡解析過了..
Android 關於執行緒池的理解

Q、平常專案中用過ContentProvider嗎
這個你要答沒用過感覺就麻煩了,當然也是看業務需求,某些專案中也確實用不上,但是沒用上也一定要說做過深入瞭解,畢竟四大元件之一..要點就是把ContentProvider的應用場景說一下,要是熟悉就再扯深入點,不熟悉就答到上面的程度也差不多了。如果深入可能他會這麼問:
ContentProvider是怎麼實現資料共享的
ContentProvider對外提供了url地址,並且提供了增刪改查方法,其他應用通過contentresolver呼叫ContentProvider對外的增刪改查方法就可以去操作資料庫了。

Q、未來三到五年的規劃
本來自己也喜歡Android開發,所以就說還是往開發層面去發展…

Q、我想問你的問題已經問完了你有什麼想問我的嗎
問到這裡其實我猜這個工作已經十有八九拿到手了,因為事先了解過公司的待遇,期望薪水也寫在了面試單上,所以這時為了突出自己技術屌絲的身份氣質得多問下專案進度,專案團隊,公司狀況,之類的,問完這些之後他就說他去找專案的總監來面試我了,叫我等下。

Q、平常用什麼管理程式碼
SVN,但是偶爾寫部落格會把程式碼用git傳到github。

Q、為什麼要離職
這是第二個面試官問我的,把離職原因跟他說一下就好了,注意的是原因千萬不能說上家公司不好,也不能說工資不合適(雖然大多是這個情況..),多往自己身上找原因,但是也不能說自己很大的問題,不然人家也不敢錄用你…反正就是有個度,比如我是因為公司要去外地駐點了,我暫時沒有去外地工作的打算,所以在專案交付之後就跟領導提出了辭呈申請,注意千萬不能說專案沒完成自己就走了之類的話,這樣會給別人你不負責任的印象..反正這些跟情商之類的有關,正常人多注意也就沒什麼了。

Q、我想問你的問題已經問完了你有什麼想問我的嗎
關於我想知道的在上一個面試官那裡已經問過了,我暫時沒什麼想問的了

Q、我看你簡歷上寫了期望薪水是XXX,跟你上個公司的跨度有點大,而且你才畢業一年我們恐怕給不了你這麼多,你能接受的最低的薪水是多少
我當時就覺得我傻逼了..居然如實的寫了我在上家公司的工資..然後想想這確實跨度大了很多,沒辦法我最後說了一個比期望薪水少兩千的工資(T_T),

廣州XX科技有限公司

一些廢話:這個公司在另個區,怕遲到面完上家公司我就直接趕過去,午飯都沒吃,這是一個做電子商務的公司,環境我也比較喜歡,很靜,周邊沒什麼公司,但是離地鐵口很近,上班也方便,公司裡面已經有兩個Android了,面試我的是一個專案組長,他也是搞Android的,面了估計一個半小時…最後他還叫我去用他電腦做個機試題,機試題也不難,但是要花點時間,我當時很累看了下機試題沒做就跟他說了下大概思路然後說我不想做想回去睡覺,能跟他說這些話是因為我跟他前面聊了很久,氛圍也很好,而且我真的很累,飯都沒吃,然後當時我已經知道第一家已經要我了,而他能給我的工資比第一家還低那麼一點點,所以就有底氣不機試了,因為聊得不錯我也跟他說了這些情況,最後他把我送到了電梯口然後幫我按了電梯(感覺受到了莫大的尊重),然後我回去之後收到了他的簡訊,大意是叫我明天再去跟他老闆面試,工資我可以直接跟他老闆接著談..最後我會貼上簡訊..

面試(摘選)

這公司是沒有筆試的(這個好),填完資料直接面試了,首先也是自我介紹什麼的,然後就是面試問題和回答了。有些問的問題是跟第一個公司一樣的,我也一起列出來

Q、Java執行緒池策略
同上面的問題一樣..

Q、對MVP有了解嗎,它跟MVC的區別是什麼
MVP是MVC的進化版,或者說是適應Android版,讓Model和View完全解耦,在MVC中

  • Model:業務邏輯和實體模型
  • View:佈局檔案
  • Controller:Activity

我們知道佈局能做的事情並不多,只是介面的顯示而佈局檔案中的資料展示控制元件的點選事件等等都是在Activity中進行的,事件處理的程式碼都在Activity中,這就使得Activity既像View又像Controller,所以仍然解決不了程式碼耦合度的問題,所以把程式架構設計成MVP之後變成了

  • Model :業務邏輯和實體模型
  • View :Activity,負責View的繪製以及與使用者互動
  • Presenter :負責完成View和Model間的互動

MVP架構減少了Activity的職責,簡化了Activity中的程式碼,將複雜的邏輯程式碼放到Presenter層中進行處理。這樣的層次劃分使得程式碼的耦合度降低很多,也便於維護了。
然後他接著問了有沒有用過MVP架構去寫過專案
我因為確實沒用過,就如實跟他說只是做過demo並沒有應用到自己的專案中(關於類似這些一定要如實說,沒用過就老實說沒用過,千萬不要沒用過說用過然後他追問下去回答不出)
然後他接著追問了既然MVP優勢這麼明顯你卻不應用到專案中
我當時說的是專案是兩個人開發的,專案架構的選型不是我定的,如果以後只有我一個人開發的時候我可能會選擇用這個架構思想去設計或重構專案。

Q、聽說過RxJava和RxAndroid嗎
聽說過
用過嗎
沒用過(真的是停留在聽說過的環節..),但是看網上評論好像不錯的樣子,以後有時間一定研究研究
既然你聽說過但是為什麼不去做個Demo瞭解下
這兩個名詞是在我前不久無意中看到的,但是當時正在趕專案沒注意到,後面專案完了離職要交接專案跟準備面試,所以沒得深入進行了解,等我過段時間穩定了就去研究研究。其實從技術來說,時不時就會出一些我們沒接觸的新東西,不知道是很正常的,不知道就老老實實跟人家說不知道就好了,但是要給人家一個你現在不知道,但是你以後有時間會去研究的印象,畢竟我們是技術型屌絲不是。

Q、瞭解過熱修復嗎
瞭解過
那你跟我說說他的原理是什麼
其實我也沒實際用過熱修復,就是之前瞭解過大概原理,所以就把我瞭解的跟他說了,具體可以參考這兩篇文章
安卓App熱補丁動態修復技術介紹
Android 熱補丁動態修復框架小結

Q、以前有用到什麼加密技術嗎
這個至少MD5加密要說出來的,還有什麼對稱非對稱加密,比如使用者名稱跟密碼可以用md5加密用sharepreference儲存本地避免二次登陸之類的,然後還有什麼公司自己的加密演算法之類的(如果有)
如果這塊熟悉可以接著說優缺點之類的,為了方便我這裡總結了個常用的加密(其實用不上說這麼詳細,但是可以跟面試官說說,沒興趣直接跳到下一題..)
加密:對稱加密、非對稱加密
1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。
對稱加密
2. 對稱加密都有密碼。
3. 常用的加密方式DES, AES

DES 通過密碼,對資料進行大量迴圈方式的異或操作,從而生成加密後的資料。DES對資料依次進行加密,一次加密是8個位元組一起,因此,DES密碼,必須是64bit,也就是8個位元組
DES加密實現
1. DES加密之後的資料,不能夠直接生成字串的;
2. 加密: M 明文, K 12345678, D 加密後資料
D = DES(M, K) 用K密碼對M進行加密生成D
3. 解密:M = DES(D, K)
4. 這種可以通過相同的密碼進行加密和解密的叫做對稱加密。
DES API
1. Cipher 加密/解密引擎,用於實際的處理
2. cipher.init(int mode, Key key) 設定加密還是解密
3. Key 對於DES需要使用 SecretKeyFactory 進行密碼建立
建立密碼物件用的是 DESKeySpec
4. Cipher update(byte[]) 每次呼叫都會返回一部分處理的資料,DES API doFinal 就只能返回最後一次的資料,不是完整的,
5. DES 加密推薦使用 doFinal 來完成。
DESede 加密方式
對於DES 或者 DESede 而言,如果實現DESede的話,那麼:Cipher 演算法調整為 DESede,SecretKeyFactory制定的演算法,同樣調整為 DESede, 其中需要使用 DESedeKeySpec 生成密碼,而且密碼的長度 24個位元組。
AES 加密演算法
1. 速度快
2. 強度高
3. Java中預設支援 AES 128bit 加密
AES 256bit 美國軍方的標準;
AES 256bit 需要美國出口許可證才可以用。
DES, AES 特性 - 分塊加密
Padding: 加密的時候,分塊是資料按照固定長度一塊一塊處理,可以通過 Cipher 引數進行分塊的控制
NoPadding:如果資料不是塊長度的倍數,那麼不會填充
一般情況下,填充會自動向資料後面新增 位元組0 補齊
AES 常用的Cipher演算法
1. AES 預設可以使用,有時也會出現BadPaddingException,不建議使用
2. AES/ECB/PKCS5Padding 另外一種AES 加密形式,建議使用
3. AES/CBC/PKCS5Padding 內部的演算法模式不同。
4.演算法及密碼長度限制
演算法/模式/填充 16位元組加密後資料長度 不滿16位元組加密後長度
AES/CBC/NoPadding 16 不支援
AES/CBC/PKCS5Padding 32 16
AES/CBC/ISO10126Padding 32 16
AES/CFB/NoPadding 16 原始資料長度
AES/CFB/PKCS5Padding 32 16
AES/CFB/ISO10126Padding 32 16
AES/ECB/NoPadding 16 不支援
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始資料長度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支援
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16
AES API
1. Cipher 加密/解密引擎
2. 建立密碼生成器 KeyGenerator,設定密碼生成的密碼長度 128 bit和裝置安全隨機數 ,
如keyGenerator.init(128, new SecureRandom(password.getBytes()));
3.生成 SecretKey keyGenerator.generateKey()
4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey)
5. 加密處理 cipher.doFinal(byte[] origData)
非對稱加密演算法
加密實現
1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001
2. C = M ^ E mod n
3. M = C ^ D mod n
4. 通常 E + n 作為 私鑰隱祕儲存
5. 通常 D + n 作為公鑰,可以給任何人。
6. 通過 C ^ D mon => M
7. E 通過計算兩個 1024bit 以上的整數(並且是素數),
公鑰 D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數
D 安全性足夠高
非對稱加密的API
1. Cipher 可以進行加密,用的是 “RSA”, “DSA”
2. KeyPairGenerator 生成 公鑰和私鑰
3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。
加密實現
1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001
2. C = M ^ E mod n
3. M = C ^ D mod n
4. 通常 E + n 作為 私鑰隱祕儲存
5. 通常 D + n 作為公鑰,可以給任何人。
6. 通過 C ^ D mon => M
7. E 通過計算兩個 1024bit 以上的整數(並且是素數),
公鑰 D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數
D 安全性足夠高
非對稱加密的API
1. Cipher 可以進行加密,用的是 “RSA”, “DSA”
2. KeyPairGenerator 生成 公鑰和私鑰
3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。
Base64、MD5編碼
android.util.Base64類
encode(byte[],flag)
encodeToString(byte[],flag) 編碼並轉換成字串
decode(byte[],flag) 解碼
flags標識
Base64.DEFAULT 預設,如果字串過長(超過76)時自動在中間加一個換行符,字串最後也會加一個換行符。可能會導致和其他模組對接時結果不一致,建議使用Base64.NO_WRAP
Base64.NO_WRAP 不換行處理
Base64.NO_PADDING 結束位置省略“==”
it.sauronsoftware.base64.Base64類
第三方Base64編碼、解碼工具類
Base64.decode(byte[]);
Base64.encode(byte[])

Q、說說Android的訊息機制
這個問題我前面專門寫過部落格..
Android訊息機制詳細解析

機試

附上機試題:
這裡寫圖片描述

就是一個listview,上面的資料是json格式的,然後給你介面地址,點選全選就把所有的checkbox都選上,然後把價格也顯示,其實不難,也是很常用的一個功能,有興趣的可以自己做一下,沒有眉頭的可以看下面的文章
帶checkbox的ListView實現(二)——自定義Checkable控制元件的實現方法

最後附上面試官簡訊證明面試真實有效..
這裡寫圖片描述

廣州XX科技有限公司

一些廢話:其實我一開始就沒打算去這個公司,只是好久不面試了,去漲點經驗而已,不打算的原因是因為公司是大小周的,我入職其實沒什麼大的要求,但是不能是大小周的,因為我感覺一週上五天其實已經很疲乏了,週末還要上班就感覺受不了了,這公司居然大學城,我去了感覺太喜歡這個環境了,樹很多環境很好,人也不多,離地鐵口很近,而且最主要的是人事妹子說中午可以去附近的幾個大學飯堂吃午飯!!!!這太誘惑了有沒有,大學飯堂意味著什麼,意味著便宜好吃的美食!!你們以為我想表達妹子多嗎,太膚淺了!!(同學你好我是附近學校的學生你可以告訴我飯堂怎麼走嗎,噢噢,你也剛好要去吃飯啊,我沒有飯卡可以先刷你的然後我微信轉賬給你嗎,可以啊,那謝謝了哈
這裡寫圖片描述

PS當年在學校讀書我真的用類似方式搭訕過漂亮妹子(壞笑臉)),咳咳,回到主題,其實這家公司除了大小周這個我不喜歡之外還有個面試官跟我說他們專案很多也會很趕,加班是常事,最厲害的他見過一個同事加班到第二天早上七點..但是壓力越大回報也越大,他們的有年底雙薪,年終獎看專案情況大概是8-22個月薪水,因為我沒打算去這個公司所以當時問我期望薪水我說了很高的數字,但是最後還是沒去,因為我怕自己扛不住,6號人事打電話給我說我被錄用了當時問我願不願意,我還真多猶豫了下,最後還是跟她說不去了,其實我應該說去的,這樣她就發錄用郵件給我了,大學畢業一年了,第一次收到工資這麼高的工作,郵件儲存下來也好啊…

筆試(摘選)

Q、請描述一下廣播的註冊方式
1. 靜態註冊,在清單檔案中註冊,這種註冊方式屬於常駐型註冊,就是即使應用在退出狀態一旦系統有相關的廣播發送也會進行接收處理,這種註冊方式在使用時要考慮清楚,畢竟常駐去監聽系統廣播這樣會消耗系統資源什麼的。
2. 在程式碼中動態註冊,這種註冊方式一般跟隨Activity生命週期或App開啟與否,通過registerReceiver去註冊監聽,unregisterReceiver去解除監聽。這種註冊方式也是我們專案中常用的註冊監聽廣播方式。

Q、在Service的生命週期方法onStartCommand()可不可以執行網路操作?如何在Service中執行網路操作?
可以在這個方法裡執行網路操作,在Service中執行網路操作跟在Activity或Fragment中執行網路操作方法是一樣的。

Q、呼叫下面的方法,得到的返回值是什麼

  public int getNum() {
        try {
            int i = 1 / 0;
            return 1;
        } catch (Exception e) {
            return 2;
        } finally {
            return 3;
        }
    }

這是道經典面試題,返回值是3,首先程式碼執行第三行,這裡會報一個錯誤MathException,但是trycatch了,所以會走到catch程式碼段,所以第四行不會執行,然後在catch裡面有個return方法,異常機制有個原則,就是在catch中有return或者其他異常(比如這裡把return 2換成 int j = 1/0又產生一個異常)讓函式終止的話,那麼如果有finally程式碼塊,finally程式碼塊就必須先執行完然後再執行catch程式碼段,但是這題在finally裡面return了,所以就沒有機會執行到catch程式碼段了。如果finally程式碼執行的是其他(釋放資源等)操作時,最後返回的還是catch程式碼段的2.

Q、頁面上現有ProgressBar控制元件,請用執行緒以10秒的時間完成其進度顯示工作(核心程式碼)

 public class MainActivity extends AppCompatActivity {
    private static final int FLAG = 1;
    private ProgressBar pb;
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == FLAG)
                pb.setProgress(msg.arg1);

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb = (ProgressBar) findViewById(R.id.pb);
        pb.setMax(10);
        progressShow();
    }

    private void progressShow() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 10; i++) {
                    Message msg = mHandler.obtainMessage();
                    msg.what = FLAG;
                    msg.arg1 = i;
                    SystemClock.sleep(1000);
                    mHandler.sendMessage(msg);
                }
            }
        }).start();
    }

面試

Q、Java執行緒池策略
同上面的問題一樣..

Q、說說Android的訊息機制
同上面的問題一樣…

Q、Thread和AsyncTask的區別
其實懂得了執行緒池策略,就跟面試官說AsyncTask使用的執行緒池策略是什麼,它內部封裝了三個方法,然後說下Thread更新是加上Handler進行UI更新的,我當時說的就是上面兩種區別了。

Q、Fragment和Activity之間是如何傳值的?
Fragment和Activity繫結之後,在Fragment中可以直接通過getActivity()方法獲取到繫結的Activity物件,這樣就可以呼叫Activity的方法了,也就可以獲取Activity的值。
而Activity要想獲取Fragment的值可以使用

  getFragmentManager().findFragmentById();
  getFragmentManager().findFragmentByTag();

這兩個方法來獲取Fragment的例項然後獲取Fragment的方法。
如果是一個Activity繫結的Fragment想要傳值到另一個Activity,那就在先把值傳到繫結Activity然後getActivity().startActivity時通過Intent進行傳值。

Q、介紹一下你做能夠體現你符合期望薪水的app
我當時把自己做過的app都演示給他看了,說了說開發模組的時候碰到什麼問題怎麼解決之類的。

Q、遇到過OOM嗎
遇到過(這你要說沒遇到過就..),在XX專案前期載入多圖的時候
怎麼處理的
OOM異常算比較常見的問題。Android系統為每一個應用分配一個虛擬機器,虛擬機器的預設堆記憶體只有16M(手機配置不同分配的有可能不同),,所以很容易導致OOM異常的產生。導致這樣的異常主要有以下原因:
1、載入大或數量過多的圖片沒有進行圖片壓縮操作;
2、操作資料庫的時候遊標(Cursor)沒有關閉
3、io流,file流資源未釋放
4、記憶體洩露。
第一種可以自己把圖片進行壓縮也可以使用市面上的第三方庫去載入,後面三個經常review並優化程式碼可以解決,當然記憶體洩露可以使用效能分析工具來檢查。

Q、以前專案的任務分工是怎麼樣的
這個如實說就好了
Q、獨立開發過app嗎
有過
Q、如果叫你獨立開發一個app你覺得大概需要多久
我當時覺得問這個問題很業餘啊…app的複雜程度,跟後臺協商資料的時間長短,產品提的需求明不明確等等都會影響專案週期,這些問題沒搞清楚我怎麼知道會花多久..
Q、整合過微信支付嗎,如果叫你整合大概花多久
只整合過支付寶支付,微信支付以前專案沒整合過,如果讓我來整合我可能得先看微信的開發文件和提供的demo才能告訴您大概多久,但是如果公司急著要這個模組我可以加班加點儘快做出來。

Q、為什麼離職
上面分析過這個問題了..

Q、有什麼想問我的嗎
同上…

廣州XXX科技有限公司

一些廢話:Android的市場現在真的不得了,我陸續投了一百六十多份簡歷,也才四個公司叫我去面試,要換平常這個公司我面試都不會去,因為沒有人事跟我商量過時間,是直接發郵件叫我哪天哪個時間段去面試的,但是因為面試前一天都沒收到面試呆在宿舍也沒事幹,所以還是去面試了,因為上面說的,我覺得我沒受到尊重所以我一開始也是不打算去這個公司的,去了以後發現如我所想,是一個大公司下屬的創業團隊,面試官一直跟我說融到資我的薪水就可以翻一翻,但是我發現他們很多東西都不完善,就連這個最基本的面試,人事打個電話跟我約時間很難嗎,然後去了的時候發現面試官在開會..然後我就在外面等了估計二三十分鐘,我其實也不是不能等,但是你要是開會可以跟我約遲一點的時間不是..不吐槽了..

面試

面試官不懂技術,然後叫我看了他們的專案,然後有什麼問題,我看了看,很多明顯的錯誤,首頁viewpager滑動不了,ScrollView滑動有問題,,我當時就想這樣的版本居然也上線了,,然後後面我才知道,他們沒有測試,,一個產品身兼測試,跟開發者自己也測試,,其實這個面試是可以忽略的,因為這是一個不同層級的面試,我一個Android開發,跟他一個不懂技術的面試官,我就指出我看到的問題,然後告訴他如果是我我的解決方案,說完以後大概我覺得就差不多了,然後他跟我說他們公司的情況,什麼創業團隊啦,提薪的方式只有融到資啦,只有五險沒有一金之類的,然後最後他問我是不是不會考慮他們公司,我就直接說是的,,然後就沒有然後了,我這麼做也是有考量的,當時他們的Android開發還沒有辭退,然後他說我進去了就會辭退他,但是通過這個面試我感覺他們有太多的不完善,這開發有責任但是沒有測試,沒有直接領導去監督專案,雙方都有責任的,所以有時候準備很充分不一定用上。其實碰上不懂技術的面試官是一件矛盾的事,你不會跟他在技術上面擦出任何火花,但是對於工作而言你又很容易進入這家公司,但是我覺得如果面試官不懂技術那麼他能給你的薪水或者你工作的內容可能就不那麼重要了。這其中的取捨因人而異..

第一次總結

其實我的面試經驗並不多,在經驗總結上也只能根據自己的想法來了,但是在我面了幾次之後發現面試的很多問題是重複的,也就是可能我這次面試說得不好,但是我總結好下次面試再碰到這個問題我就能從容回答了,我覺得在技術面的時候要多給人一個你是對技術有追求、基礎也很紮實的人,哪怕某些東西你不懂,但是你要給別人感覺你會自己去學,然後去掌握不懂的東西,然後平常週末或者閒的時候可以去學學新的東西,我在面試的時候對某些技術可以說是一臉萌幣的,但是我過後有時間肯定是去了解的,技術日新月異,人也要與時俱進才得,畢竟程式設計師不進步很容易就被淘汰了,最後我覺得面試成功的關鍵在於跟面試官在技術上擦出火花,這樣工作就比較好拿到了,如果碰到不懂技術的面試官..,這個就沒什麼好說的了,這種就很好過了,因為在技術層面來說,我們跟他是不一樣量級的…

第二次前言

昨天(2016.9.22)第一次當面試官面試別的Android程式設計師,因為角色的轉換髮現一些問題,突然想總結一下當面試官的一些體會(其實是想吐槽 - -!),所以就續寫了這篇文章。面試的回答是我想問的原因有些問題我不記得當時面試者是怎麼回答得,但是我寫了我為什麼問和要是回答了我會怎麼問。當時我問問題時比較隨意,文章也寫得比較隨意,輕噴..

面試者一

面試結果:不通過
一些廢話:這是我當面試官第一次面試的人啊,我多希望是個美女啊,因為第一次會銘記在心有沒有!!!但是沒錯,是個男的…講真,他最後說期望這個薪水的時候我是抗拒的,我終於知道為什麼Android市場越來越不景氣了,因為市場全被搞壞了啊..通過面試以我直觀接觸(雖然不夠了解或者片面)他的能力跟這個期望薪水存在一定(蠻大..)的差距,我不知道他為什麼最後會說出這個價格,他是覺得我問他的問題回答得很好還是很自信啊,我過後一直疑惑..

面試過程

上來開場白肯定是叫他自我介紹了(具體可以參考上面的流程(套路)),我想了解的無非就是你是哪裡的,原來在哪裡工作,是搞Android不,開發的app型別(雖然簡歷上有),當然最後說點客套話更好。其實這時候語氣自然點最好了。
由於第一次面試,我也不知道問點什麼,就想照著他簡歷細問點東西,但是我發現他連簡歷寫的東西都沒弄明白,我下面記錄下大概問的問題;
Q、你用什麼網路框架跟伺服器互動
PS:問這個問題是因為我見他幾個app都寫的xUtils並沒有用到別的框架,這是讓我很疑惑的事,因為照一個兩年開發廣州經驗的程式設計師來說,不應該只使用了這一種框架,也不應該較多的使用這種聚合型框架,因為大而全就是這些框架的問題,xUtils的四個模組看似很全,但是就是因為全它們的耦合性也就高了,直觀點就從github上的星星也可以看出來,xUtils是兩千多顆吧,但是同樣的聯網框架okhttp是一萬四千多顆,但是也有種可能,公司上頭決定的,經過自己閹割後使用,這樣也說得過去,當然也不是說就不能用xUtils,以上是個人看法,然後我大概也知道他會說xUtils。
Q、你用過別的框架嗎
“沒有…”對,沒錯,你沒看錯,就是說沒有,然後我問okhttp你聽說過嗎,“沒有…”對,真的是沒有…我當時覺得我不知道該怎麼問了,因為再問也覺得是浪費大家時間,畢竟你寫了兩年工作經驗,我不知道怎麼問了,我要是問市面上有很多其他優秀的框架為什麼不去學習我也怕他回答得很尷尬,所以為了避免這個問題我就問了點簡單的緩解氣氛。
Q、你說下Activity的生命週期吧
我當時就想這個問題都回答不出來就說不過去了吧,但是他回答是回答了,把幾個生命週期都說出來了,但是我還是不怎麼滿意,我希望的是結合實際說一下而不是把方法背出來,舉個栗子你可以這樣回答:當我按home鍵的時候會回撥什麼方法,然後當我從後臺返回這個Activity的時候又回撥什麼方法。本來我還想接著Activity問下比如異常情況下儲存狀態跟橫豎屏時生命週期會怎樣,要是回答好了我可能還會接著問Activity啟動流程,四種啟動模式什麼的,但是回答我不是很滿意也就沒問下去。
Q、知道Android的訊息機制嗎
這個問題要是回答不知道我就尷尬了,但是幸好他回答知道,然後說了下大概的使用,然後我覺得他是懂的,所以我就想問他下實現原理,他不知道怎麼回答支支吾吾,然後我也沒問下去,這個問題他要是能把Handler及其附帶的MessageQueue、Looper以及Message的工作流程說個大概我可能會接著問他原始碼實現,其實正常來說能回答到第二層也就可以了,原始碼層不理解也沒什麼,但是第二層沒回答上來我也就沒問下去,不過也不要緊,看他期望薪水了。
Q、看你簡歷寫了熟練掌握MVC架構那你能跟我說說它是什麼嗎
其實我疑惑的是他只寫了MVC並沒有寫MVP,從Android角度來說如有真要用這兩種架構,MVP比MVC更適合開發,甚至說MVC不適合Android開發,原因上文大概說了下。然後它跟我說了下MVC但是並沒有說清楚,我問他用過MVC架構開發過專案過嗎,他說用過,然後我問他覺得怎樣,他說不錯..然後我說知道MVP嗎,他說不知道,當時我對他已經五體投地了..也就沒接著問下去,再問也是尷尬。

Q、瞭解Android事件分發機制嗎
這個問題其實是消耗時間的,畢竟總不能面試個十分鐘就說回去等通知吧,其實到這裡我已經沒什麼興趣問下去了,所以他回答什麼我也都無所謂了,但是他說了解,但是又說不清..

面試者二

面試結果:等待領導決定
一些廢話:這次面試其實我也不是很滿意,但是開的薪水對於公司來說相對合理,領導面的時候覺得他還可以,打算看看下週有沒有更合適的再考慮。

面試過程

Q、自我介紹
肯定以這個開始..
Q、說說Activity生命週期吧
然後就是圍繞Activity問了一系列問題,回答得一般吧
Q、平常專案中使用過多程序嗎
這個問題回答是與否都無所謂因為要是你說用過我會問為什麼用然後問你多程序,回答沒用過我也會問你瞭解過多程序嗎,要是回答瞭解會接著問跨程序通訊的幾種方式,當然你要是說沒用過也不知道多程序我也就不問了..
Q、瞭解自定義View嗎
這個問題你要是回答不瞭解我就得等期望薪水來談了..要是說了解接著問view的繪製流程、滑動原理 、滑動衝突時怎麼解決

還有蠻多懶得寫了…….

面試者三

面試結果:不通過
一些廢話:其實我很想吐槽這個同學的,態度實在是差,首先昨天面試的人很多,然後他就等了大概十分鐘吧,然後態度是各種差,有個人先來的,然後就先面試第二個人了,然後他也跟著出去,然後就叫他先回去等下,他居然問了要等多久..還是態度很不耐煩的..昨天下班我跟一個同事走路去地鐵站,當時他就說當時叫那個人別跟出去在辦公室等等,那個人沒理他..他就說那個人難相處,然後面試過程我覺得我跟他角色是不是互換了..感覺我的態度都比他好了不知道多少個檔次啊..而且我去,兩年工作經驗,也是隻用過xUtils,okhttp是什麼也不知道,一些淺顯的基礎問題也回答不出,我當時就無語了啊,而且還一臉拽樣問我們公司是不是外包公司,他是不可能去外包公司的,注意啊,是“不可能”啊,是態度很堅定的,然後我說我們不是外包公司,而且全程一臉大神樣啊..但是技術是個渣啊..然後我們領導過後也跟我說覺得他態度很差,不考慮他,我其實不知道他為什麼戾氣這麼重啊..真的是,最後象徵性談了下然後最後問他還有什麼問題,他居然說我還有最後一個問題:他不考慮我們公司了,可以把他的簡歷還給他嗎,我當時就嗶了狗了,感覺一口老血要吐出來了,他不考慮我們我們也沒考慮過他啊,他是哪裡來的自信..還有居然很拽的拿回簡歷啊..我去啊,頓時感覺世界真奇妙啊,真心什麼人都有啊..我自認我待人什麼的都是很友善的..問問題的方式也是很愉快的,就算某些不會我也不會表現出來什麼表情,但是我實在想不通為什麼他這樣..

第二次總結

其實昨天面試的感覺都不是很滿意,特別第三個,技術渣也就算了,情商還低..也是服,不過我覺得現在Android市場人員真是參差不齊,我們公司開的薪水是比較高的,我以為會可以篩選掉一些人,但是面了之後發現我想得太多了,第一個的簡歷寫專案的時候居然敢寫幾百萬下載量的app啊,而且人家是北京的公司他寫自己在深圳工作的啊..而且公司名都不對..也是真敢寫..還有對一些本該瞭解的東西卻不瞭解, 然後情商很重要!!情商很重要!!情商很重要!!重要的事說三遍,倒不是說情商要多高,就是你至少跟人相處沒問題吧,別說什麼程式設計師不懂表達,不懂表達跟態度惡劣是兩回事..你說我們之前不認識但是至少在短暫面試的時候你至少得態度和悅點跟我相處吧..對了,還有簡歷千萬別留QQ郵箱…
回到總結,其實我也是第一次面試別人,問的問題也很隨意,上面的問題也不是問的全部問題,其實還有蠻多,只是我覺得來來去去都是這些問題就懶得寫了,我覺得有些公司的面試官可能也跟我類似吧,先問些淺的問題,然後看你回答,然後圍繞這個問題細問些東西,看你回答到什麼層面。其次面試官的主觀意識很重要,所以回答的時候儘量自信自然,態度好點,不是說要笑嘻嘻但是至少得給人一種友善的意圖吧,寫到這裡我也不知道寫了什麼..我希望看到我這篇文章的人可以從中得到些許收穫,至於裡面有些言語不當的看看也就過了別當真(微笑臉)。