1. 程式人生 > >Android面試題4

Android面試題4

61.JNI怎樣用

JNI是JAVA標準平臺中的一個重要功能,它彌補了JAVA的與平臺無關這一重大優點的不足,在JAVA實現跨平臺的同時,也能與其它語言(如C、C++)的動態庫進行互動,給其它語言發揮優勢的機會。

Java Native Interface (JNI)標準是Java平臺的一部分, JNI 是本地程式設計介面,它使得在 Java 虛擬機器 (VM) 內部執行的 Java 程式碼能夠與用其它程式語言(如 C、C++ 和組合語言)編寫的應用程式和庫進行互動操作。

作用:它允許Java程式碼和其他語言寫的程式碼進行互動。

優缺點:大大提高程式的效能,但是卻破壞了Java的可移植性,也對Java的安全帶來了一定的隱患。

62.廣播的兩種註冊方式

 

1)動態註冊/非常駐型註冊/在程式碼中進行註冊:應用程式關閉後不能再接受廣播資訊

在應用程式的程式碼中註冊
註冊BroadcastReceiver: registerReceiver(receiver, filter);
取消註冊BroadcastReceiver: unregisterReceiver(receiver);

2)靜態註冊/常駐型註冊/Manifast.xml中註冊:應用程式關閉後廣播接收器仍能接受廣播資訊

在AndroidManifest.xml的application裡面定義receiver並設定要接收的action,程式中的核心程式碼示例:

Intent intent = new Intent();

intent.setAction(Intent.ACTION_EDIT);

sendBroadcast(intent);

 

63.android中Serializable和Parcelable的聯絡?

相同點:都是Android中自定義物件的序列化

不同點:

1) Serializable序列化時會產生大量的臨時變數,因而頻繁呼叫GC,

使用記憶體時Parcelable比Serializable效能高

2) Parcelable不能使用在要將資料儲存在磁碟上的情況,因為Parcelable不能很好的保證資料的持續性在外界有變化的情況下。儘管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議用Serializable

3) Serializable 的實現,只需要繼承  implements Serializable 即可

 Parcelabel 的實現,需要在類中實現實現writeToParcel、describeContents函式以及靜態成員變數 CREATOR,這個變數需要繼承 Parcelable.Creator 介面

  1. Serializable的作用是為了儲存物件的屬性到本地檔案、資料庫、網路流、rmi以方便資料傳輸,當然這種傳輸可以是程式內的也可以是兩個程式間的。而Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程式內不同元件間以及不同Android程式間(AIDL)高效的傳輸資料而設計,這些資料僅在記憶體中存在,Parcelable是通過IBinder通訊的訊息的載體。

64.一個應用中有多少個Context?

1、建立Application 物件時, 而且整個App共一個Application物件

2、建立Service物件時

3、建立Activity物件時

所以總Context例項個數 = Service個數 + Activity個數 + 1(Application對應的Context例項)

 

65.AsyncTask與使用執行緒處理耗時操作的優劣是?

AsyncTask:就是一個執行緒池,呼叫簡單快捷,過程可控,操作靈活,但是更佔用系統資源

需要多個非同步操作並需要UI變更時就會變得複雜,如果非同步任務的資料特別龐大,

AsyncTask這種執行緒池結構的優勢就體現出來了

Thread:涉及到Looper,Thread,Handler,message結構清晰,功能定義明確,對於多個非同步任務簡單

Handler和Looper機制,它們均基於訊息實現,有時可能訊息佇列阻塞或其他原因無法準確的使用

 

66.談談你對Android事件分發機制的理解?

當你點選了某個控制元件,首先會去呼叫該控制元件所在佈局的dispatchTouchEvent方法,然後在佈局的dispatchTouchEvent方法中找到被點選的相應控制元件,再去呼叫該控制元件的dispatchTouchEvent方法。

 

67.談談你對ZYGOTE程序的理解和認識?

Zygote(英文意思: 孵化)是一個簡單的典型C/S結構。其他程序作為一個客服端向Zygote發出請求,Zygote接收到命令就”孵化”出一個Activity程序來。

Zygote系統程式碼組成及其呼叫結構:

Zygote.java提供訪問Dalvik “zygote”的介面。主要是包裝Linux系統的Fork,以建立一個新的VM例項程序。

ZygoteConnection.javaZygote的套介面連線管理及其引數解析。其他Actvitiy建立程序請求是通過套介面傳送命令引數給Zygote。

ZygoteInit.javaZygote的main函式入口。

68.第三方註冊及登陸怎麼實現的?

所謂的第三方登入,就是利用使用者在第三方平臺上已有的賬號來快速完成自己應用的登入或者註冊的功能。

要資料,不要功能:

 1、使用者觸發第三方登入事件

 2、showUser(null)請求授權使用者的資料(這個過程中可能涉及授權操作)

 3、如果onComplete()方法被回撥,將其引數Hashmap代入你應用的Login流程

 4、否則提示錯誤,呼叫removeAccount()方法,刪除可能的授權快取資料

 5、Login時客戶端傳送使用者資料中的使用者ID給服務端

 6、服務端判定使用者是已註冊使用者,則引導使用者進入系統,否則返回特定錯誤碼

 7、客戶端收到“未註冊使用者”錯誤碼以後,代入使用者資料到你應用的Register流程

 8、Register時在使用者資料中挑選你應用的註冊所需欄位,並提交服務端註冊

 9、服務端完成使用者註冊,成功則反饋客戶端引導使用者進入系統

 10、否則提示錯誤,呼叫removeAccount()方法,刪除可能的授權快取資料

 

要功能,不要資料:

1、使用者觸發第三方登入事件

 2、呼叫platform.getDb().getUserId()請求使用者在此平臺上的ID

 3、如果使用者ID存在,則認為使用者是合法使用者,允許進入系統;否則呼叫authorize()

 4、authorize()方法將引導使用者在授權頁面輸入帳號密碼,然後目標平臺將驗證此使用者

 5、如果onComplete()方法被回撥,表示授權成功,引導使用者進入系統

 6、否則提示錯誤,呼叫removeAccount()方法,刪除可能的授權快取資料

 

69.Fragment怎麼實現的?

繼承Fragment類,重寫生命週期方法,主要的不同之處就是需要重寫一個onCreateView()方法來返回這個Fragment的佈局

在Activity中你可以通過getFragmentManager()來獲得Fragment物件,然後通過FragmentManager物件的beginFragmentTransaction()方法來獲得FragmentTransaction物件。通過它的add()方法來新增一個Fragment到當前的Activity中。

一個FragmentTransaction物件可以執行多個增刪修的方法,如果你想把這些修改提交到Activity上,必須在最後呼叫一下這個物件的commit()方法

兩個單獨的Fragment之間是不應該進行通訊的。應該使用他們所存在的Activity作為溝通的紐帶。

為了實現兩個Fragment的互動,您可以在Fragment中定義一個介面,然後再這個介面中定義一個方法,在Fragment的onAttach()方法中呼叫這個介面中的方法。然後讓Activity實現這個方法來完成Activity和Fragment之間的通訊

可以通過FragmentManager的findFragmentById()來查詢一個Fragment

 

70.快取怎麼實現的?

快取可分為二大類:  

一、通過檔案快取,

顧名思義檔案快取是指把資料儲存在磁碟上,不管你是以XML格式,序列化檔案DAT格式還是其它檔案格式;

二、記憶體快取,也就是實現一個類中靜態Map,對這個Map進行常規的增刪查下面為一個簡單的快取程式碼

三. 大資料量的快取肯定還是要儲存到檔案,這裡當然要用到第三方開源框架來實現了,常用的有Oscache,Ehcache,Jcache,Jbosscache等等很多

 

71.解析XML PULL解析?

pull解析同樣基於事件驅動型,android 官方API提供,可隨時終止,呼叫next() 方法提取它們(主動提取事件)

Pull解析器執行方式與SAX相似。它提供了類似的事件,如 開始元素事件, 結束元素事件。使用 parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值程式碼被髮送,因此可以使用一個 switch對感興趣的事件進行選擇處理。當元素開始解析時,呼叫 parser.nextText()可以獲得下一個Text型別元素的值。

 

72.分享用的什麼平臺?

讓應用裡新增第三方分享,主要是騰訊微博與新浪微博、人人網,但是很麻煩。推薦使用友盟第三方開放平臺,平臺很好,它裡面的功能非常多,比如什麼渠道分享,問卷調查,異常檢視,軟體更新等···

 

73.橫豎屏切換

1. 在AndroidManifest.xml中為Activity設定configChanges屬性,

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name=".MainActivity"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">

<intent-filter>

  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

configChanges有如下選項:  1. orientation :螢幕在縱向和橫向間旋轉,  2. keyboardHidden:鍵盤顯示或隱藏 ,3.fontScale:使用者變更了首選的字型大小   4.locale : 使用者選擇了不同的語言設定,5.  keyboard :鍵盤型別變更,例如手機從12鍵盤切換到全鍵盤   6. touchscreen或navigation:鍵盤或導航方式變化,

如果缺少了keyboardHidden選項 不能防止Activity的銷燬,並且在之後提到的onConfigurationChanged事件中 只能捕獲豎屏變橫屏的事件 不能捕獲橫屏變豎屏

2. 在對應的Activity中重寫:onConfigurationChanged 方法:

public class MainActivity extends Activity {

    private TextView textView;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Log.i("--Main--", "onCreate");

        textView=(TextView)findViewById(R.id.tv_id);

    }

    @Override

    public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

        Log.i("--Main--", "onConfigurationChanged");

        if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

            textView.setText("當前螢幕為橫屏");

        }else{

            textView.setText("當前螢幕為豎屏");

        }

    }

}

 

74. 高併發業務請求處理方法

高併發業務請求處理方法,涉及即時通訊領域。所述方法包括步驟:將業務請求和目的IP壓入客戶端的分組訊息佇列;根據所述目的IP,將所述業務請求壓入所述分組訊息佇列的資料儲存模組的子訊息佇列中;將所述子訊息佇列中的多個業務請求,在所述分組訊息佇列的網路處理模組中,合併成一個網路請求後傳送給所述目的IP對應的伺服器。本發明的高併發業務請求處理方法,通過設定分組訊息佇列,首先將業務請求按照目的IP進行分組,然後將同組的業務請求合併成網路請求後再發送給伺服器。從而,減少了網路請求次數,提高了對業務請求的處理效率,節省客戶端和伺服器記憶體。 

 

75.Android中如何設定兩個應用程式為同一個程序?

1.在<manifest>裡面新增: android:sharedUserId,注意這個屬性的取值必須包含點(dot),也就是諸如java packae的形式。比如com.aaa.bbb。沒有dot的話,將來adb install xxx.apk就會出錯:Failure [INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID]。最暈死的就是這一點在Android文件中沒有提到,感謝萬能的google賜予了我答案。所有application都要填寫的一樣。

2.在<manifest>裡面新增:android:sharedUserLabel="@string/shared_user_label",這個label必須是一個string資源,不能是raw string。所有application都要填寫的一樣。

3.在<application>裡面新增:android:process="xxx.xxx.xxx",這裡所有的application都要填寫的一樣,內容就是process的名字,一般來說Android中process的名字就是manifest中的package的取值。

4.所有的application用同樣的一個key來sign。如果用Eclipse ADT plugin開發,由於所有的application都使用同一個debug key來sign,所以這一步沒有什麼額外的工作。更具體的有關sign apk的細節,參考Android文件:http://androidappdocs.appspot.com/guide/publishing/app-signing.html

 

76.手機適配怎麼做?

在多平臺適配中遵循如下原則

1)  客戶端的設計規範應該以平臺規範為基礎

2)  在多平臺中,品牌標識,包括logo,視覺風格,核心功能點等等應保持統一。

3)  更多地與平臺的特性相融合,運用平臺提供的特色功能,來減少使用者的輸入或者其他體驗提升點。如拍照輸入,感測器的使用等。

其他需要注意的問題:

1)  移動的特性決定了手機訊號的強弱不均,如何處理在弱訊號下的設計?

2)  需要考慮在斷網情況下,如何快速恢復中斷?

3)  如何設計手機推送的問題?

4)  如何儘量避免手機的固有限制,如螢幕小,輸入不方便,電源緊張等?

5)  如何儘量通過手機的特有特性來提升體驗,如各類感測器,聲音提示等?

Android系統採用以下方法來實現應用介面的自動適配:  

1)佈局檔案中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣可以保證在螢幕上面展示的時候有合適的大小  

2)畫素單位都使用DIP,文字單位使用SP  

3)為不同螢幕密度的手機,提供不同的點陣圖資源,可以使得介面清晰無縮放。  

對應bitmap 資源來說,自動的縮放有時會造成放大縮小後的影象變得模糊不清,這是就需要應用為不同螢幕密度配置提供不同的資源:為高密度的螢幕提供高清晰度的影象等。  

  1. 儘量不要使用AbsoluteLayout

 

77. 手機測試包括哪些?

手機測試是一個很大的題目,涉及到硬體測試和軟體測試,還有結構的測試,比如抗壓,抗摔,抗疲勞,抗低溫高溫等。

硬體測試一般都有嚴格的物理電氣指標,也有專門的 儀器一般都有明確的指標,相應的測試用例,嚴格的操作規程,還有各種儀器,一定的測試軟體

手機測試,一般是指軟體測試

軟體測試有:

整合版上的IT測試,對日的事業者測試,ST(系統)測試,還有協議測試(一般針對3G手機的多媒體畫質和視訊電話),底層的基站相關的測試,各種外聯裝置(電壓,電流,模擬器)相關的測試。還就是FT,FT大多數翻譯成場測。

每一種測試的流程都是不同的。

但是基本的流程如下:

1.測試需求分析

2.測試計劃/測試用例書寫

3.測試環境搭建,測試資料準備以及測試執行

4.測試反饋。一般指測試過程中發現異常,進行缺陷分析定位,然後和相關的開發人員進行對應,最後促使問題得到解決的過程。(測試faxianbug->評估提交bug->開發人員bug定位解決,與開發人員針對bug進行溝通,再現->bug修復之後的再測試,確定bug修復。)

5.測試專案結束後的總結分析(有的是沒有這個環節的)

6.迴歸測試,所有測試結束之後,在版本提交之前必須進行的。

測試過程中很注重的幾點是

第一,要理解需求,不理解需求,不明白功能,測試無從談起。

第二,設計測試用例要用心到位,測試是設計出來的,不是憑空臆測的。

第三,測試過程中的溝通和報告。包括自己不懂得業務,如何去向成手或者Leader學習業務,包括測試過程中對於不明白的功能的理解,不正常的現象的分析,bug提交前後和開發人員之間的交流等。

78.Http中get和post的區別?

1. get是從伺服器上獲取資料,post是向伺服器傳送資料。
2. get是把引數資料佇列加到提交表單的ACTION屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。使用者看不到這個過程。
3. 對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。
4. get傳送的資料量較小,不能大於2KB。post傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
5. get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。

 

79.側滑怎麼實現的?

 側滑選單實現方式有多種 具體自己專案裡面用到的方法

思路:a.自定義ViewGroup ,重寫建構函式,重寫onLayout()方法 對三個選單頁面重新排布

      b.通過重寫onTouchEvent方法,通過onSrcoll 使三個選單頁面左右切換

答:實現側滑的步驟:

  要實現ViewPager+Fragment的滑動效果,必須繼承FragmentActivity,同時要

給ViewPager設定Adapter。由於ViewPager上面要載入Fragment(需要繼承Fragment

類),所以不是過載PagerAdapter,而是重寫FragmentPagerAdapter類

  寫好了adapter,在主函式的onCreate()函式裡面初始化ViewPager,同時給

它配置adapter和設定滑動事件監聽(這需要實現OnPageChangeListener介面)

  接下來要做的就是在onCreate()裡面初始化RadioButton,並給它設定

OnClickListener監聽點選事件

最後就是實現側滑出左邊頁面的效果,這裡使用了開源元件SlidingMenu,

SlidingMenu元件重寫了Activity、FragmentActivity、RelativeLayout等,要實現側滑

效果,可以把主函式繼承的FragmentActivity改成SlidingFragmentActivity,也可以

去在xml佈局檔案裡面直接設定

80.UDP和TCP的區別?

TCP是基於連線的協議,也就是說,在正式收發資料前,必須和對方建立可靠的連線。

UDP它是面向非連線的協議,它不與對方建立連線,而是直接就把資料包傳送過去! 用於傳輸少量資料(資料包模式).

TCP可靠性高更安全,UDP不安全但速度快