騰訊SNG01電話面試

1、activity四種啟動(dòng)模式,singleTask啟動(dòng)模式是如何,以及應(yīng)用場景?

答:singleTask:棧內(nèi)復(fù)用模式。這是一種單實(shí)例模式,在這種模式下,只要Activity在一個(gè)棧中存在,那么多次此Activity都不會(huì)重新創(chuàng)建實(shí)例,同時(shí)它的onNewIntent被調(diào)用,并且處于此Activity任務(wù)棧以上的Activity全部出棧。singleTask適合作為程序入口點(diǎn),例如瀏覽器的主界面或者是桌面懸浮框。

2、算法面試題:如何在一堆數(shù)字中快速找到出現(xiàn)次數(shù)最多的一個(gè)?

答:

/** 找出一個(gè)數(shù)組中一個(gè)數(shù)字出現(xiàn)次數(shù)最多的數(shù)字 * 用HashMap的
key來存放數(shù)組中存在的數(shù)字,value存放該數(shù)字在數(shù)組中出現(xiàn)的次數(shù) 
*/
public static void findMaxNumber(){  
  int[] array = {2, 1, 2, 3, 4, 5, 2, 2, 2, 2};    
  //map的key存放數(shù)組中存在的數(shù)字,value存放該數(shù)字在數(shù)組中出現(xiàn)的次數(shù)    
  HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();   
  for(int i = 0; i < array.length; i++)    { 
     if(map.containsKey(array[i])){    
        int temp = map.get(array[i]);            
        map.put(array[i], temp + 1);       
     } else{            
        map.put(array[i], 1);        
     }  
  }    
  Collection<Integer> count = map.values();   
  //找出map的value中最大的數(shù)字,也就是數(shù)組中數(shù)字出現(xiàn)最多的次數(shù)
  int maxCount = Collections.max(count);    
  int maxNumber = 0;   
  for(Map.Entry<Integer, Integer> entry : map.entrySet())    {     
    //得到value為maxCount的key,也就是數(shù)組中出現(xiàn)次數(shù)最多的數(shù)字
    if(maxCount == entry.getValue()) {   
         maxNumber = entry.getKey();        
    }   
  }   
  Log.i(TAG,"出現(xiàn)次數(shù)最多的數(shù)字為:" + maxNumber);    
  Log.i(TAG,"該數(shù)字一共出現(xiàn)" + maxCount + "次");}

3、UDP和TCP區(qū)別和用途

答:
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要經(jīng)過三次“對(duì)話”才能建立起來,其中的過程非常復(fù)雜,我們這里只做簡單、形象的介紹,你只要做到能夠理解這個(gè)過程即可。我們來看看這三次對(duì)話的簡單過程:主機(jī)A向主機(jī)B發(fā)出連接請(qǐng)求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎?”,這是第一次對(duì)話;主機(jī)B向主機(jī)A發(fā)送同意連接和要求同步(同步就是兩臺(tái)主機(jī)一個(gè)在發(fā)送,一個(gè)在接收,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以,你什么時(shí)候發(fā)?”,這是第二次對(duì)話;主機(jī)A再發(fā)出一個(gè)數(shù)據(jù)包確認(rèn)主機(jī)B的要求同步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對(duì)話。三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過三次“對(duì)話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)。

UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去!
UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。比如,我們經(jīng)常使用“ping”命令來測(cè)試兩臺(tái)主機(jī)之間TCP/IP通信是否正常,其實(shí)“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來,那么網(wǎng)絡(luò)就是通的。例如,在默認(rèn)狀態(tài)下,一次“ping”操作發(fā)送4個(gè)數(shù)據(jù)包。大家可以看到,發(fā)送的數(shù)據(jù)包數(shù)量是4包,收到的也是4包(因?yàn)閷?duì)方主機(jī)收到后會(huì)發(fā)回一個(gè)確認(rèn)收到的數(shù)據(jù)包)。這充分說明了UDP協(xié)議是面向非連接的協(xié)議,沒有建立連接的過程。正因?yàn)閁DP協(xié)議沒有連接的過程,所以它的通信效果高;但也正因?yàn)槿绱耍目煽啃圆蝗鏣CP協(xié)議高。

4、線程的優(yōu)先級(jí)?如何防止servie被殺死?

答:
對(duì)于Android平臺(tái)上的線程優(yōu)先級(jí)設(shè)置來說可以處理很多并發(fā)線程的阻塞問題,比如很多無關(guān)緊要的線程會(huì)占用大量的CPU時(shí)間,雖然通過了MultiThread來解決慢速I/O但是合理分配優(yōu)先級(jí)對(duì)于并發(fā)編程來說十分重要。Android在線程方面主要使用的是Java本身的Thread類,我們可以在Thread或Runnable接口中的run方法首句加入Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //設(shè)置線程優(yōu)先級(jí)為后臺(tái),這樣當(dāng)多個(gè)線程并發(fā)后很多無關(guān)緊要的線程分配的CPU時(shí)間將會(huì)減少,有利于主線程的處理,相關(guān)的Thread優(yōu)先級(jí)Android平臺(tái)專有的定義羅列有以下幾種:

int THREAD_PRIORITY_AUDIO //標(biāo)準(zhǔn)音樂播放使用的線程優(yōu)先級(jí)

int THREAD_PRIORITY_BACKGROUND //標(biāo)準(zhǔn)后臺(tái)程序

int THREAD_PRIORITY_DEFAULT // 默認(rèn)應(yīng)用的優(yōu)先級(jí)

int THREAD_PRIORITY_DISPLAY //標(biāo)準(zhǔn)顯示系統(tǒng)優(yōu)先級(jí),主要是改善UI的刷新

int THREAD_PRIORITY_FOREGROUND //標(biāo)準(zhǔn)前臺(tái)線程優(yōu)先級(jí)

int THREAD_PRIORITY_LESS_FAVORABLE //低于favorable

int THREAD_PRIORITY_LOWEST //有效的線程最低的優(yōu)先級(jí)

int THREAD_PRIORITY_MORE_FAVORABLE //高于favorable

int THREAD_PRIORITY_URGENT_AUDIO //標(biāo)準(zhǔn)較重要音頻播放優(yōu)先級(jí)

int THREAD_PRIORITY_URGENT_DISPLAY //標(biāo)準(zhǔn)較重要顯示優(yōu)先級(jí),對(duì)于輸入事件同樣適用

通過以上關(guān)于線程優(yōu)先級(jí)的分析,可采用通過鬧鐘(AlertManager) 定時(shí)喚醒,觸發(fā)onStartCommond方法,從而服務(wù)進(jìn)程不被殺死

5、Http方式下載圖片資源,如何解決手機(jī)提供商訪問劫持?

答:
通過在Http Header頭中設(shè)置標(biāo)識(shí)信息,如token或者文件名稱或文件MD5值,從而識(shí)別當(dāng)前下載的圖片,是否為目標(biāo)文件,這種做法也可以用在頭像的動(dòng)態(tài)更新。

6、如何防止網(wǎng)頁代碼挾持,如字符串javascript:alert("hello");

答:面試題目沒有理解清楚,無法作答

7、TCP如何防止消息體阻塞?

答:發(fā)送消息體后,再收到ack消息回執(zhí)后,在發(fā)送第二個(gè),從而保證消息發(fā)送在網(wǎng)絡(luò)不是很好的情況下,出現(xiàn)消息阻塞現(xiàn)象。

8、android里面main函數(shù)入口?

答:每個(gè)應(yīng)用啟動(dòng),zygote進(jìn)程的ZygoteInit()方法創(chuàng)建的一個(gè)新進(jìn)程,即ActivityThread(UI主線程),同時(shí)執(zhí)行main函數(shù)。而main函數(shù)的入口,則對(duì)于的是Androidmanifest.xml注冊(cè)<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />的activity。

9、簡述常用設(shè)計(jì)模式

答:觀察者模式和策略模式。

10、ListView的優(yōu)化方式?

答:通過新建靜態(tài)ViewHolder類,contentView.setTag()方式復(fù)用布局,從而減少內(nèi)存開銷,圖片加載則可以采用facebook的fresco框架,可以避免應(yīng)用OOM。

11、用過哪些android內(nèi)存分析工具?

答:Memory Monitor、Allocation Tracking、Heap Tool 與 MAT、LeakCanary(開源項(xiàng)目)。

12、Handler和Message的區(qū)別和聯(lián)系?

答:
Handler簡介:
一個(gè)Handler允許你發(fā)送和處理Message和Runable對(duì)象,這些對(duì)象和一個(gè)線程的MessageQueue相關(guān)聯(lián)。每一個(gè)線程實(shí)例和一個(gè)單獨(dú)的線程以及該線程的MessageQueue相關(guān)聯(lián)。當(dāng)你創(chuàng)建一個(gè)新的Handler時(shí),它就和創(chuàng)建它的線程綁定在一起了。這里,線程我們也可以理解為線程的MessageQueue。從這一點(diǎn)上來看,Handler把Message和Runable對(duì)象傳遞給MessageQueue,而且在這些對(duì)象離開MessageQueue時(shí),Handler負(fù)責(zé)執(zhí)行他們。
Handler有兩個(gè)主要的用途:(1)確定在將來的某個(gè)時(shí)間點(diǎn)執(zhí)行一個(gè)或者一些Message和Runnable對(duì)象。(2)在其他線程(不是Handler綁定線程)中排入一些要執(zhí)行的動(dòng)作。
Scheduling Message,即(1),可以通過以下方法完成:
post(Runnable):Runnable在handler綁定的線程上執(zhí)行,也就是說不創(chuàng)建新線程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個(gè)動(dòng)作讓你把Runnable對(duì)象排入MessageQueue,MessageQueue受到這些消息的時(shí)候執(zhí)行他們,當(dāng)然以一定的排序。sendMessage這個(gè)動(dòng)作允許你把Message對(duì)象排成隊(duì)列,這些Message對(duì)象包含一些信息,Handler的hanlerMessage(Message)會(huì)處理這些Message.當(dāng)然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。
當(dāng)posting或者sending到一個(gè)Hanler時(shí),你可以有三種行為:當(dāng)MessageQueue準(zhǔn)備好就處理,定義一個(gè)延遲時(shí)間,定義一個(gè)精確的時(shí)間去處理。后兩者允許你實(shí)現(xiàn)timeout,tick,和基于時(shí)間的行為。
當(dāng)你的應(yīng)用創(chuàng)建一個(gè)新的進(jìn)程時(shí),主線程(也就是UI線程)自帶一個(gè)MessageQueue,這個(gè)MessageQueue管理頂層的應(yīng)用對(duì)象(像activities,broadcastreceivers等)和主線程創(chuàng)建的窗體。你可以創(chuàng)建自己的線程,并通過一個(gè)Handler和主線程進(jìn)行通信。這和之前一樣,通過post和sendmessage來完成,差別在于在哪一個(gè)線程中執(zhí)行這么方法。在恰當(dāng)?shù)臅r(shí)候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。
Message簡介:
Message類就是定義了一個(gè)信息,這個(gè)信息中包含一個(gè)描述符和任意的數(shù)據(jù)對(duì)象,這個(gè)信息被用來傳遞給Handler.Message對(duì)象提供額外的兩個(gè)int域和一個(gè)Object域,這可以讓你在大多數(shù)情況下不用作分配的動(dòng)作。
盡管Message的構(gòu)造函數(shù)是public的,但是獲取Message實(shí)例的最好方法是調(diào)用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會(huì)從回收對(duì)象池中獲取一個(gè)。
MessageQueue簡介:
這是一個(gè)包含message列表的底層類。Looper負(fù)責(zé)分發(fā)這些message。Messages并不是直接加到一個(gè)MessageQueue中,而是通過MessageQueue.IdleHandler關(guān)聯(lián)到Looper。
你可以通過Looper.myQueue()從當(dāng)前線程中獲取MessageQueue。
Looper簡介:
Looper類被用來執(zhí)行一個(gè)線程中的message循環(huán)。默認(rèn)情況,沒有一個(gè)消息循環(huán)關(guān)聯(lián)到線程。在線程中調(diào)用prepare()創(chuàng)建一個(gè)Looper,然后用loop()來處理messages,直到循環(huán)終止。
大多數(shù)和message
loop的交互是通過Handler。

13、對(duì)c++語言的了解?

答:了解c++基本語法,熟悉NDK中java和c++之間的相互調(diào)用。

14、如何理解android中跨進(jìn)程通信?

1、AIDL:定義了客戶端可用的方法和數(shù)據(jù)的接口,另一個(gè)應(yīng)用通過綁定服務(wù),綁定成功后,就可以調(diào)用aidl定義的方法;
2、ContentProvider:內(nèi)容提供者,夸應(yīng)用通過Uri訪問封裝SQLite3增、刪、改、查方法。

15、談?wù)剬?duì)framework層launcher的理解

答:

16、apk中的resource.arsc文件是用來存放什么的?

答:用于存放資源文件,如:drawable,menu,layout,string,attr,color,style。

17、對(duì)于android逆向原生的理解

答:《Android軟件安全與逆向分析》,通過修改smali語句,重新加殼和重新打包,可以防止應(yīng)用信息被劫持或者支付不安全現(xiàn)象。

18、對(duì)于靜態(tài)變量的內(nèi)存回收處理

答:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容